=========================================
 =                                       =
 =  A Kolmogorov-style translation of T  =
 =                                       =
 =========================================

    Chuangjie Xu, July 2019


References.

□ Tarmo Uustalu.  Monad translating inductive and coinductive types.
  In: H. Geuvers, F. Wiedijk (Eds.), Types for Proofs and Programs
  (TYPES 2002). Lecture Notes in Computer Science, vol 2646, Springer,
  2002, pp. 299–315.


\begin{code}

{-# OPTIONS --without-K --safe #-}

open import Tplus

module KolmogorovTranslation
       (J : Ty  Ty)
       (η : {Γ : Cxt} {σ : Ty}  T Γ (σ  J σ))
       (κ : {Γ : Cxt} {σ τ : Ty}  T Γ ((σ  J τ)  J σ  J τ))
 where

⟨_⟩ᴷᵒ ⟨_⟩ : Ty  Ty
 ρ ⟩ᴷᵒ   = J  ρ 
 ι      = ι
 σ  τ  =  σ ⟩ᴷᵒ   τ ⟩ᴷᵒ
 σ  τ  =  σ ⟩ᴷᵒ   τ ⟩ᴷᵒ
 σ  τ  =  σ ⟩ᴷᵒ   τ ⟩ᴷᵒ

⟪_⟫ᴷᵒ : Cxt  Cxt
 ε ⟫ᴷᵒ     = ε
 Γ  ρ ⟫ᴷᵒ =  Γ ⟫ᴷᵒ   ρ ⟩ᴷᵒ

⟨_⟩ᵛ : {Γ : Cxt} {ρ : Ty}   ρ  Γ     ρ ⟩ᴷᵒ   Γ ⟫ᴷᵒ 
 zero ⟩ᵛ   = zero
 succ i ⟩ᵛ = succ  i ⟩ᵛ

infixl 20 _◇_

_◇_ : {Γ : Cxt} {σ τ : Ty}  T Γ (J (σ  J τ))  T Γ σ  T Γ (J τ)
f  a = κ · Lam (ν₀ · wkn a) · f
     -- κ (λ h → h a) f

Rec◇ : {Γ : Cxt} {ρ : Ty}  T Γ (ρ  (J ι  J (J ρ  J ρ))  ι  J ρ)
Rec◇ = Lam (Lam (Rec · (η · ν₁) · Lam (Lam (ν₂ · (η · ν₁)  ν₀))))

infix 60 _ᴷᵒ

_ᴷᵒ : {Γ : Cxt} {ρ : Ty}  T Γ ρ  T  Γ ⟫ᴷᵒ  ρ ⟩ᴷᵒ
Var i ᴷᵒ   = Var  i ⟩ᵛ
Lam t ᴷᵒ   = η · Lam (t ᴷᵒ)
(f · a) ᴷᵒ = f ᴷᵒ  a ᴷᵒ
Zero ᴷᵒ    = η · Zero
Succ ᴷᵒ    = η · (κ · Lam (η · (Succ · ν₀)))
Rec ᴷᵒ     = η · (κ · Lam (η · (κ · Lam (η · (κ · (Rec◇ · ν₁ · ν₀))))))
Pair ᴷᵒ    = η · Lam (η · Lam (η · (Pair · ν₁ · ν₀)))
Pr1 ᴷᵒ     = η · (κ · Pr1)
Pr2 ᴷᵒ     = η · (κ · Pr2)
Inj1 ᴷᵒ    = η · Lam (η · (Inj1 · ν₀))
Inj2 ᴷᵒ    = η · Lam (η · (Inj2 · ν₀))
Case ᴷᵒ    = η · (κ · Lam (η · (κ · Lam (η · (κ · (Case · ν₁ · ν₀))))))

\end{code}