Martin Escardo, Bruno da Rocha Paiva, Ayberk Tosun, and Vincent Rahli, June 2023

Gödel's system T and its standard set-theoretical semantics. This is a
modification of EffectufulForcing.MFPSAndVariations.SystemT, based on
PLFA (https://plfa.github.io/), which avoids lots of transport in the
file Subst.

\begin{code}

{-# OPTIONS --without-K --safe --no-sized-types --no-guardedness --auto-inline #-}

module EffectfulForcing.Internal.SystemT where

open import MLTT.Spartan  hiding (rec ; _^_)
open import EffectfulForcing.MFPSAndVariations.Combinators
open import EffectfulForcing.MFPSAndVariations.Continuity
open import EffectfulForcing.MFPSAndVariations.SystemT using (type ; ι ; _⇒_ ; 〖_〗)
open import UF.Base using (ap₂ ; ap₃)

\end{code}

We work with vector types which notational grow at the end rather than
the head.  This is because we use vector types to represent contexts,
which traditionally grow at the end:

\begin{code}

_^_ : 𝓤 ̇    𝓤 ̇
X ^ 0        = 𝟙
X ^ (succ n) = X ^ n × X

infixr 3 _^_

data Cxt : 𝓤₀ ̇ where
 〈〉 : Cxt
 _,,_ : Cxt  type  Cxt

infixl 6 _,,_

data ∈Cxt (σ : type) : Cxt  𝓤₀ ̇ where
 ∈Cxt0 : (Γ : Cxt)  ∈Cxt σ (Γ ,, σ)
 ∈CxtS : {Γ : Cxt} (τ : type)  ∈Cxt σ Γ  ∈Cxt σ (Γ ,, τ)

data T : (Γ : Cxt) (σ : type)  𝓤₀ ̇ where
 Zero : {Γ : Cxt}  T Γ ι
 Succ : {Γ : Cxt}  T Γ ι  T Γ ι
 Rec  : {Γ : Cxt} {σ : type}  T Γ (ι  σ  σ)  T Γ σ  T Γ ι  T Γ σ
 ν    : {Γ : Cxt} {σ : type} (i : ∈Cxt σ Γ)   T Γ σ
 ƛ    : {Γ : Cxt} {σ τ : type}  T (Γ ,, σ) τ  T Γ (σ  τ)
 _·_  : {Γ : Cxt} {σ τ : type}  T Γ (σ  τ)  T Γ σ  T Γ τ

infixl 6 _·_

\end{code}

The standard interpretation of system T:

\begin{code}

【_】 : (Γ : Cxt)  𝓤₀ ̇
 Γ  = {σ : type} (i : ∈Cxt σ Γ)   σ 

⟨⟩ :  〈〉 
⟨⟩ ()

_‚_ : {Γ : Cxt} {σ : type}   Γ    σ    Γ ,, σ 
(xs  x) {σ} (∈Cxt0 _) = x
(xs  x) {σ} (∈CxtS _ i) = xs i

infixl 6 _‚_

⟦_⟧ : {Γ : Cxt} {σ : type}  T Γ σ   Γ    σ 
 Zero        _ = 0
 Succ t     xs = succ ( t  xs)
 Rec f g t  xs = rec ( f  xs) ( g  xs) ( t  xs)
 ν i        xs = xs i
 ƛ t        xs = λ x   t  (xs  x)
 t · u      xs = ( t  xs) ( u  xs)

\end{code}

Closed terms can be interpreted in a special way:

\begin{code}

T₀ : type  Type
T₀ = T 〈〉

⟦_⟧₀  : {σ : type}  T₀ σ   σ 
 t ⟧₀ =  t  ⟨⟩

T-definable : {σ : type}   σ   Type
T-definable {σ} x = Σ t  T₀ σ ,  t ⟧₀  x

\end{code}

System T extended with a formal oracle Ω, called T' (rather than TΩ as previously):

\begin{code}

data T' : (Γ : Cxt) (σ : type)  Type where
 Ω    : {Γ : Cxt}  T' Γ (ι  ι)
 Zero : {Γ : Cxt}  T' Γ ι
 Succ : {Γ : Cxt}  T' Γ ι  T' Γ ι
 Rec  : {Γ : Cxt}  {σ : type}  T' Γ (ι  σ  σ)  T' Γ σ  T' Γ ι  T' Γ σ
 ν    : {Γ : Cxt} {σ : type} (a : ∈Cxt σ Γ)   T' Γ σ
 ƛ    : {Γ : Cxt}  {σ τ : type}  T' (Γ ,, σ) τ  T' Γ (σ  τ)
 _·_  : {Γ : Cxt}  {σ τ : type}  T' Γ (σ  τ)  T' Γ σ  T' Γ τ


⟦_⟧' : {Γ : Cxt} {σ : type}  T' Γ σ  Baire   Γ    σ 
 Ω         ⟧' α  _ = α
 Zero      ⟧' _  _ = 0
 Succ t    ⟧' α xs = succ ( t ⟧' α xs)
 Rec f g t ⟧' α xs = rec ( f ⟧' α xs) ( g ⟧' α xs) ( t ⟧' α xs)
 ν i       ⟧' _ xs = xs i
 ƛ t       ⟧' α xs = λ x   t ⟧' α (xs  x)
 t · u     ⟧' α xs = ( t ⟧' α xs) ( u ⟧' α xs)

\end{code}

To regard system T as a sublanguage of T', we need to work with an
explicit embedding:

\begin{code}

embed : {Γ : Cxt} {σ : type}  T Γ σ  T' Γ σ
embed Zero        = Zero
embed (Succ t)    = Succ (embed t)
embed (Rec f g t) = Rec (embed f) (embed g) (embed t)
embed (ν i)       = ν i
embed (ƛ t)       = ƛ (embed t)
embed (t · u)     = (embed t) · (embed u)

preservation : {Γ : Cxt}
               {σ : type}
               (t : T Γ σ)
               (α : Baire)
               t    embed t ⟧' α
preservation Zero        α = refl
preservation (Succ t)    α = ap  f xs  succ (f xs)) (preservation t α)
preservation (Rec f g t) α = ap₃  f g t xs  rec (f xs) (g xs) (t xs))
                             (preservation f α)
                             (preservation g α)
                             (preservation t α)
