{-# OPTIONS
--without-K
--prop
--rewriting
--confluence-check
--postfix-projections
#-}
module TT.SSC.AlphaNorm where
open import TT.Lib
open import TT.SSC.Syntax
open import TT.SSC.Ind
private variable
i : ℕ
Γ Δ : Con
γ : Sub Δ Γ
A A₀ A₁ B : Ty Γ i
a a₀ a₁ b f α : Tm Γ A
data Var : (Γ : Con) (A : Ty Γ i) → Tm Γ A → Set where
vz : Var (Γ ▹ A) (A [ p ]ᵀ) q
vs : Var Γ B b → Var (Γ ▹ A) (B [ p ]ᵀ) (b [ p ]ᵗ)
data NTy : (Γ : Con) (i : ℕ) → Ty Γ i → Prop
data NTm : (Γ : Con) (A : Ty Γ i) → Tm Γ A → Prop
data NTy where
Uᴺ : (i : ℕ) → NTy Γ (suc i) (U i)
Elᴺ : NTm Γ (U i) α → NTy Γ i (El α)
Liftᴺ : NTy Γ i A → NTy Γ (suc i) (Lift A)
Πᴺ : NTy Γ i A → NTy (Γ ▹ A) i B → NTy Γ i (Π A B)
data NTm where
var : Var Γ A a → NTm Γ A a
cᴺ : NTy Γ i A → NTm Γ (U i) (c A)
lowerᴺ : NTy Γ i A → NTm Γ (Lift A) a → NTm Γ A (lower a)
liftᴺ : NTy Γ i A → NTm Γ A a → NTm Γ (Lift A) (lift a)
appᴺ :
NTy Γ i A → NTy (Γ ▹ A) i B →
NTm Γ (Π A B) f → NTm Γ A a → NTm Γ (B [ ⟨ a ⟩ ]ᵀ) (app f a)
lamᴺ : NTy Γ i A → NTy (Γ ▹ A) i B → NTm (Γ ▹ A) B b → NTm Γ (Π A B) (lam b)
opaque
unfolding coe
ap-NTy : A₀ ≡ A₁ → NTy Γ i A₀ ≡ NTy Γ i A₁
ap-NTy refl = refl
ap-NTm : (A₀₁ : A₀ ≡ A₁) → a₀ ≡[ ap-Tm A₀₁ ] a₁ → NTm Γ A₀ a₀ ≡ NTm Γ A₁ a₁
ap-NTm refl refl = refl
ap-Var : (A₀₁ : A₀ ≡ A₁) → a₀ ≡[ ap-Tm A₀₁ ] a₁ → Var Γ A₀ a₀ ≡ Var Γ A₁ a₁
ap-Var refl refl = refl
module []ᴺᴾ
(Subᴾ : (Δ Γ : Con) → Sub Δ Γ → Set)
(_⁺ᴾ :
∀ {Γ Δ i} {A : Ty Γ i} {γ} → Subᴾ Δ Γ γ → Subᴾ (Δ ▹ A [ γ ]ᵀ) (Γ ▹ A) (γ ⁺))
(let infixl 10 _⁺ᴾ; _⁺ᴾ = _⁺ᴾ)
(_[_]ᵛᴾ :
∀ {Γ Δ i} {A : Ty Γ i} {a γ} →
Var Γ A a → Subᴾ Δ Γ γ → NTm Δ (A [ γ ]ᵀ) (a [ γ ]ᵗ))
(let infixl 9 _[_]ᵛᴾ; _[_]ᵛᴾ = _[_]ᵛᴾ)
where
infixl 9 _[_]ᵀᴺᴾ _[_]ᵗᴺᴾ
_[_]ᵀᴺᴾ : NTy Γ i A → Subᴾ Δ Γ γ → NTy Δ i (A [ γ ]ᵀ)
_[_]ᵗᴺᴾ : NTm Γ A a → Subᴾ Δ Γ γ → NTm Δ (A [ γ ]ᵀ) (a [ γ ]ᵗ)
Uᴺ i [ γᴾ ]ᵀᴺᴾ = coeₚ (ap-NTy (sym U-[])) (Uᴺ i)
Elᴺ αᴺ [ γᴾ ]ᵀᴺᴾ =
coeₚ (ap-NTy (sym El-[])) (Elᴺ (coeₚ (ap-NTm U-[] refl) (αᴺ [ γᴾ ]ᵗᴺᴾ)))
Liftᴺ Aᴺ [ γᴾ ]ᵀᴺᴾ = coeₚ (ap-NTy (sym Lift-[])) (Liftᴺ (Aᴺ [ γᴾ ]ᵀᴺᴾ))
Πᴺ Aᴺ Bᴺ [ γᴾ ]ᵀᴺᴾ =
coeₚ (ap-NTy (sym Π-[])) (Πᴺ (Aᴺ [ γᴾ ]ᵀᴺᴾ) (Bᴺ [ γᴾ ⁺ᴾ ]ᵀᴺᴾ))
var aᵛ [ γᴾ ]ᵗᴺᴾ = aᵛ [ γᴾ ]ᵛᴾ
cᴺ Aᴺ [ γᴾ ]ᵗᴺᴾ = coeₚ (ap-NTm (sym U-[]) (symᵈ c-[])) (cᴺ (Aᴺ [ γᴾ ]ᵀᴺᴾ))
lowerᴺ Aᴺ aᴺ [ γᴾ ]ᵗᴺᴾ =
coeₚ (ap-NTm refl (dep (sym lower-[])))
(lowerᴺ (Aᴺ [ γᴾ ]ᵀᴺᴾ) (coeₚ (ap-NTm Lift-[] refl) (aᴺ [ γᴾ ]ᵗᴺᴾ)))
liftᴺ Aᴺ aᴺ [ γᴾ ]ᵗᴺᴾ =
coeₚ (ap-NTm (sym Lift-[])
(symᵈ lift-[])) (liftᴺ (Aᴺ [ γᴾ ]ᵀᴺᴾ) (aᴺ [ γᴾ ]ᵗᴺᴾ))
appᴺ Aᴺ Bᴺ fᴺ aᴺ [ γᴾ ]ᵗᴺᴾ =
coeₚ (ap-NTm (sym ⟨⟩-[]ᵀ) (symᵈ app-[]))
(appᴺ
(Aᴺ [ γᴾ ]ᵀᴺᴾ)
(Bᴺ [ γᴾ ⁺ᴾ ]ᵀᴺᴾ)
(coeₚ (ap-NTm Π-[] refl) (fᴺ [ γᴾ ]ᵗᴺᴾ))
(aᴺ [ γᴾ ]ᵗᴺᴾ))
lamᴺ Aᴺ Bᴺ bᴺ [ γᴾ ]ᵗᴺᴾ =
coeₚ (ap-NTm (sym Π-[]) (symᵈ lam-[]))
(lamᴺ (Aᴺ [ γᴾ ]ᵀᴺᴾ) (Bᴺ [ γᴾ ⁺ᴾ ]ᵀᴺᴾ) (bᴺ [ γᴾ ⁺ᴾ ]ᵗᴺᴾ))
data Wk : (Δ Γ : Con) → Sub Δ Γ → Set where
p : Wk (Γ ▹ A) Γ p
_⁺ : Wk Δ Γ γ → Wk (Δ ▹ A [ γ ]ᵀ) (Γ ▹ A) (γ ⁺)
infixl 9 _[_]ᵛʷ
_[_]ᵛʷ : Var Γ A a → Wk Δ Γ γ → Var Δ (A [ γ ]ᵀ) (a [ γ ]ᵗ)
aᵛ [ p ]ᵛʷ = vs aᵛ
vz [ γʷ ⁺ ]ᵛʷ = coe (ap-Var (sym p-⁺ᵀ) (symᵈ q-⁺)) vz
vs aᵛ [ γʷ ⁺ ]ᵛʷ = coe (ap-Var (sym p-⁺ᵀ) (symᵈ p-⁺ᵗ)) (vs (aᵛ [ γʷ ]ᵛʷ))
open []ᴺᴾ Wk _⁺ (λ aᵛ γʷ → var (aᵛ [ γʷ ]ᵛʷ))
renaming (_[_]ᵀᴺᴾ to _[_]ᵀᴺʷ; _[_]ᵗᴺᴾ to _[_]ᵗᴺʷ)
data NSSub : (Δ Γ : Con) → Sub Δ Γ → Set where
_⁺ : NSSub Δ Γ γ → NSSub (Δ ▹ A [ γ ]ᵀ) (Γ ▹ A) (γ ⁺)
⟨_⟩ : NTm Γ A a → NSSub Γ (Γ ▹ A) ⟨ a ⟩
infixl 9 _[_]ᵛᴺˢ
_[_]ᵛᴺˢ : Var Γ A a → NSSub Δ Γ γ → NTm Δ (A [ γ ]ᵀ) (a [ γ ]ᵗ)
vz [ γᴺˢ ⁺ ]ᵛᴺˢ = coeₚ (ap-NTm (sym p-⁺ᵀ) (symᵈ q-⁺)) (var vz)
vs bᵛ [ γᴺˢ ⁺ ]ᵛᴺˢ =
coeₚ (ap-NTm (sym p-⁺ᵀ) (symᵈ p-⁺ᵗ)) (bᵛ [ γᴺˢ ]ᵛᴺˢ [ p ]ᵗᴺʷ)
vz [ ⟨ aᴺ ⟩ ]ᵛᴺˢ = coeₚ (ap-NTm (sym p-⟨⟩ᵀ) (symᵈ q-⟨⟩)) aᴺ
vs bᵛ [ ⟨ aᴺ ⟩ ]ᵛᴺˢ = coeₚ (ap-NTm (sym p-⟨⟩ᵀ) (symᵈ p-⟨⟩ᵗ)) (var bᵛ)
open []ᴺᴾ NSSub _⁺ _[_]ᵛᴺˢ renaming (_[_]ᵀᴺᴾ to _[_]ᵀᴺˢ; _[_]ᵗᴺᴾ to _[_]ᵗᴺˢ)
data NSub (Δ Γ : Con) (γ : Sub Δ Γ) : Set where
wk : Wk Δ Γ γ → NSub Δ Γ γ
nssub : NSSub Δ Γ γ → NSub Δ Γ γ
infixl 9 _[_]ᵀᴺ
_[_]ᵀᴺ : NTy Γ i A → NSub Δ Γ γ → NTy Δ i (A [ γ ]ᵀ)
Aᴺ [ wk γʷ ]ᵀᴺ = Aᴺ [ γʷ ]ᵀᴺʷ
Aᴺ [ nssub γᴺˢ ]ᵀᴺ = Aᴺ [ γᴺˢ ]ᵀᴺˢ
infixl 9 _[_]ᵗᴺ
_[_]ᵗᴺ : NTm Γ A a → NSub Δ Γ γ → NTm Δ (A [ γ ]ᵀ) (a [ γ ]ᵗ)
aᴺ [ wk γʷ ]ᵗᴺ = aᴺ [ γʷ ]ᵗᴺʷ
aᴺ [ nssub γᴺˢ ]ᵗᴺ = aᴺ [ γᴺˢ ]ᵗᴺˢ
infixl 10 _⁺ᴺ
_⁺ᴺ : NSub Δ Γ γ → NSub (Δ ▹ A [ γ ]ᵀ) (Γ ▹ A) (γ ⁺)
wk γʷ ⁺ᴺ = wk (γʷ ⁺)
nssub γᴺˢ ⁺ᴺ = nssub (γᴺˢ ⁺)
module norm where
open DM
open DModel
M : DModel
M .sorts .Conᴹ _ = ⊤
M .sorts .Subᴹ _ _ = NSub _ _
M .sorts .Tyᴹ _ _ A = Liftₚ (NTy _ _ A)
M .sorts .Tmᴹ _ _ a = Liftₚ (NTm _ _ a)
M .core ._[_]ᵀᴹ (liftₚ Aᴺ) γᴺ .lowerₚ = Aᴺ [ γᴺ ]ᵀᴺ
M .core ._[_]ᵗᴹ (liftₚ aᴺ) γᴺ .lowerₚ = aᴺ [ γᴺ ]ᵗᴺ
M .core .◇ᴹ = ⋆
M .core ._▹ᴹ_ _ _ = ⋆
M .core .pᴹ = wk p
M .core .qᴹ .lowerₚ = var vz
M .core ._⁺ᴹ = _⁺ᴺ
M .core .p-⁺ᵀᴹ = refl
M .core .p-⁺ᵗᴹ = refl
M .core .q-⁺ᴹ = refl
M .core .⟨_⟩ᴹ (liftₚ aᴺ) = nssub ⟨ aᴺ ⟩
M .core .p-⟨⟩ᵀᴹ = refl
M .core .p-⟨⟩ᵗᴹ = refl
M .core .q-⟨⟩ᴹ = refl
M .core .⟨⟩-[]ᵀᴹ = refl
M .core .▹-ηᵀᴹ = refl
M .types .Uᴹ i .lowerₚ = Uᴺ i
M .types .U-[]ᴹ = refl
M .types .Elᴹ (liftₚ αᴺ) .lowerₚ = Elᴺ αᴺ
M .types .El-[]ᴹ = refl
M .types .cᴹ (liftₚ Aᴺ) .lowerₚ = cᴺ Aᴺ
M .types .c-[]ᴹ = refl
M .types .U-βᴹ = refl
M .types .U-ηᴹ = refl
M .types .Liftᴹ (liftₚ A) .lowerₚ = Liftᴺ A
M .types .Lift-[]ᴹ = refl
M .types .lowerᴹ {Aᴹ = liftₚ Aᴺ} (liftₚ aᴺ) .lowerₚ = lowerᴺ Aᴺ aᴺ
M .types .lower-[]ᴹ = refl
M .types .liftᴹ {Aᴹ = liftₚ Aᴺ} (liftₚ aᴺ) .lowerₚ = liftᴺ Aᴺ aᴺ
M .types .lift-[]ᴹ = refl
M .types .Lift-βᴹ = refl
M .types .Lift-ηᴹ = refl
M .types .Πᴹ (liftₚ Aᴺ) (liftₚ Bᴺ) .lowerₚ = Πᴺ Aᴺ Bᴺ
M .types .Π-[]ᴹ = refl
M .types .appᴹ {Aᴹ = liftₚ Aᴺ} {Bᴹ = liftₚ Bᴺ} (liftₚ fᴺ) (liftₚ aᴺ) .lowerₚ =
appᴺ Aᴺ Bᴺ fᴺ aᴺ
M .types .app-[]ᴹ = refl
M .types .lamᴹ {Aᴹ = liftₚ Aᴺ} {Bᴹ = liftₚ Bᴺ} (liftₚ bᴺ) .lowerₚ = lamᴺ Aᴺ Bᴺ bᴺ
M .types .lam-[]ᴹ = refl
M .types .Π-βᴹ = refl
M .types .Π-ηᴹ = refl
open Ind M public
open norm public using () renaming (⟦_⟧ˢ to normˢ)
normᵀ : (A : Ty Γ i) → NTy Γ i A
normᵀ A = norm.⟦ A ⟧ᵀ .lowerₚ
normᵗ : (a : Tm Γ A) → NTm Γ A a
normᵗ a = norm.⟦ a ⟧ᵗ .lowerₚ