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}