preservation (ν i)       α = refl
preservation (ƛ t)       α = ap  f xs x  f (xs  x)) (preservation t α)
preservation (t · u)     α = ap₂  f g x  f x (g x))
                             (preservation t α)
                             (preservation u α)
\end{code}

Some shorthands to simplify examples of system T terms.

\begin{code}

numeral : {Γ : Cxt}    T Γ ι
numeral 0        = Zero
numeral (succ n) = Succ (numeral n)

ν₀ : {Γ : Cxt} {σ : type}   T (Γ ,, σ) σ
ν₀ {Γ} {σ} = ν (∈Cxt0 Γ)

ν₁ : {Γ : Cxt} {σ₁ σ₂ : type}  T (Γ ,, σ₁ ,, σ₂) σ₁
ν₁ {Γ} {σ₁} {σ₂} = ν (∈CxtS σ₂ (∈Cxt0 Γ))

ν₂ : {Γ : Cxt} {σ₁ σ₂ σ₃ : type}  T (Γ ,, σ₁ ,, σ₂ ,, σ₃) σ₁
ν₂ {Γ} {σ₁} {σ₂} {σ₃} = ν (∈CxtS σ₃ (∈CxtS σ₂ (∈Cxt0 Γ)))

ν₃ : {Γ : Cxt} {σ₁ σ₂ σ₃ σ₄ : type}  T (Γ ,, σ₁ ,, σ₂ ,, σ₃ ,, σ₄) σ₁
ν₃ {Γ} {σ₁} {σ₂} {σ₃} {σ₄} = ν (∈CxtS σ₄ (∈CxtS σ₃ (∈CxtS σ₂ (∈Cxt0 Γ))))

ν₄ : {Γ : Cxt} {σ₁ σ₂ σ₃ σ₄ σ₅ : type}  T (Γ ,, σ₁ ,, σ₂ ,, σ₃ ,, σ₄ ,, σ₅) σ₁
ν₄ {Γ} {σ₁} {σ₂} {σ₃} {σ₄} {σ₅} = ν (∈CxtS σ₅ (∈CxtS σ₄ (∈CxtS σ₃ (∈CxtS σ₂ (∈Cxt0 Γ)))))

ν₅ : {Γ : Cxt} {σ₁ σ₂ σ₃ σ₄ σ₅ σ₆ : type}  T (Γ ,, σ₁ ,, σ₂ ,, σ₃ ,, σ₄ ,, σ₅ ,, σ₆) σ₁
ν₅ {Γ} {σ₁} {σ₂} {σ₃} {σ₄} {σ₅} {σ₆} = ν (∈CxtS σ₆ (∈CxtS σ₅ (∈CxtS σ₄ (∈CxtS σ₃ (∈CxtS σ₂ (∈Cxt0 Γ))))))

Succ' : {Γ : Cxt}  T Γ (ι  ι)
Succ' {Γ} = ƛ (Succ ν₀)

Rec' : {σ : type} {Γ : Cxt}  T Γ ((ι  σ  σ)  σ  ι  σ)
Rec' {σ} {Γ} = ƛ (ƛ (ƛ (Rec ν₂ ν₁ ν₀)))

\end{code}

Composition operation in System T:

\begin{code}

comp : {Γ : Cxt} {ρ σ τ : type}  T Γ ((σ  τ)  (ρ  σ)  ρ  τ)
comp {Γ = Γ} = ƛ (ƛ (ƛ (ν₂ · (ν₁ · ν₀))))

\end{code}