=========================================
 =                                       =
 =  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 T

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
⟨ suc i ⟩ᵛ = suc ⟨ i ⟩ᵛ

infixl 20 _◇_

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

Rec◇ : {Γ : Cxt} {ρ : Ty} → T Γ (ρ ⇾ (J ι ⇾ J (J ρ ⇾ J ρ)) ⇾ ι ⇾ J ρ)
Rec◇ = Lam (Lam (Rec · (η · ν₁) · Lam (Lam (ν₂ · (η · ν₁) ◇ ν₀))))
--   Rec◇(a,f,0) := η(a)
-- Rec◇(a,f,n+1) := f(ηn) ◇ Rec◇(a,f,n)

infix 60 _ᴷᵒ

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

\end{code}