{-# OPTIONS --with-K --rewriting --postfix-projections #-}
module STT.SSC.SNf where
open import STT.Lib
open import STT.SSC
private variable
Γ Δ : Con
γ : Sub Δ Γ
A B : Ty
a a₀ a₁ b f : Tm Γ A
x : Var Γ A
postulate
NTm : (Γ : Con) (A : Ty) → Tm Γ A → Set
NTm-prop : {aᴺ₀ aᴺ₁ : NTm Γ A a} → aᴺ₀ ≡ aᴺ₁
varᴺ : (x : Var Γ A) → NTm Γ A (var x)
appᴺ : NTm Γ (A ⇒ B) f → NTm Γ A a → NTm Γ B (app f a)
lamᴺ : NTm (Γ ▹ A) B b → NTm Γ (A ⇒ B) (lam b)
private variable
aᴺ bᴺ fᴺ : NTm Γ A a
ntm[_] : a₀ ≡ a₁ → NTm Γ A a₀ → NTm Γ A a₁
ntm[ refl ] aᴺ = aᴺ
record NTmDModel ℓ : Set (suc ℓ) where
no-eta-equality
field
NTmᴰ : (Γ : Con) (A : Ty) (a : Tm Γ A) → NTm Γ A a → Set ℓ
NTmᴰ-prop : {aᴺᴰ₀ aᴺᴰ₁ : NTmᴰ Γ A a aᴺ} → aᴺᴰ₀ ≡ aᴺᴰ₁
varᴺᴰ : (x : Var Γ A) → NTmᴰ Γ A (var x) (varᴺ x)
appᴺᴰ :
NTmᴰ Γ (A ⇒ B) f fᴺ → NTmᴰ Γ A a aᴺ →
NTmᴰ Γ B (app f a) (appᴺ fᴺ aᴺ)
lamᴺᴰ : NTmᴰ (Γ ▹ A) B b bᴺ → NTmᴰ Γ (A ⇒ B) (lam b) (lamᴺ bᴺ)
module NTmInd {ℓ} (D : NTmDModel ℓ) where
open NTmDModel D
postulate
⟦_⟧ : (aᴺ : NTm Γ A a) → NTmᴰ Γ A a aᴺ
⟦⟧-varᴺ : ⟦ varᴺ x ⟧ ≡ varᴺᴰ x
{-# REWRITE ⟦⟧-varᴺ #-}
⟦⟧-appᴺ : ⟦ appᴺ fᴺ aᴺ ⟧ ≡ appᴺᴰ ⟦ fᴺ ⟧ ⟦ aᴺ ⟧
{-# REWRITE ⟦⟧-appᴺ #-}
⟦⟧-lamᴺ : ⟦ lamᴺ bᴺ ⟧ ≡ lamᴺᴰ ⟦ bᴺ ⟧
{-# REWRITE ⟦⟧-lamᴺ #-}
data Wk : (Δ Γ : Con) → Sub Δ Γ → Set where
p : Wk (Γ ▹ A) Γ p
_⁺ : Wk Δ Γ γ → Wk (Δ ▹ A) (Γ ▹ A) (γ ⁺)
infixl 9 _[_]ᵛʷ
_[_]ᵛʷ : Var Γ A → Wk Δ Γ γ → Var Δ A
x [ p ]ᵛʷ = vs x
vz [ γʷ ⁺ ]ᵛʷ = vz
vs x [ γʷ ⁺ ]ᵛʷ = vs (x [ γʷ ]ᵛʷ)
var-[]ʷ : (γʷ : Wk Δ Γ γ) → var x [ γ ] ≡ var (x [ γʷ ]ᵛʷ)
var-[]ʷ p = var-p
var-[]ʷ {x = vz} (γʷ ⁺) = vz-⁺
var-[]ʷ {x = vs x} (γʷ ⁺) = vs-⁺ ∙ cong _[ p ] (var-[]ʷ γʷ) ∙ var-p
module []ᴺʷ where
open NTmDModel
M : NTmDModel _
M .NTmᴰ Γ A a _ = ∀ {Δ γ} → Wk Δ Γ γ → NTm Δ A (a [ γ ])
M .NTmᴰ-prop = funextᵢ (funextᵢ (funext λ _ → NTm-prop))
M .varᴺᴰ x γʷ = ntm[ sym (var-[]ʷ γʷ) ] (varᴺ (x [ γʷ ]ᵛʷ))
M .appᴺᴰ fᴺᴰ aᴺᴰ γʷ = ntm[ sym app-[] ] (appᴺ (fᴺᴰ γʷ) (aᴺᴰ γʷ))
M .lamᴺᴰ bᴺᴰ γʷ = ntm[ sym lam-[] ] (lamᴺ (bᴺᴰ (γʷ ⁺)))
open NTmInd M public
infixl 9 _[_]ᴺʷ
_[_]ᴺʷ : NTm Γ A a → Wk Δ Γ γ → NTm Δ A (a [ γ ])
_[_]ᴺʷ aᴺ = []ᴺʷ.⟦ aᴺ ⟧
data NTSub : (Δ Γ : Con) → Sub Δ Γ → Set where
_⁺ : NTSub Δ Γ γ → NTSub (Δ ▹ A) (Γ ▹ A) (γ ⁺)
⟨_⟩ : NTm Γ A a → NTSub Γ (Γ ▹ A) ⟨ a ⟩
_[_]ᵛᴺᵗ : (x : Var Γ A) → NTSub Δ Γ γ → NTm Δ A (var x [ γ ])
vz [ γᴺᵗ ⁺ ]ᵛᴺᵗ = ntm[ sym vz-⁺ ] (varᴺ vz)
vs x [ γᴺᵗ ⁺ ]ᵛᴺᵗ = ntm[ sym vs-⁺ ] (x [ γᴺᵗ ]ᵛᴺᵗ [ p ]ᴺʷ)
vz [ ⟨ aᴺ ⟩ ]ᵛᴺᵗ = ntm[ sym vz-⟨⟩ ] aᴺ
vs x [ ⟨ aᴺ ⟩ ]ᵛᴺᵗ = ntm[ sym vs-⟨⟩ ] (varᴺ x)
module []ᴺᵗ where
open NTmDModel
M : NTmDModel _
M .NTmᴰ Γ A a _ = ∀ {Δ γ} → NTSub Δ Γ γ → NTm Δ A (a [ γ ])
M .NTmᴰ-prop = funextᵢ (funextᵢ (funext λ _ → NTm-prop))
M .varᴺᴰ x γᴺᵗ = x [ γᴺᵗ ]ᵛᴺᵗ
M .appᴺᴰ fᴺᴰ aᴺᴰ γᴺᵗ = ntm[ sym app-[] ] (appᴺ (fᴺᴰ γᴺᵗ) (aᴺᴰ γᴺᵗ))
M .lamᴺᴰ bᴺᴰ γᴺᵗ = ntm[ sym lam-[] ] (lamᴺ (bᴺᴰ (γᴺᵗ ⁺)))
open NTmInd M public
infixl 9 _[_]ᴺᵗ
_[_]ᴺᵗ : NTm Γ A a → NTSub Δ Γ γ → NTm Δ A (a [ γ ])
_[_]ᴺᵗ aᴺ = []ᴺᵗ.⟦ aᴺ ⟧
data NSub (Δ Γ : Con) (γ : Sub Δ Γ) : Set where
wk : Wk Δ Γ γ → NSub Δ Γ γ
ntsub : NTSub Δ Γ γ → NSub Δ Γ γ
_[_]ᴺ : NTm Γ A a → NSub Δ Γ γ → NTm Δ A (a [ γ ])
aᴺ [ wk γʷ ]ᴺ = aᴺ [ γʷ ]ᴺʷ
aᴺ [ ntsub γᴺᵗ ]ᴺ = aᴺ [ γᴺᵗ ]ᴺᵗ
module norm where
open TmDModel
M : TmDModel _ _
M .Subᴰ = NSub
M .Tmᴰ = NTm
M ._[_]ᴰ = _[_]ᴺ
M .pᴰ = wk p
M .varᴰ = varᴺ
M .var-pᴰ = NTm-prop
M ._⁺ᴰ (wk γʷ) = wk (γʷ ⁺)
M ._⁺ᴰ (ntsub γᴺᵗ) = ntsub (γᴺᵗ ⁺)
M .vz-⁺ᴰ = NTm-prop
M .vs-⁺ᴰ = NTm-prop
M .⟨_⟩ᴰ aᴺ = ntsub ⟨ aᴺ ⟩
M .vz-⟨⟩ᴰ = NTm-prop
M .vs-⟨⟩ᴰ = NTm-prop
M .appᴰ = appᴺ
M .app-[]ᴰ = NTm-prop
M .lamᴰ = lamᴺ
M .lam-[]ᴰ = NTm-prop
M .⇒-βᴰ = NTm-prop
M .⇒-ηᴰ = NTm-prop
open TmInd M public
normˢ : (γ : Sub Δ Γ) → NSub Δ Γ γ
normˢ = norm.⟦_⟧ˢ
norm : (a : Tm Γ A) → NTm Γ A a
norm = norm.⟦_⟧