{-# OPTIONS --with-K --rewriting #-}
module STT.SSC where
open import STT.Lib
infixr 0 _⇒_
data Ty : Set where
ι : Ty
_⇒_ : Ty → Ty → Ty
infixl 2 _▹_
data Con : Set where
◇ : Con
_▹_ : Con → Ty → Con
private variable
Γ Γ₀ Γ₁ Δ : Con
A A₀ A₁ B : Ty
data Var : Con → Ty → Set where
vz : Var (Γ ▹ A) A
vs : Var Γ B → Var (Γ ▹ A) B
postulate
Tm : Con → Ty → Set
infixl 10 _⁺
data Sub : Con → Con → Set where
p : Sub (Γ ▹ A) Γ
_⁺ : Sub Δ Γ → Sub (Δ ▹ A) (Γ ▹ A)
⟨_⟩ : Tm Γ A → Sub Γ (Γ ▹ A)
private variable
γ : Sub Δ Γ
a a₀ a₁ b f : Tm Γ A
x : Var Γ A
postulate
_[_] : Tm Γ A → Sub Δ Γ → Tm Δ A
var : Var Γ A → Tm Γ A
var-p : var x [ p ] ≡ (Tm (Γ ▹ A) B ∋ var (vs x))
vz-⁺ : var vz [ γ ⁺ ] ≡ (Tm (Δ ▹ A) A ∋ var vz)
vs-⁺ : var (vs x) [ γ ⁺ ] ≡ (Tm (Δ ▹ A) B ∋ var x [ γ ] [ p ])
vz-⟨⟩ : var vz [ ⟨ a ⟩ ] ≡ a
vs-⟨⟩ : var (vs x) [ ⟨ a ⟩ ] ≡ var x
app : Tm Γ (A ⇒ B) → Tm Γ A → Tm Γ B
app-[] : app f a [ γ ] ≡ app (f [ γ ]) (a [ γ ])
lam : Tm (Γ ▹ A) B → Tm Γ (A ⇒ B)
lam-[] : lam b [ γ ] ≡ lam (b [ γ ⁺ ])
⇒-β : app (lam b) a ≡ b [ ⟨ a ⟩ ]
⇒-η : f ≡ lam (app (f [ p ]) (var vz))
tm[_,_] : Γ₀ ≡ Γ₁ → A₀ ≡ A₁ → Tm Γ₀ A₀ → Tm Γ₁ A₁
tm[ refl , refl ] a = a
record TmDModel ℓ₀ ℓ₁ : Set (suc (ℓ₀ ⊔ ℓ₁)) where
no-eta-equality
infixl 9 _[_]ᴰ
field
Subᴰ : (Δ Γ : Con) → Sub Δ Γ → Set ℓ₀
Tmᴰ : (Γ : Con) (A : Ty) → Tm Γ A → Set ℓ₁
_[_]ᴰ : Tmᴰ Γ A a → (γᴰ : Subᴰ Δ Γ γ) → Tmᴰ Δ A (a [ γ ])
tmᴰ[_] : a₀ ≡ a₁ → Tmᴰ Γ A a₀ → Tmᴰ Γ A a₁
tmᴰ[_] = subst (Tmᴰ _ _)
field
pᴰ : Subᴰ (Γ ▹ A) Γ p
varᴰ : (x : Var Γ A) → Tmᴰ Γ A (var x)
var-pᴰ :
tmᴰ[ var-p ] (varᴰ x [ pᴰ ]ᴰ) ≡ (Tmᴰ (Γ ▹ A) B (var (vs x)) ∋ varᴰ (vs x))
infixl 10 _⁺ᴰ
field
_⁺ᴰ : (γᴰ : Subᴰ Δ Γ γ) → Subᴰ (Δ ▹ A) (Γ ▹ A) (γ ⁺)
vz-⁺ᴰ :
{γᴰ : Subᴰ Δ Γ γ} →
tmᴰ[ vz-⁺ ] (varᴰ vz [ γᴰ ⁺ᴰ ]ᴰ) ≡ (Tmᴰ (Δ ▹ A) A (var vz) ∋ varᴰ vz)
vs-⁺ᴰ :
{γᴰ : Subᴰ Δ Γ γ} →
tmᴰ[ vs-⁺ ] (varᴰ (vs x) [ γᴰ ⁺ᴰ ]ᴰ) ≡
(Tmᴰ (Δ ▹ A) B (var x [ γ ] [ p ]) ∋ varᴰ x [ γᴰ ]ᴰ [ pᴰ ]ᴰ)
⟨_⟩ᴰ : Tmᴰ Γ A a → Subᴰ Γ (Γ ▹ A) ⟨ a ⟩
vz-⟨⟩ᴰ : {aᴰ : Tmᴰ Γ A a} → tmᴰ[ vz-⟨⟩ ] (varᴰ vz [ ⟨ aᴰ ⟩ᴰ ]ᴰ) ≡ aᴰ
vs-⟨⟩ᴰ : {aᴰ : Tmᴰ Γ A a} → tmᴰ[ vs-⟨⟩ ] (varᴰ (vs x) [ ⟨ aᴰ ⟩ᴰ ]ᴰ) ≡ varᴰ x
field
appᴰ : Tmᴰ Γ (A ⇒ B) f → Tmᴰ Γ A a → Tmᴰ Γ B (app f a)
app-[]ᴰ :
{fᴰ : Tmᴰ Γ (A ⇒ B) f} {aᴰ : Tmᴰ Γ A a} {γᴰ : Subᴰ Δ Γ γ} →
tmᴰ[ app-[] ] (appᴰ fᴰ aᴰ [ γᴰ ]ᴰ) ≡ appᴰ (fᴰ [ γᴰ ]ᴰ) (aᴰ [ γᴰ ]ᴰ)
lamᴰ : Tmᴰ (Γ ▹ A) B b → Tmᴰ Γ (A ⇒ B) (lam b)
lam-[]ᴰ :
{bᴰ : Tmᴰ (Γ ▹ A) B b} {γᴰ : Subᴰ Δ Γ γ} →
tmᴰ[ lam-[] ] (lamᴰ bᴰ [ γᴰ ]ᴰ) ≡ lamᴰ (bᴰ [ γᴰ ⁺ᴰ ]ᴰ)
⇒-βᴰ :
{bᴰ : Tmᴰ (Γ ▹ A) B b} {aᴰ : Tmᴰ Γ A a} →
tmᴰ[ ⇒-β ] (appᴰ (lamᴰ bᴰ) aᴰ) ≡ bᴰ [ ⟨ aᴰ ⟩ᴰ ]ᴰ
⇒-ηᴰ :
{fᴰ : Tmᴰ Γ (A ⇒ B) f} →
tmᴰ[ ⇒-η ] fᴰ ≡ lamᴰ (appᴰ (fᴰ [ pᴰ ]ᴰ) (varᴰ vz))
module TmInd {ℓˢ ℓᵗ} (D : TmDModel ℓˢ ℓᵗ) where
open TmDModel D
postulate
⟦_⟧ : (a : Tm Γ A) → Tmᴰ Γ A a
⟦_⟧ˢ : (γ : Sub Δ Γ) → Subᴰ Δ Γ γ
⟦ p ⟧ˢ = pᴰ
⟦ γ ⁺ ⟧ˢ = ⟦ γ ⟧ˢ ⁺ᴰ
⟦ ⟨ a ⟩ ⟧ˢ = ⟨ ⟦ a ⟧ ⟩ᴰ
postulate
⟦⟧-[] : ⟦ a [ γ ] ⟧ ≡ ⟦ a ⟧ [ ⟦ γ ⟧ˢ ]ᴰ
{-# REWRITE ⟦⟧-[] #-}
⟦⟧-var : ⟦ var x ⟧ ≡ varᴰ x
{-# REWRITE ⟦⟧-var #-}
⟦⟧-app : ⟦ app f a ⟧ ≡ appᴰ ⟦ f ⟧ ⟦ a ⟧
{-# REWRITE ⟦⟧-app #-}
⟦⟧-lam : ⟦ lam b ⟧ ≡ lamᴰ ⟦ b ⟧
{-# REWRITE ⟦⟧-lam #-}