Added algebra for ZOL and syntax and initial morphism and the proof of it being initial
This commit is contained in:
parent
d70739091e
commit
370daed594
@ -1,4 +1,4 @@
|
|||||||
\begin{code}
|
git s\begin{code}
|
||||||
{-# OPTIONS --prop --rewriting #-}
|
{-# OPTIONS --prop --rewriting #-}
|
||||||
|
|
||||||
open import PropUtil
|
open import PropUtil
|
||||||
@ -281,6 +281,12 @@ module FFOLInitial where
|
|||||||
εₚ : Subp Δₚ ◇p
|
εₚ : Subp Δₚ ◇p
|
||||||
_,ₚ_ : {A : For Δₜ} → (σ : Subp Δₚ Δₚ') → Pf Δₜ Δₚ A → Subp Δₚ (Δₚ' ▹p⁰ A)
|
_,ₚ_ : {A : For Δₜ} → (σ : Subp Δₚ Δₚ') → Pf Δₜ Δₚ A → Subp Δₚ (Δₚ' ▹p⁰ A)
|
||||||
|
|
||||||
|
-- We write down the access functions from the algebra, in restricted versions
|
||||||
|
πₚ¹ : ∀{Γₜ}{Γₚ Δₚ : Conp Γₜ} {A : For Γₜ} → Subp Δₚ (Γₚ ▹p⁰ A) → Subp Δₚ Γₚ
|
||||||
|
πₚ¹ (σₚ ,ₚ pf) = σₚ
|
||||||
|
πₚ² : ∀{Γₜ}{Γₚ Δₚ : Conp Γₜ} {A : For Γₜ} → Subp Δₚ (Γₚ ▹p⁰ A) → Pf Γₜ Δₚ A
|
||||||
|
πₚ² (σₚ ,ₚ pf) = pf
|
||||||
|
|
||||||
-- The action of Cont's morphisms on Subp
|
-- The action of Cont's morphisms on Subp
|
||||||
_[_]σₚ : Subp {Δₜ} Δₚ Δₚ' → (σ : Subt Γₜ Δₜ) → Subp {Γₜ} (Δₚ [ σ ]c) (Δₚ' [ σ ]c)
|
_[_]σₚ : Subp {Δₜ} Δₚ Δₚ' → (σ : Subt Γₜ Δₜ) → Subp {Γₜ} (Δₚ [ σ ]c) (Δₚ' [ σ ]c)
|
||||||
εₚ [ σₜ ]σₚ = εₚ
|
εₚ [ σₜ ]σₚ = εₚ
|
||||||
@ -400,12 +406,10 @@ module FFOLInitial where
|
|||||||
,ₜ∘* : {Γ Δ Ξ : Con}{σ : Sub Γ Ξ}{δ : Sub Δ Γ}{t : Tm (Con.t Γ)} → (σ ,ₜ* t) ∘ δ ≡ (σ ∘ δ) ,ₜ* (t [ Sub.t δ ]t)
|
,ₜ∘* : {Γ Δ Ξ : Con}{σ : Sub Γ Ξ}{δ : Sub Δ Γ}{t : Tm (Con.t Γ)} → (σ ,ₜ* t) ∘ δ ≡ (σ ∘ δ) ,ₜ* (t [ Sub.t δ ]t)
|
||||||
,ₜ∘* {Γ} {Δ} {Ξ} {sub σₜ σₚ} {sub δₜ δₚ} {t} = sub= refl
|
,ₜ∘* {Γ} {Δ} {Ξ} {sub σₜ σₚ} {sub δₜ δₚ} {t} = sub= refl
|
||||||
|
|
||||||
-- And for proof substitutions
|
|
||||||
πₚ₁ : ∀{Γₜ}{Γₚ Δₚ : Conp Γₜ} {A : For Γₜ} → Subp Δₚ (Γₚ ▹p⁰ A) → Subp Δₚ Γₚ
|
|
||||||
πₚ₁ (σₚ ,ₚ pf) = σₚ
|
|
||||||
|
|
||||||
|
-- And for proof substitutions
|
||||||
πₚ¹* : {Γ Δ : Con} {A : For (Con.t Γ)} → Sub Δ (Γ ▹p A) → Sub Δ Γ
|
πₚ¹* : {Γ Δ : Con} {A : For (Con.t Γ)} → Sub Δ (Γ ▹p A) → Sub Δ Γ
|
||||||
πₚ¹* (sub σₜ σaₚ) = sub σₜ (πₚ₁ σaₚ)
|
πₚ¹* (sub σₜ σaₚ) = sub σₜ (πₚ¹ σaₚ)
|
||||||
πₚ²* : {Γ Δ : Con} {F : For (Con.t Γ)} (σ : Sub Δ (Γ ▹p F)) → Pf (Con.t Δ) (Con.p Δ) (F [ Sub.t (πₚ¹* σ) ]f)
|
πₚ²* : {Γ Δ : Con} {F : For (Con.t Γ)} (σ : Sub Δ (Γ ▹p F)) → Pf (Con.t Δ) (Con.p Δ) (F [ Sub.t (πₚ¹* σ) ]f)
|
||||||
πₚ²* (sub σₜ (σₚ ,ₚ pf)) = pf
|
πₚ²* (sub σₜ (σₚ ,ₚ pf)) = pf
|
||||||
_,ₚ*_ : {Γ Δ : Con} {F : For (Con.t Γ)} (σ : Sub Δ Γ) → Pf (Con.t Δ) (Con.p Δ) (F [ Sub.t σ ]f) → Sub Δ (Γ ▹p F)
|
_,ₚ*_ : {Γ Δ : Con} {F : For (Con.t Γ)} (σ : Sub Δ Γ) → Pf (Con.t Δ) (Con.p Δ) (F [ Sub.t σ ]f) → Sub Δ (Γ ▹p F)
|
||||||
@ -511,37 +515,96 @@ module FFOLInitial where
|
|||||||
Pf*-∘ {Ξₚ = ◇p} α β = tt
|
Pf*-∘ {Ξₚ = ◇p} α β = tt
|
||||||
Pf*-∘ {Ξₚ = Ξₚ ▹p⁰ A} α β = ⟨ Pf*-∘ (proj₁ α) β , Pf*Pf β (proj₂ α) ⟩
|
Pf*-∘ {Ξₚ = Ξₚ ▹p⁰ A} α β = ⟨ Pf*-∘ (proj₁ α) β , Pf*Pf β (proj₂ α) ⟩
|
||||||
|
|
||||||
{-
|
|
||||||
module InitialMorphism (M : FFOL {lsuc lzero} {lsuc lzero} {lsuc lzero} {lsuc lzero} {lsuc lzero}) where
|
module InitialMorphism (M : FFOL {lsuc lzero} {lsuc lzero} {lsuc lzero} {lsuc lzero} {lsuc lzero}) where
|
||||||
{-# TERMINATING #-}
|
{-# TERMINATING #-}
|
||||||
mCon : Con → (FFOL.Con M)
|
|
||||||
mFor : {Γ : Con} → (For (Con.t Γ)) → (FFOL.For M (mCon Γ))
|
|
||||||
mTm : {Γ : Con} → (Tm (Con.t Γ)) → (FFOL.Tm M (mCon Γ))
|
|
||||||
mSub : {Δ : Con}{Γ : Con} → Sub Δ Γ → (FFOL.Sub M (mCon Δ) (mCon Γ))
|
|
||||||
m⊢ : {Γ : Con} {A : For (Con.t Γ)} → Pf (Con.t Γ) (Con.p Γ) A → FFOL._⊢_ M (mCon Γ) (mFor A)
|
|
||||||
|
|
||||||
e▹ₜ : {Γ : Con} → mCon (con (Con.t Γ ▹t⁰) (Con.p Γ [ wkₜσₜ idₜ ]c)) ≡ FFOL._▹ₜ M (mCon Γ)
|
|
||||||
e▹ₚ : {Γ : Con}{A : For (Con.t Γ)} → mCon (Γ ▹p A) ≡ FFOL._▹ₚ_ M (mCon Γ) (mFor A)
|
|
||||||
e[]f : {Γ Δ : Con}{A : For (Con.t Γ)}{σ : Sub Δ Γ} → mFor (A [ Sub.t σ ]f) ≡ FFOL._[_]f M (mFor A) (mSub σ)
|
|
||||||
|
|
||||||
mCon (con ◇t ◇p) = FFOL.◇ M
|
|
||||||
mCon (con (Γₜ ▹t⁰) ◇p) = FFOL._▹ₜ M (mCon (con Γₜ ◇p))
|
|
||||||
mCon (con Γₜ (Γₚ ▹p⁰ A)) = FFOL._▹ₚ_ M (mCon (con Γₜ Γₚ)) (mFor {con Γₜ Γₚ} A)
|
|
||||||
mSub {Γ = con ◇t ◇p} (sub εₜ εₚ) = FFOL.ε M
|
|
||||||
mSub {Γ = con (Γₜ ▹t⁰) ◇p} (sub (σₜ ,ₜ t) εₚ) = FFOL._,ₜ_ M (mSub (sub σₜ εₚ)) (mTm t)
|
|
||||||
mSub {Δ = Δ} {Γ = con Γₜ (Γₚ ▹p⁰ A)} (sub σₜ (σₚ ,ₚ pf)) = subst (FFOL.Sub M (mCon Δ)) (≡sym e▹ₚ) (FFOL._,ₚ_ M (mSub (sub σₜ σₚ)) (substP (FFOL._⊢_ M (mCon Δ)) e[]f (m⊢ pf)))
|
|
||||||
|
|
||||||
|
mCont : Cont → (FFOL.Con M)
|
||||||
|
mCont ◇t = FFOL.◇ M
|
||||||
|
mCont (Γₜ ▹t⁰) = FFOL._▹ₜ M (mCont Γₜ)
|
||||||
|
mTmT : {Γₜ : Cont} → Tm Γₜ → (FFOL.Tm M (mCont Γₜ))
|
||||||
-- Zero is (πₜ² id)
|
-- Zero is (πₜ² id)
|
||||||
mTm {con (Γₜ ▹t⁰) ◇p} (var tvzero) = FFOL.πₜ² M (FFOL.id M)
|
mTmT {Γₜ ▹t⁰} (var tvzero) = FFOL.πₜ² M (FFOL.id M)
|
||||||
-- N+1 is wk[tm N]
|
-- N+1 is wk[tm N]
|
||||||
mTm {con (Γₜ ▹t⁰) ◇p} (var (tvnext tv)) = (FFOL._[_]t M (mTm (var tv)) (FFOL.πₜ¹ M (FFOL.id M)))
|
mTmT {Γₜ ▹t⁰} (var (tvnext tv)) = (FFOL._[_]t M (mTmT (var tv)) (FFOL.πₜ¹ M (FFOL.id M)))
|
||||||
-- If we have a formula in context, we proof-weaken the term (should not change a thing)
|
|
||||||
mTm {con (Γₜ ▹t⁰) (Γₚ ▹p⁰ A)} (var tv) = FFOL._[_]t M (mTm {con (Γₜ ▹t⁰) Γₚ} (var tv)) (FFOL.πₚ¹ M (FFOL.id M))
|
|
||||||
|
|
||||||
mFor (R t u) = FFOL.R M (mTm t) (mTm u)
|
mForT : {Γₜ : Cont} → (For Γₜ) → (FFOL.For M (mCont Γₜ))
|
||||||
mFor (A ⇒ B) = FFOL._⇒_ M (mFor A) (mFor B)
|
mForT (R t u) = FFOL.R M (mTmT t) (mTmT u)
|
||||||
mFor {Γ} (∀∀ A) = FFOL.∀∀ M (subst (FFOL.For M) (e▹ₜ {Γ = Γ}) (mFor {Γ = Γ ▹t} A))
|
mForT (A ⇒ B) = FFOL._⇒_ M (mForT A) (mForT B)
|
||||||
|
mForT {Γ} (∀∀ A) = FFOL.∀∀ M (mForT A)
|
||||||
|
|
||||||
|
mSubt : {Δₜ : Cont}{Γₜ : Cont} → Subt Δₜ Γₜ → (FFOL.Sub M (mCont Δₜ) (mCont Γₜ))
|
||||||
|
mSubt εₜ = FFOL.ε M
|
||||||
|
mSubt (σₜ ,ₜ t) = FFOL._,ₜ_ M (mSubt σₜ) (mTmT t)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mConp : {Γₜ : Cont} → Conp Γₜ → (FFOL.Con M)
|
||||||
|
mForP : {Γₜ : Cont} {Γₚ : Conp Γₜ} → (For Γₜ) → (FFOL.For M (mConp Γₚ))
|
||||||
|
mConp {Γₜ} ◇p = mCont Γₜ
|
||||||
|
mConp {Γₜ} (Γₚ ▹p⁰ A) = FFOL._▹ₚ_ M (mConp Γₚ) (mForP {Γₚ = Γₚ} A)
|
||||||
|
mForP {Γₜ} {Γₚ = ◇p} A = mForT {Γₜ} A
|
||||||
|
mForP {Γₚ = Γₚ ▹p⁰ B} A = FFOL._[_]f M (mForP {Γₚ = Γₚ} A) (FFOL.πₚ¹ M (FFOL.id M))
|
||||||
|
|
||||||
|
mTmP : {Γₜ : Cont}{Γₚ : Conp Γₜ} → Tm Γₜ → (FFOL.Tm M (mConp Γₚ))
|
||||||
|
mTmP {Γₜ}{Γₚ = ◇p} t = mTmT {Γₜ} t
|
||||||
|
mTmP {Γₚ = Γₚ ▹p⁰ x} t = FFOL._[_]t M (mTmP {Γₚ = Γₚ} t) (FFOL.πₚ¹ M (FFOL.id M))
|
||||||
|
|
||||||
|
mCon : Con → (FFOL.Con M)
|
||||||
|
mCon Γ = mConp {Con.t Γ} (Con.p Γ)
|
||||||
|
|
||||||
|
mFor : {Γ : Con} → (For (Con.t Γ)) → (FFOL.For M (mCon Γ))
|
||||||
|
mFor {Γ} A = mForP {Con.t Γ} {Con.p Γ} A
|
||||||
|
|
||||||
|
mTm : {Γ : Con} → Tm (Con.t Γ) → (FFOL.Tm M (mCon Γ))
|
||||||
|
mTm {Γ} t = mTmP {Con.t Γ} {Con.p Γ} t
|
||||||
|
|
||||||
|
e▹ₜT : {Γₜ : Cont} → mCont (Γₜ ▹t⁰) ≡ FFOL._▹ₜ M (mCont Γₜ)
|
||||||
|
e▹ₜT = refl
|
||||||
|
e▹ₜP : {Γₜ : Cont}{Γₚ : Conp Γₜ} → mConp {Γₜ ▹t⁰} (Γₚ [ wkₜσₜ idₜ ]c) ≡ FFOL._▹ₜ M (mConp Γₚ)
|
||||||
|
e▹ₜP {Γₜ = Γₜ} {Γₚ = ◇p} = e▹ₜT {Γₜ = Γₜ}
|
||||||
|
e▹ₜP {Γₚ = Γₚ ▹p⁰ A} = {!!}
|
||||||
|
e▹ₜ : {Γ : Con} → mCon (con (Con.t Γ ▹t⁰) (Con.p Γ [ wkₜσₜ idₜ ]c)) ≡ FFOL._▹ₜ M (mCon Γ)
|
||||||
|
e▹ₜ {Γ} = e▹ₜP {Γₜ = Con.t Γ} {Γₚ = Con.p Γ}
|
||||||
|
|
||||||
|
mForT⇒ : {Γₜ : Cont}{A B : For Γₜ} → mForT {Γₜ} (A ⇒ B) ≡ FFOL._⇒_ M (mForT {Γₜ} A) (mForT {Γₜ} B)
|
||||||
|
mForT⇒ = refl
|
||||||
|
mForP⇒ : {Γₜ : Cont}{Γₚ : Conp Γₜ}{A B : For Γₜ} → mForP {Γₜ} {Γₚ} (A ⇒ B) ≡ FFOL._⇒_ M (mForP {Γₜ} {Γₚ} A) (mForP {Γₜ} {Γₚ} B)
|
||||||
|
mForP⇒ {Γₜ} {Γₚ = ◇p}{A}{B} = mForT⇒ {Γₜ}{A}{B}
|
||||||
|
mForP⇒ {Γₚ = Γₚ ▹p⁰ C}{A}{B} = ≡tran (cong (λ X → (M FFOL.[ X ]f) _) (mForP⇒ {Γₚ = Γₚ})) (FFOL.[]f-⇒ M {F = mForP {Γₚ = Γₚ} A} {G = mForP {Γₚ = Γₚ} B} {σ = (FFOL.πₚ¹ M (FFOL.id M))})
|
||||||
|
mFor⇒ : {Γ : Con}{A B : For (Con.t Γ)} → mFor {Γ} (A ⇒ B) ≡ FFOL._⇒_ M (mFor {Γ} A) (mFor {Γ} B)
|
||||||
|
mFor⇒ {Γ} = mForP⇒ {Con.t Γ} {Con.p Γ}
|
||||||
|
|
||||||
|
mForT∀∀ : {Γₜ : Cont}{A : For (Γₜ ▹t⁰)} → mForT {Γₜ} (∀∀ A) ≡ FFOL.∀∀ M (mForT {Γₜ ▹t⁰} A)
|
||||||
|
mForT∀∀ = refl
|
||||||
|
mForP∀∀ : {Γₜ : Cont}{Γₚ : Conp Γₜ}{A : For (Γₜ ▹t⁰)} → mForP {Γₜ} {Γₚ} (∀∀ A) ≡ FFOL.∀∀ M (subst (FFOL.For M) (e▹ₜP {Γₜ} {Γₚ}) (mForP {Γₜ ▹t⁰} {Γₚ ▹tp} A))
|
||||||
|
-- mFor∀∀ : {Γ : Con}{A : For ((Con.t Γ) ▹t⁰)} → mFor {Γ} (∀∀ A) ≡ FFOL.∀∀ M (mFor {Γ ▹t} A)
|
||||||
|
|
||||||
|
--mForL : {Γ : Con}{A : For (Con.t Γ ▹t⁰)}{t : Tm (Con.t Γ)} → FFOL._[_]f M (mFor {Γ = {!Γ ▹t!}} A) (FFOL._,ₜ_ M (FFOL.id M) (mTm {Γ = Γ} t)) ≡ mFor {Γ = Γ} (A [ idₜ ,ₜ t ]f)
|
||||||
|
|
||||||
|
m⊢ : {Γ : Con} {A : For (Con.t Γ)} → Pf (Con.t Γ) (Con.p Γ) A → FFOL._⊢_ M (mCon Γ) (mFor {Γ = Γ} A)
|
||||||
|
m⊢ (var pvzero) = FFOL.πₚ² M (FFOL.id M)
|
||||||
|
m⊢ (var (pvnext pv)) = FFOL._[_]p M (m⊢ (var pv)) (FFOL.πₚ¹ M (FFOL.id M))
|
||||||
|
m⊢ {Γ} {B} (app {A = A} pf pf') = FFOL.app M (substP (FFOL._⊢_ M _) (mFor⇒ {Γ}{A}{B}) (m⊢ pf)) (m⊢ pf')
|
||||||
|
m⊢ {Γ} {A ⇒ B} (lam pf) = substP (FFOL._⊢_ M _) (≡sym (mFor⇒ {Γ}{A}{B})) (FFOL.lam M (m⊢ pf))
|
||||||
|
m⊢ {Γ} (p∀∀e {A = A} {t = t} pf) = substP (FFOL._⊢_ M _) {!!} (FFOL.∀e M {F = mFor {{!!}} A} (substP (FFOL._⊢_ M _) {!!} (m⊢ pf)) {t = mTm {Γ} t})
|
||||||
|
m⊢ {Γ} (p∀∀i {A = A} pf) = substP (FFOL._⊢_ M _) (≡sym mForP∀∀) (FFOL.∀i M (substP (λ Ξ → FFOL._⊢_ M Ξ (mFor A)) e▹ₜ (m⊢ pf)))
|
||||||
|
|
||||||
|
|
||||||
|
mSubp : {Γₜ : Cont}{Δₚ Γₚ : Conp Γₜ} → Subp {Γₜ} Δₚ Γₚ → (FFOL.Sub M (mConp Δₚ) (mConp Γₚ))
|
||||||
|
mSubp {Γₜ} {Γₚ = ◇p} σₚ = {!FFOL.ε M!}
|
||||||
|
mSubp {Γₚ = Γₚ ▹p⁰ A} σₚ = FFOL._,ₚ_ M (mSubp (πₚ¹ σₚ)) {!m⊢ (πₚ² σₚ)!}
|
||||||
|
|
||||||
|
|
||||||
|
mSub : {Δ : Con}{Γ : Con} → Sub Δ Γ → (FFOL.Sub M (mCon Δ) (mCon Γ))
|
||||||
|
mSub {Δ}{Γ} σ = FFOL._∘_ M (subst (FFOL.Sub M (mCont (Con.t Δ))) {!!} (mSubt (Sub.t σ))) ({!mSubp (Sub.p σ)!})
|
||||||
|
|
||||||
|
|
||||||
|
e▹ₚ : {Γ : Con}{A : For (Con.t Γ)} → mCon (Γ ▹p A) ≡ FFOL._▹ₚ_ M (mCon Γ) (mFor {Γ} A)
|
||||||
|
e[]f : {Γ Δ : Con}{A : For (Con.t Γ)}{σ : Sub Δ Γ} → mFor {Δ} (A [ Sub.t σ ]f) ≡ FFOL._[_]f M (mFor {Γ} A) (mSub σ)
|
||||||
|
|
||||||
|
|
||||||
|
{-
|
||||||
e▹ₜ {con Γₜ ◇p} = refl
|
e▹ₜ {con Γₜ ◇p} = refl
|
||||||
e▹ₜ {con Γₜ (Γₚ ▹p⁰ A)} = ≡tran²
|
e▹ₜ {con Γₜ (Γₚ ▹p⁰ A)} = ≡tran²
|
||||||
(cong₂' (FFOL._▹ₚ_ M) (e▹ₜ {con Γₜ Γₚ}) (cong (subst (FFOL.For M) (e▹ₜ {Γ = con Γₜ Γₚ})) (e[]f {A = A}{σ = πₜ¹* id})))
|
(cong₂' (FFOL._▹ₚ_ M) (e▹ₜ {con Γₜ Γₚ}) (cong (subst (FFOL.For M) (e▹ₜ {Γ = con Γₜ Γₚ})) (e[]f {A = A}{σ = πₜ¹* id})))
|
||||||
@ -552,13 +615,8 @@ module FFOLInitial where
|
|||||||
{!!})
|
{!!})
|
||||||
(cong (M FFOL.▹ₜ) (≡sym (e▹ₚ {con Γₜ Γₚ})))
|
(cong (M FFOL.▹ₜ) (≡sym (e▹ₚ {con Γₜ Γₚ})))
|
||||||
-- substP (λ X → FFOL._▹ₚ_ M X (mFor {Γ = ?} (A [ wkₜσₜ idₜ ]f)) ≡ (FFOL._▹ₜ M (mCon (con Γₜ (Γₚ ▹p⁰ A))))) (≡sym (e▹ₜ {Γ = con Γₜ Γₚ})) ?
|
-- substP (λ X → FFOL._▹ₚ_ M X (mFor {Γ = ?} (A [ wkₜσₜ idₜ ]f)) ≡ (FFOL._▹ₜ M (mCon (con Γₜ (Γₚ ▹p⁰ A))))) (≡sym (e▹ₜ {Γ = con Γₜ Γₚ})) ?
|
||||||
|
-}
|
||||||
|
|
||||||
m⊢ {Γ}{A}(var pvzero) = {!substP (λ X → FFOL._⊢_ M X (mFor A)) (≡sym e▹ₚ) ?!}
|
|
||||||
m⊢ (var (pvnext pv)) = {!!}
|
|
||||||
m⊢ (app pf pf') = FFOL.app M (m⊢ pf) (m⊢ pf')
|
|
||||||
m⊢ (lam pf) = FFOL.lam M {!m⊢ pf!}
|
|
||||||
m⊢ (p∀∀e pf) = {!FFOL.∀e M (m⊢ pf)!}
|
|
||||||
m⊢ {Γ}{∀∀ A}(p∀∀i pf) = FFOL.∀i M (substP (λ X → FFOL._⊢_ M X (subst (FFOL.For M) (≡sym e▹ₜ) (mFor A))) e▹ₜ {!m⊢ pf!})
|
|
||||||
|
|
||||||
e[]f = {!!}
|
e[]f = {!!}
|
||||||
e▹ₚ = {!!}
|
e▹ₚ = {!!}
|
||||||
@ -603,9 +661,9 @@ module FFOLInitial where
|
|||||||
e∀∀ = {!!}
|
e∀∀ = {!!}
|
||||||
-}
|
-}
|
||||||
m : Mapping ffol M
|
m : Mapping ffol M
|
||||||
m = record { mCon = mCon ; mSub = mSub ; mTm = mTm ; mFor = mFor ; m⊢ = m⊢ }
|
m = record { mCon = mCon ; mSub = mSub ; mTm = λ {Γ} t → mTm {Γ} t ; mFor = λ {Γ} A → mFor {Γ} A ; m⊢ = m⊢ }
|
||||||
|
|
||||||
--mor : (M : FFOL) → Morphism ffol M
|
--mor : (M : FFOL) → Morphism ffol M
|
||||||
--mor M = record {InitialMorphism M}
|
--mor M = record {InitialMorphism M}
|
||||||
-}
|
|
||||||
\end{code}
|
\end{code}
|
||||||
|
|||||||
765
FFOLInitial2.lagda
Normal file
765
FFOLInitial2.lagda
Normal file
@ -0,0 +1,765 @@
|
|||||||
|
git s\begin{code}
|
||||||
|
{-# OPTIONS --prop --rewriting #-}
|
||||||
|
|
||||||
|
open import PropUtil
|
||||||
|
|
||||||
|
module FFOLInitial2 where
|
||||||
|
|
||||||
|
open import FFOL
|
||||||
|
open import Agda.Primitive
|
||||||
|
open import ListUtil
|
||||||
|
|
||||||
|
data Con : Set₁
|
||||||
|
data TmVar : Con → Set₁
|
||||||
|
data Tm : Con → Set₁
|
||||||
|
data For : Con → Set₁
|
||||||
|
data Con where
|
||||||
|
◇ : Con
|
||||||
|
_▹ₜ : Con → Con
|
||||||
|
_▹ₚ_ : (Γ : Con) → For Γ → Con
|
||||||
|
|
||||||
|
variable
|
||||||
|
Γ Δ Ξ : Con
|
||||||
|
|
||||||
|
-- A term variable is a de-bruijn variable, TmVar n ≈ ⟦0,n-1⟧
|
||||||
|
data TmVar where
|
||||||
|
tvzero : TmVar (Γ ▹ₜ)
|
||||||
|
tvnext : TmVar Γ → TmVar (Γ ▹ₜ)
|
||||||
|
|
||||||
|
-- For now, we only have term variables (no function symbol)
|
||||||
|
data Tm where
|
||||||
|
var : TmVar Γ → Tm Γ
|
||||||
|
|
||||||
|
-- Now we can define formulæ
|
||||||
|
data For where
|
||||||
|
R : Tm Γ → Tm Γ → For Γ
|
||||||
|
_⇒_ : For Γ → For Γ → For Γ
|
||||||
|
∀∀ : For (Γ ▹ₜ) → For Γ
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
|
||||||
|
data Sub : Con → Con → Set₁
|
||||||
|
data Ren : Con → Con → Set₁
|
||||||
|
id : Sub Γ Γ
|
||||||
|
idᵣ : Ren Γ Γ
|
||||||
|
_∘_ : {Γ Δ Ξ : Con} → Sub Δ Ξ → Sub Γ Δ → Sub Γ Ξ
|
||||||
|
_∘ᵣ_ : {Γ Δ Ξ : Con} → Ren Δ Ξ → Ren Γ Δ → Ren Γ Ξ
|
||||||
|
_[_]t : Tm Γ → Sub Δ Γ → Tm Δ
|
||||||
|
_[_]f : For Γ → Sub Δ Γ → For Δ
|
||||||
|
_[_]tvᵣ : TmVar Γ → Ren Δ Γ → TmVar Δ
|
||||||
|
_[_]tᵣ : Tm Γ → Ren Δ Γ → Tm Δ
|
||||||
|
_[_]fᵣ : For Γ → Ren Δ Γ → For Δ
|
||||||
|
[]f-∘ : {Γ Δ Ξ : Con} → {α : Sub Ξ Δ}{β : Sub Δ Γ}{A : For Γ} → A [ β ∘ α ]f ≡ (A [ β ]f) [ α ]f
|
||||||
|
[]t-∘ : {Γ Δ Ξ : Con} → {α : Sub Ξ Δ}{β : Sub Δ Γ}{t : Tm Γ} → t [ β ∘ α ]t ≡ (t [ β ]t) [ α ]t
|
||||||
|
[]fᵣ-∘ᵣ : {Γ Δ Ξ : Con} → {α : Ren Ξ Δ}{β : Ren Δ Γ}{A : For Γ} → A [ β ∘ᵣ α ]fᵣ ≡ (A [ β ]fᵣ) [ α ]fᵣ
|
||||||
|
[]tᵣ-∘ᵣ : {Γ Δ Ξ : Con} → {α : Ren Ξ Δ}{β : Ren Δ Γ}{t : Tm Γ} → t [ β ∘ᵣ α ]tᵣ ≡ (t [ β ]tᵣ) [ α ]tᵣ
|
||||||
|
data PfVar : (Γ : Con) → For Γ → Prop₁
|
||||||
|
data Pf : (Γ : Con) → For Γ → Prop₁
|
||||||
|
πₜ¹ : Sub Δ (Γ ▹ₜ) → Sub Δ Γ
|
||||||
|
πₜ² : Sub Δ (Γ ▹ₜ) → Tm Δ
|
||||||
|
πₚ¹ : {Γ Δ : Con} {A : For Γ} → Sub Δ (Γ ▹ₚ A) → Sub Δ Γ
|
||||||
|
πₚ² : {Γ Δ : Con} {A : For Γ} → (σ : Sub Δ (Γ ▹ₚ A)) → Pf Δ (A [ πₚ¹ σ ]f)
|
||||||
|
_[_]p : {Γ Δ : Con} → {A : For Γ} → Pf Γ A → (σ : Sub Δ Γ) → Pf Δ (A [ σ ]f)
|
||||||
|
_[_]pvᵣ : {Γ Δ : Con} → {A : For Γ} → PfVar Γ A → (σ : Ren Δ Γ) → PfVar Δ (A [ σ ]fᵣ)
|
||||||
|
|
||||||
|
data Sub where
|
||||||
|
ε : Sub Γ ◇
|
||||||
|
_,ₜ_ : Sub Δ Γ → Tm Δ → Sub Δ (Γ ▹ₜ)
|
||||||
|
_,ₚ_ : {A : For Γ} → (σ : Sub Δ Γ) → Pf Δ (A [ σ ]f) → Sub Δ (Γ ▹ₚ A)
|
||||||
|
|
||||||
|
πₜ¹ (σ ,ₜ t) = σ
|
||||||
|
πₜ² (σ ,ₜ t) = t
|
||||||
|
πₚ¹ (σ ,ₚ pf) = σ
|
||||||
|
πₚ² (σ ,ₚ pf) = pf
|
||||||
|
|
||||||
|
|
||||||
|
data Ren where
|
||||||
|
εᵣ : Ren Γ ◇
|
||||||
|
_,ₜᵣ_ : Ren Δ Γ → TmVar Δ → Ren Δ (Γ ▹ₜ)
|
||||||
|
_,ₚᵣ_ : {A : For Γ} → (σ : Ren Δ Γ) → PfVar Δ (A [ σ ]fᵣ) → Ren Δ (Γ ▹ₚ A)
|
||||||
|
|
||||||
|
πₜ¹ᵣ : Ren Δ (Γ ▹ₜ) → Ren Δ Γ
|
||||||
|
πₜ²ᵣ : Ren Δ (Γ ▹ₜ) → TmVar Δ
|
||||||
|
πₚ¹ᵣ : {Γ Δ : Con} {A : For Γ} → Ren Δ (Γ ▹ₚ A) → Ren Δ Γ
|
||||||
|
πₚ²ᵣ : {Γ Δ : Con} {A : For Γ} → (σ : Ren Δ (Γ ▹ₚ A)) → PfVar Δ (A [ πₚ¹ᵣ σ ]fᵣ)
|
||||||
|
πₜ¹ᵣ (σ ,ₜᵣ t) = σ
|
||||||
|
πₜ²ᵣ (σ ,ₜᵣ t) = t
|
||||||
|
πₚ¹ᵣ (σ ,ₚᵣ pf) = σ
|
||||||
|
πₚ²ᵣ (σ ,ₚᵣ pf) = pf
|
||||||
|
|
||||||
|
liftᵣₜ : Ren Δ Γ → Ren (Δ ▹ₜ) (Γ ▹ₜ)
|
||||||
|
liftᵣₜ εᵣ = εᵣ ,ₜᵣ tvzero
|
||||||
|
liftᵣₜ (σ ,ₜᵣ t) = (liftᵣₜ σ) ,ₜᵣ tvzero
|
||||||
|
liftᵣₜ (σ ,ₚᵣ p) = {!!}
|
||||||
|
idᵣ {◇} = εᵣ
|
||||||
|
idᵣ {Γ ▹ₜ} = liftᵣₜ (idᵣ {Γ})
|
||||||
|
idᵣ {Γ ▹ₚ A} = {!!}
|
||||||
|
|
||||||
|
εᵣ ∘ᵣ β = εᵣ
|
||||||
|
(α ,ₜᵣ t) ∘ᵣ β = (α ∘ᵣ β) ,ₜᵣ (t [ β ]tvᵣ)
|
||||||
|
(α ,ₚᵣ pf) ∘ᵣ β = (α ∘ᵣ β) ,ₚᵣ substP (PfVar _) (≡sym []fᵣ-∘ᵣ) (pf [ β ]pvᵣ)
|
||||||
|
|
||||||
|
tvzero [ _ ,ₜᵣ tv ]tvᵣ = tv
|
||||||
|
tvnext tv [ σ ,ₜᵣ _ ]tvᵣ = tv [ σ ]tvᵣ
|
||||||
|
var tv [ σ ]tᵣ = var (tv [ σ ]tvᵣ)
|
||||||
|
(R t u) [ σ ]fᵣ = R (t [ σ ]tᵣ) (u [ σ ]tᵣ)
|
||||||
|
(A ⇒ B) [ σ ]fᵣ = (A [ σ ]fᵣ) ⇒ (B [ σ ]fᵣ)
|
||||||
|
(∀∀ A) [ σ ]fᵣ = ∀∀ (A [ (σ ∘ᵣ πₜ¹ᵣ idᵣ) ,ₜᵣ (πₜ²ᵣ idᵣ) ]fᵣ)
|
||||||
|
|
||||||
|
|
||||||
|
{-
|
||||||
|
-- We now show how we can extend renamings
|
||||||
|
rightRen :{A : For Δₜ} → Ren Γₚ Δₚ → Ren Γₚ (Δₚ ▹p⁰ A)
|
||||||
|
rightRen zeroRen = zeroRen
|
||||||
|
rightRen (leftRen x h) = leftRen (pvnext x) (rightRen h)
|
||||||
|
bothRen : {A : For Γₜ} → Ren Γₚ Δₚ → Ren (Γₚ ▹p⁰ A) (Δₚ ▹p⁰ A)
|
||||||
|
bothRen zeroRen = leftRen pvzero zeroRen
|
||||||
|
bothRen (leftRen x h) = leftRen pvzero (leftRen (pvnext x) (rightRen h))
|
||||||
|
reflRen : Ren Γₚ Γₚ
|
||||||
|
reflRen {Γₚ = ◇p} = zeroRen
|
||||||
|
reflRen {Γₚ = Γₚ ▹p⁰ x} = bothRen reflRen
|
||||||
|
-}
|
||||||
|
|
||||||
|
id = {!!}
|
||||||
|
ε ∘ β = ε
|
||||||
|
(α ,ₜ t) ∘ β = (α ∘ β) ,ₜ (t [ β ]t)
|
||||||
|
(α ,ₚ pf) ∘ β = (α ∘ β) ,ₚ substP (Pf _) (≡sym []f-∘) (pf [ β ]p)
|
||||||
|
|
||||||
|
var tvzero [ σ ,ₜ t ]t = t
|
||||||
|
var (tvnext tv) [ σ ,ₜ t ]t = var tv [ σ ]t
|
||||||
|
(R t u) [ σ ]f = R (t [ σ ]t) (u [ σ ]t)
|
||||||
|
(A ⇒ B) [ σ ]f = (A [ σ ]f) ⇒ (B [ σ ]f)
|
||||||
|
(∀∀ A) [ σ ]f = ∀∀ (A [ (σ ∘ πₜ¹ id) ,ₜ πₜ² id ]f)
|
||||||
|
|
||||||
|
[]t-∘ {β = β ,ₜ t} {t = var tvzero} = {!!}
|
||||||
|
[]t-∘ {t = var (tvnext tv)} = {!!}
|
||||||
|
[]f-∘ {A = R t u} = {!cong₂ R!}
|
||||||
|
[]f-∘ {A = A ⇒ B} = {!!}
|
||||||
|
[]f-∘ {A = ∀∀ A} = {!!}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
data PfVar where
|
||||||
|
pvzero : {A : For Γ} → PfVar (Γ ▹ₚ A) (A [ πₚ¹ id ]f)
|
||||||
|
pvnext : {A B : For Γ} → PfVar Γ A → PfVar (Γ ▹ₚ B) (A [ πₚ¹ id ]f)
|
||||||
|
data Pf where
|
||||||
|
var : {A : For Γ} → PfVar Γ A → Pf Γ A
|
||||||
|
app : {A B : For Γ} → Pf Γ (A ⇒ B) → Pf Γ A → Pf Γ B
|
||||||
|
lam : {A B : For Γ} → Pf (Γ ▹ₚ A) (B [ πₚ¹ id ]f) → Pf Γ (A ⇒ B)
|
||||||
|
p∀∀e : {A : For (Γ ▹ₜ)} → {t : Tm Γ} → Pf Γ (∀∀ A) → Pf Γ (A [ id ,ₜ t ]f)
|
||||||
|
p∀∀i : {A : For (Γ ▹ₜ)} → Pf (Γ ▹ₜ) A → Pf Γ (∀∀ A)
|
||||||
|
|
||||||
|
var pvzero [ σ ,ₚ pf ]p = {!pf!}
|
||||||
|
var (pvnext pv) [ σ ]p = {!!}
|
||||||
|
app pf pf' [ σ ]p = {!!}
|
||||||
|
lam pf [ σ ]p = {!!}
|
||||||
|
p∀∀e pf [ σ ]p = {!!}
|
||||||
|
p∀∀i pf [ σ ]p = {!!}
|
||||||
|
|
||||||
|
{-
|
||||||
|
{-- TERM CONTEXTS - TERMS - FORMULAE - TERM SUBSTITUTIONS --}
|
||||||
|
|
||||||
|
-- Term contexts are isomorphic to Nat
|
||||||
|
data Cont : Set₁ where
|
||||||
|
◇t : Cont
|
||||||
|
_▹t⁰ : Cont → Cont
|
||||||
|
|
||||||
|
variable
|
||||||
|
Γₜ Δₜ Ξₜ : Cont
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- Then we define term substitutions
|
||||||
|
|
||||||
|
-- We write down the access functions from the algebra, in restricted versions
|
||||||
|
-- And their equalities (the fact that there are reciprocical)
|
||||||
|
πₜ²∘,ₜ : {σₜ : Subt Δₜ Γₜ} → {t : Tm Δₜ} → πₜ² (σₜ ,ₜ t) ≡ t
|
||||||
|
πₜ²∘,ₜ = refl
|
||||||
|
πₜ¹∘,ₜ : {σₜ : Subt Δₜ Γₜ} → {t : Tm Δₜ} → πₜ¹ (σₜ ,ₜ t) ≡ σₜ
|
||||||
|
πₜ¹∘,ₜ = refl
|
||||||
|
,ₜ∘πₜ : {σₜ : Subt Δₜ (Γₜ ▹t⁰)} → (πₜ¹ σₜ) ,ₜ (πₜ² σₜ) ≡ σₜ
|
||||||
|
,ₜ∘πₜ {σₜ = σₜ ,ₜ t} = refl
|
||||||
|
|
||||||
|
|
||||||
|
-- We now define the action of term substitutions on terms
|
||||||
|
|
||||||
|
-- We define weakenings of the term-context for terms
|
||||||
|
-- «A term of n variables can be seen as a term of n+1 variables»
|
||||||
|
wkₜt : Tm Γₜ → Tm (Γₜ ▹t⁰)
|
||||||
|
wkₜt (var tv) = var (tvnext tv)
|
||||||
|
|
||||||
|
-- From a substition into n variables, we get a substitution into n+1 variables which don't use the last one
|
||||||
|
wkₜσₜ : Subt Δₜ Γₜ → Subt (Δₜ ▹t⁰) Γₜ
|
||||||
|
wkₜσₜ εₜ = εₜ
|
||||||
|
wkₜσₜ (σ ,ₜ t) = (wkₜσₜ σ) ,ₜ (wkₜt t)
|
||||||
|
|
||||||
|
-- From a substitution into n variables, we construct a substitution from n+1 variables to n+1 variables which maps it to itself
|
||||||
|
-- i.e. 0 -> 0 and for all i ->(old) σ(i) we get i+1 -> σ(i)+1
|
||||||
|
lfₜσₜ : Subt Δₜ Γₜ → Subt (Δₜ ▹t⁰) (Γₜ ▹t⁰)
|
||||||
|
lfₜσₜ σ = (wkₜσₜ σ) ,ₜ (var tvzero)
|
||||||
|
|
||||||
|
-- We show how wkₜt and interacts with [_]t
|
||||||
|
wkₜ[]t : {α : Subt Δₜ Γₜ} → {t : Tm Γₜ} → wkₜt (t [ α ]t) ≡ (wkₜt t [ lfₜσₜ α ]t)
|
||||||
|
wkₜ[]t {α = α ,ₜ t} {var tvzero} = refl
|
||||||
|
wkₜ[]t {α = α ,ₜ t} {var (tvnext tv)} = wkₜ[]t {t = var tv}
|
||||||
|
|
||||||
|
-- We can now subst on formulæ
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- We now can define identity and composition of term substitutions
|
||||||
|
idₜ : Subt Γₜ Γₜ
|
||||||
|
idₜ {◇t} = εₜ
|
||||||
|
idₜ {Γₜ ▹t⁰} = lfₜσₜ (idₜ {Γₜ})
|
||||||
|
_∘ₜ_ : Subt Δₜ Γₜ → Subt Ξₜ Δₜ → Subt Ξₜ Γₜ
|
||||||
|
εₜ ∘ₜ β = εₜ
|
||||||
|
(α ,ₜ x) ∘ₜ β = (α ∘ₜ β) ,ₜ (x [ β ]t)
|
||||||
|
|
||||||
|
-- We now have to show all their equalities (idₜ and ∘ₜ respect []t, []f, wkₜ, lfₜ, categorical rules
|
||||||
|
|
||||||
|
-- Substitution for terms
|
||||||
|
[]t-id : {t : Tm Γₜ} → t [ idₜ {Γₜ} ]t ≡ t
|
||||||
|
[]t-id {Γₜ ▹t⁰} {var tvzero} = refl
|
||||||
|
[]t-id {Γₜ ▹t⁰} {var (tvnext tv)} = substP (λ t → t ≡ var (tvnext tv)) (wkₜ[]t {t = var tv}) (substP (λ t → wkₜt t ≡ var (tvnext tv)) (≡sym ([]t-id {t = var tv})) refl)
|
||||||
|
[]t-∘ : {α : Subt Ξₜ Δₜ} → {β : Subt Δₜ Γₜ} → {t : Tm Γₜ} → t [ β ∘ₜ α ]t ≡ (t [ β ]t) [ α ]t
|
||||||
|
[]t-∘ {α = α} {β = β ,ₜ t} {t = var tvzero} = refl
|
||||||
|
[]t-∘ {α = α} {β = β ,ₜ t} {t = var (tvnext tv)} = []t-∘ {t = var tv}
|
||||||
|
|
||||||
|
-- Weakenings and liftings of substitutions
|
||||||
|
wkₜσₜ-∘ₜl : {α : Subt Ξₜ Δₜ} → {β : Subt Δₜ Γₜ} → wkₜσₜ (β ∘ₜ α) ≡ (wkₜσₜ β ∘ₜ lfₜσₜ α)
|
||||||
|
wkₜσₜ-∘ₜl {β = εₜ} = refl
|
||||||
|
wkₜσₜ-∘ₜl {β = β ,ₜ t} = cong₂ _,ₜ_ wkₜσₜ-∘ₜl (wkₜ[]t {t = t})
|
||||||
|
wkₜσₜ-∘ₜr : {α : Subt Γₜ Δₜ} → {β : Subt Ξₜ Γₜ} → α ∘ₜ (wkₜσₜ β) ≡ wkₜσₜ (α ∘ₜ β)
|
||||||
|
wkₜσₜ-∘ₜr {α = εₜ} = refl
|
||||||
|
wkₜσₜ-∘ₜr {α = α ,ₜ var tv} = cong₂ _,ₜ_ (wkₜσₜ-∘ₜr {α = α}) (≡sym (wkₜ[]t {t = var tv}))
|
||||||
|
lfₜσₜ-∘ : {α : Subt Ξₜ Δₜ} → {β : Subt Δₜ Γₜ} → lfₜσₜ (β ∘ₜ α) ≡ (lfₜσₜ β) ∘ₜ (lfₜσₜ α)
|
||||||
|
lfₜσₜ-∘ {α = α} {β = εₜ} = refl
|
||||||
|
lfₜσₜ-∘ {α = α} {β = β ,ₜ t} = cong₂ _,ₜ_ (cong₂ _,ₜ_ wkₜσₜ-∘ₜl (wkₜ[]t {t = t})) refl
|
||||||
|
|
||||||
|
-- Cancelling a weakening with a ,ₜ
|
||||||
|
wkₜ[,]t : {t : Tm Γₜ}{u : Tm Δₜ}{β : Subt Δₜ Γₜ} → (wkₜt t) [ β ,ₜ u ]t ≡ t [ β ]t
|
||||||
|
wkₜ[,]t {t = var tvzero} = refl
|
||||||
|
wkₜ[,]t {t = var (tvnext tv)} = refl
|
||||||
|
wkₜ∘ₜ,ₜ : {α : Subt Γₜ Δₜ}{β : Subt Ξₜ Γₜ}{t : Tm Ξₜ} → (wkₜσₜ α) ∘ₜ (β ,ₜ t) ≡ (α ∘ₜ β)
|
||||||
|
wkₜ∘ₜ,ₜ {α = εₜ} = refl
|
||||||
|
wkₜ∘ₜ,ₜ {α = α ,ₜ t} {β = β} = cong₂ _,ₜ_ (wkₜ∘ₜ,ₜ {α = α}) (wkₜ[,]t {t = t} {β = β})
|
||||||
|
|
||||||
|
-- Categorical rules are respected by idₜ and ∘ₜ
|
||||||
|
idlₜ : {α : Subt Δₜ Γₜ} → idₜ ∘ₜ α ≡ α
|
||||||
|
idlₜ {α = εₜ} = refl
|
||||||
|
idlₜ {α = α ,ₜ x} = cong₂ _,ₜ_ (≡tran wkₜ∘ₜ,ₜ idlₜ) refl
|
||||||
|
idrₜ : {α : Subt Δₜ Γₜ} → α ∘ₜ idₜ ≡ α
|
||||||
|
idrₜ {α = εₜ} = refl
|
||||||
|
idrₜ {α = α ,ₜ x} = cong₂ _,ₜ_ idrₜ []t-id
|
||||||
|
∘ₜ-ass : {Γₜ Δₜ Ξₜ Ψₜ : Cont}{α : Subt Γₜ Δₜ}{β : Subt Δₜ Ξₜ}{γ : Subt Ξₜ Ψₜ} → (γ ∘ₜ β) ∘ₜ α ≡ γ ∘ₜ (β ∘ₜ α)
|
||||||
|
∘ₜ-ass {α = α} {β} {εₜ} = refl
|
||||||
|
∘ₜ-ass {α = α} {β} {γ ,ₜ x} = cong₂ _,ₜ_ ∘ₜ-ass (≡sym ([]t-∘ {t = x}))
|
||||||
|
|
||||||
|
-- Unicity of the terminal morphism
|
||||||
|
εₜ-u : {σₜ : Subt Γₜ ◇t} → σₜ ≡ εₜ
|
||||||
|
εₜ-u {σₜ = εₜ} = refl
|
||||||
|
|
||||||
|
-- Substitution for formulæ
|
||||||
|
[]f-id : {F : For Γₜ} → F [ idₜ {Γₜ} ]f ≡ F
|
||||||
|
[]f-id {F = R t u} = cong₂ R []t-id []t-id
|
||||||
|
[]f-id {F = F ⇒ G} = cong₂ _⇒_ []f-id []f-id
|
||||||
|
[]f-id {F = ∀∀ F} = cong ∀∀ []f-id
|
||||||
|
[]f-∘ : {α : Subt Ξₜ Δₜ} → {β : Subt Δₜ Γₜ} → {F : For Γₜ} → F [ β ∘ₜ α ]f ≡ (F [ β ]f) [ α ]f
|
||||||
|
[]f-∘ {α = α} {β = β} {F = R t u} = cong₂ R ([]t-∘ {α = α} {β = β} {t = t}) ([]t-∘ {α = α} {β = β} {t = u})
|
||||||
|
[]f-∘ {F = F ⇒ G} = cong₂ _⇒_ []f-∘ []f-∘
|
||||||
|
[]f-∘ {F = ∀∀ F} = cong ∀∀ (≡tran (cong (λ σ → F [ σ ]f) lfₜσₜ-∘) []f-∘)
|
||||||
|
|
||||||
|
-- Substitution for formulæ constructors
|
||||||
|
-- we omit []f-R and []f-⇒ as they are directly refl
|
||||||
|
[]f-∀∀ : {A : For (Γₜ ▹t⁰)} → {σₜ : Subt Δₜ Γₜ} → (∀∀ A) [ σₜ ]f ≡ (∀∀ (A [ (σₜ ∘ₜ πₜ¹ idₜ) ,ₜ πₜ² idₜ ]f))
|
||||||
|
[]f-∀∀ {A = A} = cong ∀∀ (cong (_[_]f A) (cong₂ _,ₜ_ (≡tran (cong wkₜσₜ (≡sym idrₜ)) (≡sym wkₜσₜ-∘ₜr)) refl))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- We can now define proof contexts, which are indexed by a term context
|
||||||
|
-- i.e. we know which terms a proof context can use
|
||||||
|
data Conp : Cont → Set₁ where
|
||||||
|
◇p : Conp Γₜ
|
||||||
|
_▹p⁰_ : Conp Γₜ → For Γₜ → Conp Γₜ
|
||||||
|
|
||||||
|
variable
|
||||||
|
Γₚ Γₚ' : Conp Γₜ
|
||||||
|
Δₚ Δₚ' : Conp Δₜ
|
||||||
|
Ξₚ Ξₚ' : Conp Ξₜ
|
||||||
|
|
||||||
|
-- The actions of Subt's is extended to contexts
|
||||||
|
_[_]c : Conp Γₜ → Subt Δₜ Γₜ → Conp Δₜ
|
||||||
|
◇p [ σₜ ]c = ◇p
|
||||||
|
(Γₚ ▹p⁰ A) [ σₜ ]c = (Γₚ [ σₜ ]c) ▹p⁰ (A [ σₜ ]f)
|
||||||
|
-- This Conp is indeed a functor
|
||||||
|
[]c-id : Γₚ [ idₜ ]c ≡ Γₚ
|
||||||
|
[]c-id {Γₚ = ◇p} = refl
|
||||||
|
[]c-id {Γₚ = Γₚ ▹p⁰ x} = cong₂ _▹p⁰_ []c-id []f-id
|
||||||
|
[]c-∘ : {α : Subt Δₜ Ξₜ} {β : Subt Γₜ Δₜ} {Ξₚ : Conp Ξₜ} → Ξₚ [ α ∘ₜ β ]c ≡ (Ξₚ [ α ]c) [ β ]c
|
||||||
|
[]c-∘ {α = α} {β = β} {◇p} = refl
|
||||||
|
[]c-∘ {α = α} {β = β} {Ξₚ ▹p⁰ A} = cong₂ _▹p⁰_ []c-∘ []f-∘
|
||||||
|
|
||||||
|
|
||||||
|
-- We can also add a term that will not be used in the formulæ already present
|
||||||
|
-- (that's why we use wkₜσₜ)
|
||||||
|
_▹tp : Conp Γₜ → Conp (Γₜ ▹t⁰)
|
||||||
|
Γ ▹tp = Γ [ wkₜσₜ idₜ ]c
|
||||||
|
-- We show how it interacts with ,ₜ and lfₜσₜ
|
||||||
|
▹tp,ₜ : {σₜ : Subt Γₜ Δₜ}{t : Tm Γₜ} → (Γₚ ▹tp) [ σₜ ,ₜ t ]c ≡ Γₚ [ σₜ ]c
|
||||||
|
▹tp,ₜ {Γₚ = Γₚ} = ≡tran (≡sym []c-∘) (cong (λ ξ → Γₚ [ ξ ]c) (≡tran wkₜ∘ₜ,ₜ idlₜ))
|
||||||
|
▹tp-lfₜ : {σ : Subt Δₜ Γₜ} → ((Δₚ ▹tp) [ lfₜσₜ σ ]c) ≡ ((Δₚ [ σ ]c) ▹tp)
|
||||||
|
▹tp-lfₜ {Δₚ = Δₚ} = ≡tran² (≡sym []c-∘) (cong (λ ξ → Δₚ [ ξ ]c) (≡tran² (≡sym wkₜσₜ-∘ₜl) (cong wkₜσₜ (≡tran idlₜ (≡sym idrₜ))) (≡sym wkₜσₜ-∘ₜr))) []c-∘
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- With those contexts, we have everything to define proofs
|
||||||
|
|
||||||
|
|
||||||
|
-- The action on Cont's morphisms of Pf functor
|
||||||
|
_[_]pvₜ : {A : For Δₜ}→ PfVar Δₜ Δₚ A → (σ : Subt Γₜ Δₜ)→ PfVar Γₜ (Δₚ [ σ ]c) (A [ σ ]f)
|
||||||
|
pvzero [ σ ]pvₜ = pvzero
|
||||||
|
pvnext pv [ σ ]pvₜ = pvnext (pv [ σ ]pvₜ)
|
||||||
|
_[_]pₜ : {A : For Δₜ} → Pf Δₜ Δₚ A → (σ : Subt Γₜ Δₜ) → Pf Γₜ (Δₚ [ σ ]c) (A [ σ ]f)
|
||||||
|
var pv [ σ ]pₜ = var (pv [ σ ]pvₜ)
|
||||||
|
app pf pf' [ σ ]pₜ = app (pf [ σ ]pₜ) (pf' [ σ ]pₜ)
|
||||||
|
lam pf [ σ ]pₜ = lam (pf [ σ ]pₜ)
|
||||||
|
_[_]pₜ {Δₚ = Δₚ} {Γₜ = Γₜ} (p∀∀e {A = A} {t = t} pf) σ =
|
||||||
|
substP (λ F → Pf Γₜ (Δₚ [ σ ]c) F) (≡tran² (≡sym []f-∘) (cong (λ σ → A [ σ ]f)
|
||||||
|
(cong₂ _,ₜ_ (≡tran² wkₜ∘ₜ,ₜ idrₜ (≡sym idlₜ)) refl)) ([]f-∘))
|
||||||
|
(p∀∀e {t = t [ σ ]t} (pf [ σ ]pₜ))
|
||||||
|
_[_]pₜ {Γₜ = Γₜ} (p∀∀i pf) σ
|
||||||
|
= p∀∀i (substP (λ Ξₚ → Pf (Γₜ ▹t⁰) (Ξₚ) _) ▹tp-lfₜ (pf [ lfₜσₜ σ ]pₜ))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- We now can create Renamings, a subcategory from (Conp,Subp) that
|
||||||
|
-- A renaming from a context Γₚ to a context Δₚ means when they are seen
|
||||||
|
-- as lists, that every element of Γₚ is an element of Δₚ
|
||||||
|
-- In other words, we can prove Γₚ from Δₚ using only proof variables (var)
|
||||||
|
|
||||||
|
-- We can extend renamings with term variables
|
||||||
|
PfVar▹tp : {A : For Δₜ} → PfVar Δₜ Δₚ A → PfVar (Δₜ ▹t⁰) (Δₚ ▹tp) (A [ wkₜσₜ idₜ ]f)
|
||||||
|
PfVar▹tp pvzero = pvzero
|
||||||
|
PfVar▹tp (pvnext x) = pvnext (PfVar▹tp x)
|
||||||
|
Ren▹tp : Ren Γₚ Δₚ → Ren (Γₚ ▹tp) (Δₚ ▹tp)
|
||||||
|
Ren▹tp zeroRen = zeroRen
|
||||||
|
Ren▹tp (leftRen x s) = leftRen (PfVar▹tp x) (Ren▹tp s)
|
||||||
|
|
||||||
|
-- Renamings can be used to (strongly) weaken proofs
|
||||||
|
wkᵣpv : {A : For Δₜ} → Ren Δₚ' Δₚ → PfVar Δₜ Δₚ' A → PfVar Δₜ Δₚ A
|
||||||
|
wkᵣpv (leftRen x x₁) pvzero = x
|
||||||
|
wkᵣpv (leftRen x x₁) (pvnext s) = wkᵣpv x₁ s
|
||||||
|
wkᵣp : {A : For Δₜ} → Ren Δₚ Δₚ' → Pf Δₜ Δₚ A → Pf Δₜ Δₚ' A
|
||||||
|
wkᵣp s (var pv) = var (wkᵣpv s pv)
|
||||||
|
wkᵣp s (app pf pf₁) = app (wkᵣp s pf) (wkᵣp s pf₁)
|
||||||
|
wkᵣp s (lam {A = A} pf) = lam (wkᵣp (bothRen s) pf)
|
||||||
|
wkᵣp s (p∀∀e pf) = p∀∀e (wkᵣp s pf)
|
||||||
|
wkᵣp s (p∀∀i pf) = p∀∀i (wkᵣp (Ren▹tp s) pf)
|
||||||
|
|
||||||
|
|
||||||
|
-- But we need something stronger than just renamings
|
||||||
|
-- introducing: Proof substitutions
|
||||||
|
-- They are basicly a list of proofs for the formulæ contained in
|
||||||
|
-- the goal context.
|
||||||
|
-- It is not defined between all contexts, only those with the same term context
|
||||||
|
data Subp : {Δₜ : Cont} → Conp Δₜ → Conp Δₜ → Prop₁ where
|
||||||
|
εₚ : Subp Δₚ ◇p
|
||||||
|
|
||||||
|
|
||||||
|
-- We write down the access functions from the algebra, in restricted versions
|
||||||
|
|
||||||
|
-- The action of Cont's morphisms on Subp
|
||||||
|
_[_]σₚ : Subp {Δₜ} Δₚ Δₚ' → (σ : Subt Γₜ Δₜ) → Subp {Γₜ} (Δₚ [ σ ]c) (Δₚ' [ σ ]c)
|
||||||
|
εₚ [ σₜ ]σₚ = εₚ
|
||||||
|
(σₚ ,ₚ pf) [ σₜ ]σₚ = (σₚ [ σₜ ]σₚ) ,ₚ (pf [ σₜ ]pₜ)
|
||||||
|
|
||||||
|
-- They are indeed stronger than renamings
|
||||||
|
Ren→Sub : Ren Δₚ Δₚ' → Subp {Δₜ} Δₚ' Δₚ
|
||||||
|
Ren→Sub zeroRen = εₚ
|
||||||
|
Ren→Sub (leftRen x s) = Ren→Sub s ,ₚ var x
|
||||||
|
|
||||||
|
|
||||||
|
-- From a substition into n variables, we get a substitution into n+1 variables which don't use the last one
|
||||||
|
wkₚσₚ : {Δₜ : Cont} {Δₚ Γₚ : Conp Δₜ}{A : For Δₜ} → Subp {Δₜ} Δₚ Γₚ → Subp {Δₜ} (Δₚ ▹p⁰ A) Γₚ
|
||||||
|
wkₚσₚ εₚ = εₚ
|
||||||
|
wkₚσₚ (σₚ ,ₚ pf) = (wkₚσₚ σₚ) ,ₚ wkᵣp (rightRen reflRen) pf
|
||||||
|
|
||||||
|
-- From a substitution into n variables, we construct a substitution from n+1 variables to n+1 variables which maps it to itself
|
||||||
|
-- i.e. 0 -> 0 and for all i ->(old) σ(i) we get i+1 -> σ(i)+1
|
||||||
|
lfₚσₚ : {Δₜ : Cont}{Δₚ Γₚ : Conp Δₜ}{A : For Δₜ} → Subp {Δₜ} Δₚ Γₚ → Subp {Δₜ} (Δₚ ▹p⁰ A) (Γₚ ▹p⁰ A)
|
||||||
|
lfₚσₚ σ = (wkₚσₚ σ) ,ₚ (var pvzero)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
wkₜσₚ : Subp {Δₜ} Δₚ' Δₚ → Subp {Δₜ ▹t⁰} (Δₚ' ▹tp) (Δₚ ▹tp)
|
||||||
|
wkₜσₚ εₚ = εₚ
|
||||||
|
wkₜσₚ {Δₜ = Δₜ} (_,ₚ_ {A = A} σₚ pf) = (wkₜσₚ σₚ) ,ₚ substP (λ Ξₚ → Pf (Δₜ ▹t⁰) Ξₚ (A [ wkₜσₜ idₜ ]f)) refl (_[_]pₜ {Γₜ = Δₜ ▹t⁰} pf (wkₜσₜ idₜ))
|
||||||
|
|
||||||
|
_[_]p : {A : For Δₜ} → Pf Δₜ Δₚ A → (σ : Subp {Δₜ} Δₚ' Δₚ) → Pf Δₜ Δₚ' A
|
||||||
|
var pvzero [ σ ,ₚ pf ]p = pf
|
||||||
|
var (pvnext pv) [ σ ,ₚ pf ]p = var pv [ σ ]p
|
||||||
|
app pf pf₁ [ σ ]p = app (pf [ σ ]p) (pf₁ [ σ ]p)
|
||||||
|
lam pf [ σ ]p = lam (pf [ wkₚσₚ σ ,ₚ var pvzero ]p)
|
||||||
|
p∀∀e pf [ σ ]p = p∀∀e (pf [ σ ]p)
|
||||||
|
p∀∀i pf [ σ ]p = p∀∀i (pf [ wkₜσₚ σ ]p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- We can now define identity and composition on proof substitutions
|
||||||
|
idₚ : Subp {Δₜ} Δₚ Δₚ
|
||||||
|
idₚ {Δₚ = ◇p} = εₚ
|
||||||
|
idₚ {Δₚ = Δₚ ▹p⁰ x} = lfₚσₚ (idₚ {Δₚ = Δₚ})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- We can now merge the two notions of contexts, substitutions, and everything
|
||||||
|
record Con : Set₁ where
|
||||||
|
constructor con
|
||||||
|
field
|
||||||
|
t : Cont
|
||||||
|
p : Conp t
|
||||||
|
|
||||||
|
variable
|
||||||
|
Γ Δ Ξ : Con
|
||||||
|
|
||||||
|
record Sub (Γ : Con) (Δ : Con) : Set₁ where
|
||||||
|
constructor sub
|
||||||
|
field
|
||||||
|
t : Subt (Con.t Γ) (Con.t Δ)
|
||||||
|
p : Subp {Con.t Γ} (Con.p Γ) ((Con.p Δ) [ t ]c)
|
||||||
|
|
||||||
|
-- We need this to apply term-substitution theorems to global substitutions
|
||||||
|
sub= : {Γ Δ : Con}{σₜ σₜ' : Subt (Con.t Γ) (Con.t Δ)} →
|
||||||
|
σₜ ≡ σₜ' →
|
||||||
|
{σₚ : Subp {Con.t Γ} (Con.p Γ) ((Con.p Δ) [ σₜ ]c)}
|
||||||
|
{σₚ' : Subp {Con.t Γ} (Con.p Γ) ((Con.p Δ) [ σₜ' ]c)} →
|
||||||
|
sub σₜ σₚ ≡ sub σₜ' σₚ'
|
||||||
|
sub= refl = refl
|
||||||
|
|
||||||
|
-- (Con,Sub) is a category with an initial object
|
||||||
|
id : Sub Γ Γ
|
||||||
|
id {Γ} = sub idₜ (substP (Subp _) (≡sym []c-id) idₚ)
|
||||||
|
_∘_ : Sub Δ Ξ → Sub Γ Δ → Sub Γ Ξ
|
||||||
|
sub αₜ αₚ ∘ sub βₜ βₚ = sub (αₜ ∘ₜ βₜ) (substP (Subp _) (≡sym []c-∘) (αₚ [ βₜ ]σₚ) ∘ₚ βₚ)
|
||||||
|
|
||||||
|
|
||||||
|
-- We have our two context extension operators
|
||||||
|
_▹t : Con → Con
|
||||||
|
Γ ▹t = con ((Con.t Γ) ▹t⁰) (Con.p Γ ▹tp)
|
||||||
|
_▹p_ : (Γ : Con) → For (Con.t Γ) → Con
|
||||||
|
Γ ▹p A = con (Con.t Γ) (Con.p Γ ▹p⁰ A)
|
||||||
|
|
||||||
|
-- We define the access function from the algebra, but defined for fully-featured substitutions
|
||||||
|
-- For term substitutions
|
||||||
|
πₜ¹* : {Γ Δ : Con} → Sub Δ (Γ ▹t) → Sub Δ Γ
|
||||||
|
πₜ¹* (sub (σₜ ,ₜ t) σₚ) = sub σₜ (substP (Subp _) ▹tp,ₜ σₚ)
|
||||||
|
πₜ²* : {Γ Δ : Con} → Sub Δ (Γ ▹t) → Tm (Con.t Δ)
|
||||||
|
πₜ²* (sub (σₜ ,ₜ t) σₚ) = t
|
||||||
|
_,ₜ*_ : {Γ Δ : Con} → Sub Δ Γ → Tm (Con.t Δ) → Sub Δ (Γ ▹t)
|
||||||
|
(sub σₜ σₚ) ,ₜ* t = sub (σₜ ,ₜ t) (substP (Subp _) (≡sym ▹tp,ₜ) σₚ)
|
||||||
|
-- And the equations
|
||||||
|
πₜ²∘,ₜ* : {Γ Δ : Con} → {σ : Sub Δ Γ} → {t : Tm (Con.t Δ)} → πₜ²* (σ ,ₜ* t) ≡ t
|
||||||
|
πₜ²∘,ₜ* = refl
|
||||||
|
πₜ¹∘,ₜ* : {Γ Δ : Con} → {σ : Sub Δ Γ} → {t : Tm (Con.t Δ)} → πₜ¹* (σ ,ₜ* t) ≡ σ
|
||||||
|
πₜ¹∘,ₜ* {Γ}{Δ}{σ}{t} = sub= refl
|
||||||
|
,ₜ∘πₜ* : {Γ Δ : Con} → {σ : Sub Δ (Γ ▹t)} → (πₜ¹* σ) ,ₜ* (πₜ²* σ) ≡ σ
|
||||||
|
,ₜ∘πₜ* {Γ} {Δ} {sub (σₜ ,ₜ t) σₚ} = sub= refl
|
||||||
|
,ₜ∘* : {Γ Δ Ξ : Con}{σ : Sub Γ Ξ}{δ : Sub Δ Γ}{t : Tm (Con.t Γ)} → (σ ,ₜ* t) ∘ δ ≡ (σ ∘ δ) ,ₜ* (t [ Sub.t δ ]t)
|
||||||
|
,ₜ∘* {Γ} {Δ} {Ξ} {sub σₜ σₚ} {sub δₜ δₚ} {t} = sub= refl
|
||||||
|
|
||||||
|
|
||||||
|
-- And for proof substitutions
|
||||||
|
πₚ¹* : {Γ Δ : Con} {A : For (Con.t Γ)} → Sub Δ (Γ ▹p A) → Sub Δ Γ
|
||||||
|
πₚ¹* (sub σₜ σaₚ) = sub σₜ (πₚ¹ σaₚ)
|
||||||
|
πₚ²* : {Γ Δ : Con} {F : For (Con.t Γ)} (σ : Sub Δ (Γ ▹p F)) → Pf (Con.t Δ) (Con.p Δ) (F [ Sub.t (πₚ¹* σ) ]f)
|
||||||
|
πₚ²* (sub σₜ (σₚ ,ₚ pf)) = pf
|
||||||
|
_,ₚ*_ : {Γ Δ : Con} {F : For (Con.t Γ)} (σ : Sub Δ Γ) → Pf (Con.t Δ) (Con.p Δ) (F [ Sub.t σ ]f) → Sub Δ (Γ ▹p F)
|
||||||
|
sub σₜ σₚ ,ₚ* pf = sub σₜ (σₚ ,ₚ pf)
|
||||||
|
-- And the equations
|
||||||
|
,ₚ∘πₚ : {Γ Δ : Con} → {F : For (Con.t Γ)} → {σ : Sub Δ (Γ ▹p F)} → (πₚ¹* σ) ,ₚ* (πₚ²* σ) ≡ σ
|
||||||
|
,ₚ∘πₚ {σ = sub σₜ (σₚ ,ₚ p)} = refl
|
||||||
|
,ₚ∘ : {Γ Δ Ξ : Con}{σ : Sub Γ Ξ}{δ : Sub Δ Γ}{F : For (Con.t Ξ)}{prf : Pf (Con.t Γ) (Con.p Γ) (F [ Sub.t σ ]f)}
|
||||||
|
→ (σ ,ₚ* prf) ∘ δ ≡ (σ ∘ δ) ,ₚ* (substP (λ F → Pf (Con.t Δ) (Con.p Δ) F) (≡sym []f-∘) ((prf [ Sub.t δ ]pₜ) [ Sub.p δ ]p))
|
||||||
|
,ₚ∘ {Γ}{Δ}{Ξ}{σ = sub σₜ σₚ} {sub δₜ δₚ} {F = A} {prf} = sub= refl
|
||||||
|
|
||||||
|
-- and FINALLY, we compile everything into an implementation of the FFOL record
|
||||||
|
|
||||||
|
ffol : FFOL {lsuc lzero} {lsuc lzero} {lsuc lzero} {lsuc lzero}
|
||||||
|
ffol = record
|
||||||
|
{ Con = Con
|
||||||
|
; Sub = Sub
|
||||||
|
; _∘_ = _∘_
|
||||||
|
; ∘-ass = sub= ∘ₜ-ass
|
||||||
|
; id = id
|
||||||
|
; idl = sub= idlₜ
|
||||||
|
; idr = sub= idrₜ
|
||||||
|
; ◇ = con ◇t ◇p
|
||||||
|
; ε = sub εₜ εₚ
|
||||||
|
; ε-u = sub= εₜ-u
|
||||||
|
; Tm = λ Γ → Tm (Con.t Γ)
|
||||||
|
; _[_]t = λ t σ → t [ Sub.t σ ]t
|
||||||
|
; []t-id = []t-id
|
||||||
|
; []t-∘ = λ {Γ}{Δ}{Ξ}{α}{β}{t} → []t-∘ {α = Sub.t α} {β = Sub.t β} {t = t}
|
||||||
|
; _▹ₜ = _▹t
|
||||||
|
; πₜ¹ = πₜ¹*
|
||||||
|
; πₜ² = πₜ²*
|
||||||
|
; _,ₜ_ = _,ₜ*_
|
||||||
|
; πₜ²∘,ₜ = refl
|
||||||
|
; πₜ¹∘,ₜ = λ {Γ}{Δ}{σ}{t} → πₜ¹∘,ₜ* {Γ}{Δ}{σ}{t}
|
||||||
|
; ,ₜ∘πₜ = ,ₜ∘πₜ*
|
||||||
|
; ,ₜ∘ = λ {Γ}{Δ}{Ξ}{σ}{δ}{t} → ,ₜ∘* {Γ}{Δ}{Ξ}{σ}{δ}{t}
|
||||||
|
; For = λ Γ → For (Con.t Γ)
|
||||||
|
; _[_]f = λ A σ → A [ Sub.t σ ]f
|
||||||
|
; []f-id = []f-id
|
||||||
|
; []f-∘ = []f-∘
|
||||||
|
; R = R
|
||||||
|
; R[] = refl
|
||||||
|
; _⊢_ = λ Γ A → Pf (Con.t Γ) (Con.p Γ) A
|
||||||
|
; _[_]p = λ pf σ → (pf [ Sub.t σ ]pₜ) [ Sub.p σ ]p
|
||||||
|
; _▹ₚ_ = _▹p_
|
||||||
|
; πₚ¹ = πₚ¹*
|
||||||
|
; πₚ² = πₚ²*
|
||||||
|
; _,ₚ_ = _,ₚ*_
|
||||||
|
; ,ₚ∘πₚ = ,ₚ∘πₚ
|
||||||
|
; πₚ¹∘,ₚ = refl
|
||||||
|
; ,ₚ∘ = λ {Γ}{Δ}{Ξ}{σ}{δ}{F}{prf} → ,ₚ∘ {Γ}{Δ}{Ξ}{σ}{δ}{F}{prf}
|
||||||
|
; _⇒_ = _⇒_
|
||||||
|
; []f-⇒ = refl
|
||||||
|
; ∀∀ = ∀∀
|
||||||
|
; []f-∀∀ = []f-∀∀
|
||||||
|
; lam = λ {Γ}{F}{G} pf → substP (λ H → Pf (Con.t Γ) (Con.p Γ) (F ⇒ H)) []f-id (lam pf)
|
||||||
|
; app = app
|
||||||
|
; ∀i = p∀∀i
|
||||||
|
; ∀e = λ {Γ} {F} pf {t} → p∀∀e pf
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
-- We define normal and neutral forms
|
||||||
|
data Ne : (Γₜ : Cont) → (Γₚ : Conp Γₜ) → For Γₜ → Prop₁
|
||||||
|
data Nf : (Γₜ : Cont) → (Γₚ : Conp Γₜ) → For Γₜ → Prop₁
|
||||||
|
data Ne where
|
||||||
|
var : {A : For Γₜ} → PfVar Γₜ Γₚ A → Ne Γₜ Γₚ A
|
||||||
|
app : {A B : For Γₜ} → Ne Γₜ Γₚ (A ⇒ B) → Nf Γₜ Γₚ A → Ne Γₜ Γₚ B
|
||||||
|
p∀∀e : {A : For (Γₜ ▹t⁰)} → {t : Tm Γₜ} → Ne Γₜ Γₚ (∀∀ A) → Ne Γₜ Γₚ (A [ idₜ ,ₜ t ]f)
|
||||||
|
data Nf where
|
||||||
|
R : {t u : Tm Γₜ} → Ne Γₜ Γₚ (R t u) → Nf Γₜ Γₚ (R t u)
|
||||||
|
lam : {A B : For Γₜ} → Nf Γₜ (Γₚ ▹p⁰ A) B → Nf Γₜ Γₚ (A ⇒ B)
|
||||||
|
p∀∀i : {A : For (Γₜ ▹t⁰)} → Nf (Γₜ ▹t⁰) (Γₚ ▹tp) A → Nf Γₜ Γₚ (∀∀ A)
|
||||||
|
|
||||||
|
|
||||||
|
Pf* : (Γₜ : Cont) → Conp Γₜ → Conp Γₜ → Prop₁
|
||||||
|
Pf* Γₜ Γₚ ◇p = ⊤
|
||||||
|
Pf* Γₜ Γₚ (Γₚ' ▹p⁰ A) = (Pf* Γₜ Γₚ Γₚ') ∧ (Pf Γₜ Γₚ A)
|
||||||
|
|
||||||
|
Sub→Pf* : {Γₜ : Cont} {Γₚ Γₚ' : Conp Γₜ} → Subp {Γₜ} Γₚ Γₚ' → Pf* Γₜ Γₚ Γₚ'
|
||||||
|
Sub→Pf* εₚ = tt
|
||||||
|
Sub→Pf* (σₚ ,ₚ pf) = ⟨ (Sub→Pf* σₚ) , pf ⟩
|
||||||
|
Pf*-id : {Γₜ : Cont} {Γₚ : Conp Γₜ} → Pf* Γₜ Γₚ Γₚ
|
||||||
|
Pf*-id = Sub→Pf* idₚ
|
||||||
|
|
||||||
|
Pf*▹p : {Γₜ : Cont}{Γₚ Γₚ' : Conp Γₜ}{A : For Γₜ} → Pf* Γₜ Γₚ Γₚ' → Pf* Γₜ (Γₚ ▹p⁰ A) Γₚ'
|
||||||
|
Pf*▹p {Γₚ' = ◇p} s = tt
|
||||||
|
Pf*▹p {Γₚ' = Γₚ' ▹p⁰ x} s = ⟨ (Pf*▹p (proj₁ s)) , (wkᵣp (rightRen reflRen) (proj₂ s)) ⟩
|
||||||
|
Pf*▹tp : {Γₜ : Cont}{Γₚ Γₚ' : Conp Γₜ} → Pf* Γₜ Γₚ Γₚ' → Pf* (Γₜ ▹t⁰) (Γₚ ▹tp) (Γₚ' ▹tp)
|
||||||
|
Pf*▹tp {Γₚ' = ◇p} s = tt
|
||||||
|
Pf*▹tp {Γₚ' = Γₚ' ▹p⁰ A} s = ⟨ Pf*▹tp (proj₁ s) , (proj₂ s) [ wkₜσₜ idₜ ]pₜ ⟩
|
||||||
|
|
||||||
|
Pf*Pf : {Γₜ : Cont} {Γₚ Γₚ' : Conp Γₜ} {A : For Γₜ} → Pf* Γₜ Γₚ Γₚ' → Pf Γₜ Γₚ' A → Pf Γₜ Γₚ A
|
||||||
|
Pf*Pf s (var pvzero) = proj₂ s
|
||||||
|
Pf*Pf s (var (pvnext pv)) = Pf*Pf (proj₁ s) (var pv)
|
||||||
|
Pf*Pf s (app p p') = app (Pf*Pf s p) (Pf*Pf s p')
|
||||||
|
Pf*Pf s (lam p) = lam (Pf*Pf (⟨ (Pf*▹p s) , (var pvzero) ⟩) p)
|
||||||
|
Pf*Pf s (p∀∀e p) = p∀∀e (Pf*Pf s p)
|
||||||
|
Pf*Pf s (p∀∀i p) = p∀∀i (Pf*Pf (Pf*▹tp s) p)
|
||||||
|
|
||||||
|
Pf*-∘ : {Γₜ : Cont} {Γₚ Δₚ Ξₚ : Conp Γₜ} → Pf* Γₜ Δₚ Ξₚ → Pf* Γₜ Γₚ Δₚ → Pf* Γₜ Γₚ Ξₚ
|
||||||
|
Pf*-∘ {Ξₚ = ◇p} α β = tt
|
||||||
|
Pf*-∘ {Ξₚ = Ξₚ ▹p⁰ A} α β = ⟨ Pf*-∘ (proj₁ α) β , Pf*Pf β (proj₂ α) ⟩
|
||||||
|
-}
|
||||||
|
|
||||||
|
{-
|
||||||
|
module InitialMorphism (M : FFOL {lsuc lzero} {lsuc lzero} {lsuc lzero} {lsuc lzero} {lsuc lzero}) where
|
||||||
|
{-# TERMINATING #-}
|
||||||
|
|
||||||
|
mCont : Cont → (FFOL.Con M)
|
||||||
|
mCont ◇t = FFOL.◇ M
|
||||||
|
mCont (Γₜ ▹t⁰) = FFOL._▹ₜ M (mCont Γₜ)
|
||||||
|
mTmT : {Γₜ : Cont} → Tm Γₜ → (FFOL.Tm M (mCont Γₜ))
|
||||||
|
-- Zero is (πₜ² id)
|
||||||
|
mTmT {Γₜ ▹t⁰} (var tvzero) = FFOL.πₜ² M (FFOL.id M)
|
||||||
|
-- N+1 is wk[tm N]
|
||||||
|
mTmT {Γₜ ▹t⁰} (var (tvnext tv)) = (FFOL._[_]t M (mTmT (var tv)) (FFOL.πₜ¹ M (FFOL.id M)))
|
||||||
|
|
||||||
|
mForT : {Γₜ : Cont} → (For Γₜ) → (FFOL.For M (mCont Γₜ))
|
||||||
|
mForT (R t u) = FFOL.R M (mTmT t) (mTmT u)
|
||||||
|
mForT (A ⇒ B) = FFOL._⇒_ M (mForT A) (mForT B)
|
||||||
|
mForT {Γ} (∀∀ A) = FFOL.∀∀ M (mForT A)
|
||||||
|
|
||||||
|
mSubt : {Δₜ : Cont}{Γₜ : Cont} → Subt Δₜ Γₜ → (FFOL.Sub M (mCont Δₜ) (mCont Γₜ))
|
||||||
|
mSubt εₜ = FFOL.ε M
|
||||||
|
mSubt (σₜ ,ₜ t) = FFOL._,ₜ_ M (mSubt σₜ) (mTmT t)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mConp : {Γₜ : Cont} → Conp Γₜ → (FFOL.Con M)
|
||||||
|
mForP : {Γₜ : Cont} {Γₚ : Conp Γₜ} → (For Γₜ) → (FFOL.For M (mConp Γₚ))
|
||||||
|
mConp {Γₜ} ◇p = mCont Γₜ
|
||||||
|
mConp {Γₜ} (Γₚ ▹p⁰ A) = FFOL._▹ₚ_ M (mConp Γₚ) (mForP {Γₚ = Γₚ} A)
|
||||||
|
mForP {Γₜ} {Γₚ = ◇p} A = mForT {Γₜ} A
|
||||||
|
mForP {Γₚ = Γₚ ▹p⁰ B} A = FFOL._[_]f M (mForP {Γₚ = Γₚ} A) (FFOL.πₚ¹ M (FFOL.id M))
|
||||||
|
|
||||||
|
mTmP : {Γₜ : Cont}{Γₚ : Conp Γₜ} → Tm Γₜ → (FFOL.Tm M (mConp Γₚ))
|
||||||
|
mTmP {Γₜ}{Γₚ = ◇p} t = mTmT {Γₜ} t
|
||||||
|
mTmP {Γₚ = Γₚ ▹p⁰ x} t = FFOL._[_]t M (mTmP {Γₚ = Γₚ} t) (FFOL.πₚ¹ M (FFOL.id M))
|
||||||
|
|
||||||
|
mCon : Con → (FFOL.Con M)
|
||||||
|
mCon Γ = mConp {Con.t Γ} (Con.p Γ)
|
||||||
|
|
||||||
|
mFor : {Γ : Con} → (For (Con.t Γ)) → (FFOL.For M (mCon Γ))
|
||||||
|
mFor {Γ} A = mForP {Con.t Γ} {Con.p Γ} A
|
||||||
|
|
||||||
|
mTm : {Γ : Con} → Tm (Con.t Γ) → (FFOL.Tm M (mCon Γ))
|
||||||
|
mTm {Γ} t = mTmP {Con.t Γ} {Con.p Γ} t
|
||||||
|
|
||||||
|
e▹ₜT : {Γₜ : Cont} → mCont (Γₜ ▹t⁰) ≡ FFOL._▹ₜ M (mCont Γₜ)
|
||||||
|
e▹ₜT = refl
|
||||||
|
e▹ₜP : {Γₜ : Cont}{Γₚ : Conp Γₜ} → mConp {Γₜ ▹t⁰} (Γₚ [ wkₜσₜ idₜ ]c) ≡ FFOL._▹ₜ M (mConp Γₚ)
|
||||||
|
e▹ₜP {Γₜ = Γₜ} {Γₚ = ◇p} = e▹ₜT {Γₜ = Γₜ}
|
||||||
|
e▹ₜP {Γₚ = Γₚ ▹p⁰ A} = {!!}
|
||||||
|
e▹ₜ : {Γ : Con} → mCon (con (Con.t Γ ▹t⁰) (Con.p Γ [ wkₜσₜ idₜ ]c)) ≡ FFOL._▹ₜ M (mCon Γ)
|
||||||
|
e▹ₜ {Γ} = e▹ₜP {Γₜ = Con.t Γ} {Γₚ = Con.p Γ}
|
||||||
|
|
||||||
|
mForT⇒ : {Γₜ : Cont}{A B : For Γₜ} → mForT {Γₜ} (A ⇒ B) ≡ FFOL._⇒_ M (mForT {Γₜ} A) (mForT {Γₜ} B)
|
||||||
|
mForT⇒ = refl
|
||||||
|
mForP⇒ : {Γₜ : Cont}{Γₚ : Conp Γₜ}{A B : For Γₜ} → mForP {Γₜ} {Γₚ} (A ⇒ B) ≡ FFOL._⇒_ M (mForP {Γₜ} {Γₚ} A) (mForP {Γₜ} {Γₚ} B)
|
||||||
|
mForP⇒ {Γₜ} {Γₚ = ◇p}{A}{B} = mForT⇒ {Γₜ}{A}{B}
|
||||||
|
mForP⇒ {Γₚ = Γₚ ▹p⁰ C}{A}{B} = ≡tran (cong (λ X → (M FFOL.[ X ]f) _) (mForP⇒ {Γₚ = Γₚ})) (FFOL.[]f-⇒ M {F = mForP {Γₚ = Γₚ} A} {G = mForP {Γₚ = Γₚ} B} {σ = (FFOL.πₚ¹ M (FFOL.id M))})
|
||||||
|
mFor⇒ : {Γ : Con}{A B : For (Con.t Γ)} → mFor {Γ} (A ⇒ B) ≡ FFOL._⇒_ M (mFor {Γ} A) (mFor {Γ} B)
|
||||||
|
mFor⇒ {Γ} = mForP⇒ {Con.t Γ} {Con.p Γ}
|
||||||
|
|
||||||
|
mForT∀∀ : {Γₜ : Cont}{A : For (Γₜ ▹t⁰)} → mForT {Γₜ} (∀∀ A) ≡ FFOL.∀∀ M (mForT {Γₜ ▹t⁰} A)
|
||||||
|
mForT∀∀ = refl
|
||||||
|
mForP∀∀ : {Γₜ : Cont}{Γₚ : Conp Γₜ}{A : For (Γₜ ▹t⁰)} → mForP {Γₜ} {Γₚ} (∀∀ A) ≡ FFOL.∀∀ M (subst (FFOL.For M) (e▹ₜP {Γₜ} {Γₚ}) (mForP {Γₜ ▹t⁰} {Γₚ ▹tp} A))
|
||||||
|
-- mFor∀∀ : {Γ : Con}{A : For ((Con.t Γ) ▹t⁰)} → mFor {Γ} (∀∀ A) ≡ FFOL.∀∀ M (mFor {Γ ▹t} A)
|
||||||
|
|
||||||
|
--mForL : {Γ : Con}{A : For (Con.t Γ ▹t⁰)}{t : Tm (Con.t Γ)} → FFOL._[_]f M (mFor {Γ = {!Γ ▹t!}} A) (FFOL._,ₜ_ M (FFOL.id M) (mTm {Γ = Γ} t)) ≡ mFor {Γ = Γ} (A [ idₜ ,ₜ t ]f)
|
||||||
|
|
||||||
|
m⊢ : {Γ : Con} {A : For (Con.t Γ)} → Pf (Con.t Γ) (Con.p Γ) A → FFOL._⊢_ M (mCon Γ) (mFor {Γ = Γ} A)
|
||||||
|
m⊢ (var pvzero) = FFOL.πₚ² M (FFOL.id M)
|
||||||
|
m⊢ (var (pvnext pv)) = FFOL._[_]p M (m⊢ (var pv)) (FFOL.πₚ¹ M (FFOL.id M))
|
||||||
|
m⊢ {Γ} {B} (app {A = A} pf pf') = FFOL.app M (substP (FFOL._⊢_ M _) (mFor⇒ {Γ}{A}{B}) (m⊢ pf)) (m⊢ pf')
|
||||||
|
m⊢ {Γ} {A ⇒ B} (lam pf) = substP (FFOL._⊢_ M _) (≡sym (mFor⇒ {Γ}{A}{B})) (FFOL.lam M (m⊢ pf))
|
||||||
|
m⊢ {Γ} (p∀∀e {A = A} {t = t} pf) = substP (FFOL._⊢_ M _) {!!} (FFOL.∀e M {F = mFor {{!!}} A} (substP (FFOL._⊢_ M _) {!!} (m⊢ pf)) {t = mTm {Γ} t})
|
||||||
|
m⊢ {Γ} (p∀∀i {A = A} pf) = substP (FFOL._⊢_ M _) (≡sym mForP∀∀) (FFOL.∀i M (substP (λ Ξ → FFOL._⊢_ M Ξ (mFor A)) e▹ₜ (m⊢ pf)))
|
||||||
|
|
||||||
|
|
||||||
|
mSubp : {Γₜ : Cont}{Δₚ Γₚ : Conp Γₜ} → Subp {Γₜ} Δₚ Γₚ → (FFOL.Sub M (mConp Δₚ) (mConp Γₚ))
|
||||||
|
mSubp {Γₜ} {Γₚ = ◇p} σₚ = {!FFOL.ε M!}
|
||||||
|
mSubp {Γₚ = Γₚ ▹p⁰ A} σₚ = FFOL._,ₚ_ M (mSubp (πₚ¹ σₚ)) {!m⊢ (πₚ² σₚ)!}
|
||||||
|
|
||||||
|
|
||||||
|
mSub : {Δ : Con}{Γ : Con} → Sub Δ Γ → (FFOL.Sub M (mCon Δ) (mCon Γ))
|
||||||
|
mSub {Δ}{Γ} σ = FFOL._∘_ M (subst (FFOL.Sub M (mCont (Con.t Δ))) {!!} (mSubt (Sub.t σ))) ({!mSubp (Sub.p σ)!})
|
||||||
|
|
||||||
|
|
||||||
|
e▹ₚ : {Γ : Con}{A : For (Con.t Γ)} → mCon (Γ ▹p A) ≡ FFOL._▹ₚ_ M (mCon Γ) (mFor {Γ} A)
|
||||||
|
e[]f : {Γ Δ : Con}{A : For (Con.t Γ)}{σ : Sub Δ Γ} → mFor {Δ} (A [ Sub.t σ ]f) ≡ FFOL._[_]f M (mFor {Γ} A) (mSub σ)
|
||||||
|
|
||||||
|
|
||||||
|
{-
|
||||||
|
e▹ₜ {con Γₜ ◇p} = refl
|
||||||
|
e▹ₜ {con Γₜ (Γₚ ▹p⁰ A)} = ≡tran²
|
||||||
|
(cong₂' (FFOL._▹ₚ_ M) (e▹ₜ {con Γₜ Γₚ}) (cong (subst (FFOL.For M) (e▹ₜ {Γ = con Γₜ Γₚ})) (e[]f {A = A}{σ = πₜ¹* id})))
|
||||||
|
(substP (λ X → (M FFOL.▹ₚ (M FFOL.▹ₜ) (mCon (con Γₜ Γₚ))) X ≡ (M FFOL.▹ₜ) ((M FFOL.▹ₚ mCon (con Γₜ Γₚ)) (mFor A)))
|
||||||
|
(≡tran
|
||||||
|
(coeshift {!!})
|
||||||
|
(cong (λ X → subst (FFOL.For M) _ (FFOL._[_]f M (mFor A) (mSub (sub (wkₜσₜ idₜ) X)))) (≡sym (coecoe-coe {eq1 = {!!}} {x = idₚ {Δₚ = Γₚ}}))))
|
||||||
|
{!!})
|
||||||
|
(cong (M FFOL.▹ₜ) (≡sym (e▹ₚ {con Γₜ Γₚ})))
|
||||||
|
-- substP (λ X → FFOL._▹ₚ_ M X (mFor {Γ = ?} (A [ wkₜσₜ idₜ ]f)) ≡ (FFOL._▹ₜ M (mCon (con Γₜ (Γₚ ▹p⁰ A))))) (≡sym (e▹ₜ {Γ = con Γₜ Γₚ})) ?
|
||||||
|
-}
|
||||||
|
|
||||||
|
|
||||||
|
e[]f = {!!}
|
||||||
|
e▹ₚ = {!!}
|
||||||
|
|
||||||
|
|
||||||
|
{-
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
e∘ : {Γ Δ Ξ : Con}{δ : Sub Δ Ξ}{σ : Sub Γ Δ} → mSub (δ ∘ σ) ≡ FFOL._∘_ M (mSub δ) (mSub σ)
|
||||||
|
e∘ = {!!}
|
||||||
|
eid : {Γ : Con} → mSub (id {Γ}) ≡ FFOL.id M {mCon Γ}
|
||||||
|
eid = {!!}
|
||||||
|
e◇ : mCon ◇ ≡ FFOL.◇ M
|
||||||
|
e◇ = {!!}
|
||||||
|
eε : {Γ : Con} → mSub (sub (εₜ {Con.t Γ}) (εₚ {Con.t Γ} {Con.p Γ})) ≡ subst (FFOL.Sub M (mCon Γ)) (≡sym e◇) (FFOL.ε M {mCon Γ})
|
||||||
|
eε = {!!}
|
||||||
|
e[]t : {Γ Δ : Con}{t : Tm (Con.t Γ)}{σ : Sub Δ Γ} → mTm (t [ Sub.t σ ]t) ≡ FFOL._[_]t M (mTm t) (mSub σ)
|
||||||
|
e[]t = {!!}
|
||||||
|
eπₜ¹ : {Γ Δ : Con}{σ : Sub Δ (Γ ▹t)} → mSub (πₜ¹* σ) ≡ FFOL.πₜ¹ M (subst (FFOL.Sub M (mCon Δ)) e▹ₜ (mSub σ))
|
||||||
|
eπₜ¹ = {!!}
|
||||||
|
eπₜ² : {Γ Δ : Con}{σ : Sub Δ (Γ ▹t)} → mTm (πₜ²* σ) ≡ FFOL.πₜ² M (subst (FFOL.Sub M (mCon Δ)) e▹ₜ (mSub σ))
|
||||||
|
eπₜ² = {!!}
|
||||||
|
e,ₜ : {Γ Δ : Con}{σ : Sub Δ Γ}{t : Tm (Con.t Δ)} → mSub (σ ,ₜ* t) ≡ subst (FFOL.Sub M (mCon Δ)) (≡sym e▹ₜ) (FFOL._,ₜ_ M (mSub σ) (mTm t))
|
||||||
|
e,ₜ = {!!}
|
||||||
|
-- Proofs are in prop, so no equation needed
|
||||||
|
--[]p : {Γ Δ : Con}{A : For Γ}{pf : FFOL._⊢_ S Γ A}{σ : FFOL.Sub S Δ Γ} → m⊢ (FFOL._[_]p S pf σ) ≡ FFOL._[_]p M (m⊢ pf) (mSub σ)
|
||||||
|
e▹ₚ = {!!}
|
||||||
|
eπₚ¹ : {Γ Δ : Con}{A : For (Con.t Γ)}{σ : Sub Δ (Γ ▹p A)} → mSub (πₚ¹* σ) ≡ FFOL.πₚ¹ M (subst (FFOL.Sub M (mCon Δ)) e▹ₚ (mSub σ))
|
||||||
|
eπₚ¹ = {!!}
|
||||||
|
--πₚ² : {Γ Δ : Con}{A : For Γ}{σ : Sub Δ (Γ ▹p A)} → m⊢ (πₚ²* σ) ≡ FFOL.πₚ¹ M (subst (FFOL.Sub M (mCon Δ)) e▹ₚ (mSub σ))
|
||||||
|
e,ₚ : {Γ Δ : Con}{A : For (Con.t Γ)}{σ : Sub Δ Γ}{pf : Pf (Con.t Δ) (Con.p Δ) (A [ Sub.t σ ]f)}
|
||||||
|
→ mSub (σ ,ₚ* pf) ≡ subst (FFOL.Sub M (mCon Δ)) (≡sym e▹ₚ) (FFOL._,ₚ_ M (mSub σ) (substP (FFOL._⊢_ M (mCon Δ)) e[]f (m⊢ pf)))
|
||||||
|
e,ₚ = {!!}
|
||||||
|
eR : {Γ : Con}{t u : Tm (Con.t Γ)} → mFor (R t u) ≡ FFOL.R M (mTm t) (mTm u)
|
||||||
|
eR = {!!}
|
||||||
|
e⇒ : {Γ : Con}{A B : For (Con.t Γ)} → mFor (A ⇒ B) ≡ FFOL._⇒_ M (mFor A) (mFor B)
|
||||||
|
e⇒ = {!!}
|
||||||
|
e∀∀ : {Γ : Con}{A : For ((Con.t Γ) ▹t⁰)} → mFor (∀∀ A) ≡ FFOL.∀∀ M (subst (FFOL.For M) e▹ₜ (mFor A))
|
||||||
|
e∀∀ = {!!}
|
||||||
|
-}
|
||||||
|
m : Mapping ffol M
|
||||||
|
m = record { mCon = mCon ; mSub = mSub ; mTm = λ {Γ} t → mTm {Γ} t ; mFor = λ {Γ} A → mFor {Γ} A ; m⊢ = m⊢ }
|
||||||
|
|
||||||
|
--mor : (M : FFOL) → Morphism ffol M
|
||||||
|
--mor M = record {InitialMorphism M}
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
|
\end{code}
|
||||||
@ -158,6 +158,11 @@ module PropUtil where
|
|||||||
congsubst : {ℓ ℓ' : Level}{A : Set ℓ}{P : A → Set ℓ'}{a a' : A}{e : a ≡ a}{p : P a}{p' : P a} → p ≡ p' → subst P e p ≡ subst P e p'
|
congsubst : {ℓ ℓ' : Level}{A : Set ℓ}{P : A → Set ℓ'}{a a' : A}{e : a ≡ a}{p : P a}{p' : P a} → p ≡ p' → subst P e p ≡ subst P e p'
|
||||||
congsubst {P = P} {e = refl} h = cong (subst P refl) h
|
congsubst {P = P} {e = refl} h = cong (subst P refl) h
|
||||||
|
|
||||||
|
substpoly : {ℓ ℓ' : Level}{A : Set ℓ}{P : A → Set ℓ'}{f : {ξ : A} → P ξ}
|
||||||
|
{α β : A}{eq : α ≡ β}
|
||||||
|
→ subst P eq (f {α}) ≡ f {β}
|
||||||
|
substpoly {eq = refl} = coerefl
|
||||||
|
|
||||||
substfpoly : {ℓ ℓ' : Level}{A : Set ℓ}{P R : A → Set ℓ'}{α β : A}
|
substfpoly : {ℓ ℓ' : Level}{A : Set ℓ}{P R : A → Set ℓ'}{α β : A}
|
||||||
{eq : α ≡ β} {f : {ξ : A} → R ξ → P ξ} {x : R α}
|
{eq : α ≡ β} {f : {ξ : A} → R ξ → P ξ} {x : R α}
|
||||||
→ coe (cong P eq) (f {α} x) ≡ f (coe (cong R eq) x)
|
→ coe (cong P eq) (f {α} x) ≡ f (coe (cong R eq) x)
|
||||||
|
|||||||
104
ZOL2.lagda
Normal file
104
ZOL2.lagda
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
\begin{code}
|
||||||
|
{-# OPTIONS --prop --rewriting #-}
|
||||||
|
|
||||||
|
open import PropUtil
|
||||||
|
|
||||||
|
module ZOL2 where
|
||||||
|
|
||||||
|
open import Agda.Primitive
|
||||||
|
open import ListUtil
|
||||||
|
|
||||||
|
variable
|
||||||
|
ℓ¹ ℓ² ℓ³ ℓ⁴ ℓ⁵ : Level
|
||||||
|
|
||||||
|
record ZOL : Set (lsuc (ℓ¹ ⊔ ℓ² ⊔ ℓ³ ⊔ ℓ⁴)) where
|
||||||
|
infixr 10 _∘_
|
||||||
|
field
|
||||||
|
|
||||||
|
-- We first make the base category with its terminal object
|
||||||
|
Con : Set ℓ¹
|
||||||
|
Sub : Con → Con → Prop ℓ² -- It makes a category
|
||||||
|
_∘_ : {Γ Δ Ξ : Con} → Sub Δ Ξ → Sub Γ Δ → Sub Γ Ξ
|
||||||
|
--∘-ass : {Γ Δ Ξ Ψ : Con}{α : Sub Γ Δ}{β : Sub Δ Ξ}{γ : Sub Ξ Ψ}
|
||||||
|
-- → (γ ∘ β) ∘ α ≡ γ ∘ (β ∘ α)
|
||||||
|
id : {Γ : Con} → Sub Γ Γ
|
||||||
|
--idl : {Γ Δ : Con} {σ : Sub Γ Δ} → (id {Δ}) ∘ σ ≡ σ
|
||||||
|
--idr : {Γ Δ : Con} {σ : Sub Γ Δ} → σ ∘ (id {Γ}) ≡ σ
|
||||||
|
◇ : Con -- The terminal object of the category
|
||||||
|
ε : {Γ : Con} → Sub Γ ◇ -- The morphism from any object to the terminal
|
||||||
|
--ε-u : {Γ : Con} → {σ : Sub Γ ◇} → σ ≡ ε {Γ}
|
||||||
|
|
||||||
|
-- Functor Con → Set called For
|
||||||
|
For : Con → Set ℓ³
|
||||||
|
_[_]f : {Γ Δ : Con} → For Γ → Sub Δ Γ → For Δ -- Action on morphisms
|
||||||
|
[]f-id : {Γ : Con} → {F : For Γ} → F [ id {Γ} ]f ≡ F
|
||||||
|
[]f-∘ : {Γ Δ Ξ : Con} → {α : Sub Ξ Δ} → {β : Sub Δ Γ} → {F : For Γ}
|
||||||
|
→ F [ β ∘ α ]f ≡ (F [ β ]f) [ α ]f
|
||||||
|
|
||||||
|
-- Functor Con × For → Prop called Pf or ⊢
|
||||||
|
Pf : (Γ : Con) → For Γ → Prop ℓ⁴
|
||||||
|
-- Action on morphisms
|
||||||
|
_[_]p : {Γ Δ : Con} → {F : For Γ} → Pf Γ F → (σ : Sub Δ Γ) → Pf Δ (F [ σ ]f)
|
||||||
|
-- Equalities below are useless because Pf Γ F is in prop
|
||||||
|
-- []p-id : {Γ : Con} → {F : For Γ} → {prf : Pf Γ F}
|
||||||
|
-- → prf [ id {Γ} ]p ≡ prf
|
||||||
|
-- []p-∘ : {Γ Δ Ξ : Con}{α : Sub Ξ Δ}{β : Sub Δ Γ}{F : For Γ}{prf : Pf Γ F}
|
||||||
|
-- → prf [ α ∘ β ]p ≡ (prf [ β ]p) [ α ]p
|
||||||
|
|
||||||
|
-- → Prop⁺
|
||||||
|
_▹ₚ_ : (Γ : Con) → For Γ → Con
|
||||||
|
πₚ¹ : {Γ Δ : Con}{F : For Γ} → Sub Δ (Γ ▹ₚ F) → Sub Δ Γ
|
||||||
|
πₚ² : {Γ Δ : Con}{F : For Γ} → (σ : Sub Δ (Γ ▹ₚ F)) → Pf Δ (F [ πₚ¹ σ ]f)
|
||||||
|
_,ₚ_ : {Γ Δ : Con}{F : For Γ} → (σ : Sub Δ Γ) → Pf Δ (F [ σ ]f) → Sub Δ (Γ ▹ₚ F)
|
||||||
|
--,ₚ∘πₚ : {Γ Δ : Con}{F : For Γ}{σ : Sub Δ (Γ ▹ₚ F)} → (πₚ¹ σ) ,ₚ (πₚ² σ) ≡ σ
|
||||||
|
--πₚ¹∘,ₚ : {Γ Δ : Con}{σ : Sub Δ Γ}{F : For Γ}{prf : Pf Δ (F [ σ ]f)}
|
||||||
|
-- → πₚ¹ (σ ,ₚ prf) ≡ σ
|
||||||
|
-- Equality below is useless because Pf Γ F is in Prop
|
||||||
|
-- πₚ²∘,ₚ : {Γ Δ : Con}{σ : Sub Δ Γ}{F : For Γ}{prf : Pf Δ (F [ σ ]f)}
|
||||||
|
-- → πₚ² (σ ,ₚ prf) ≡ prf
|
||||||
|
--,ₚ∘ : {Γ Δ Ξ : Con}{σ : Sub Γ Ξ}{δ : Sub Δ Γ}{F : For Ξ}{prf : Pf Γ (F [ σ ]f)}
|
||||||
|
-- → (σ ,ₚ prf) ∘ δ ≡ (σ ∘ δ) ,ₚ (substP (Pf Δ) (≡sym []f-∘) (prf [ δ ]p))
|
||||||
|
|
||||||
|
|
||||||
|
{-- FORMULAE CONSTRUCTORS --}
|
||||||
|
-- i formula
|
||||||
|
ι : {Γ : Con} → For Γ
|
||||||
|
[]f-ι : {Γ Δ : Con} {σ : Sub Δ Γ}→ ι [ σ ]f ≡ ι
|
||||||
|
|
||||||
|
-- Implication
|
||||||
|
_⇒_ : {Γ : Con} → For Γ → For Γ → For Γ
|
||||||
|
[]f-⇒ : {Γ Δ : Con} → {F G : For Γ} → {σ : Sub Δ Γ}
|
||||||
|
→ (F ⇒ G) [ σ ]f ≡ (F [ σ ]f) ⇒ (G [ σ ]f)
|
||||||
|
|
||||||
|
{-- PROOFS CONSTRUCTORS --}
|
||||||
|
-- Again, we don't have to write the _[_]p equalities as Proofs are in Prop
|
||||||
|
|
||||||
|
-- Lam & App
|
||||||
|
lam : {Γ : Con}{F G : For Γ} → Pf (Γ ▹ₚ F) (G [ πₚ¹ id ]f) → Pf Γ (F ⇒ G)
|
||||||
|
app : {Γ : Con}{F G : For Γ} → Pf Γ (F ⇒ G) → Pf Γ F → Pf Γ G
|
||||||
|
|
||||||
|
record Mapping (S : ZOL {ℓ¹} {ℓ²} {ℓ³} {ℓ⁴}) (D : ZOL {ℓ¹} {ℓ²} {ℓ³} {ℓ⁴}) : Set (lsuc (ℓ¹ ⊔ ℓ² ⊔ ℓ³ ⊔ ℓ⁴)) where
|
||||||
|
field
|
||||||
|
|
||||||
|
-- We first make the base category with its final object
|
||||||
|
mCon : (ZOL.Con S) → (ZOL.Con D)
|
||||||
|
mSub : {Δ : (ZOL.Con S)}{Γ : (ZOL.Con S)} → (ZOL.Sub S Δ Γ) → (ZOL.Sub D (mCon Δ) (mCon Γ))
|
||||||
|
mFor : {Γ : (ZOL.Con S)} → (ZOL.For S Γ) → (ZOL.For D (mCon Γ))
|
||||||
|
mPf : {Γ : (ZOL.Con S)} {A : ZOL.For S Γ} → ZOL.Pf S Γ A → ZOL.Pf D (mCon Γ) (mFor A)
|
||||||
|
|
||||||
|
|
||||||
|
record Morphism (S : ZOL {ℓ¹} {ℓ²} {ℓ³} {ℓ⁴}) (D : ZOL {ℓ¹} {ℓ²} {ℓ³} {ℓ⁴}) : Set (lsuc (ℓ¹ ⊔ ℓ² ⊔ ℓ³ ⊔ ℓ⁴)) where
|
||||||
|
field m : Mapping S D
|
||||||
|
mCon = Mapping.mCon m
|
||||||
|
mSub = Mapping.mSub m
|
||||||
|
mFor = Mapping.mFor m
|
||||||
|
mPf = Mapping.mPf m
|
||||||
|
field
|
||||||
|
e◇ : mCon (ZOL.◇ S) ≡ ZOL.◇ D
|
||||||
|
e[]f : {Γ Δ : ZOL.Con S}{A : ZOL.For S Γ}{σ : ZOL.Sub S Δ Γ} → mFor (ZOL._[_]f S A σ) ≡ ZOL._[_]f D (mFor A) (mSub σ)
|
||||||
|
e▹ₚ : {Γ : ZOL.Con S}{A : ZOL.For S Γ} → mCon (ZOL._▹ₚ_ S Γ A) ≡ ZOL._▹ₚ_ D (mCon Γ) (mFor A)
|
||||||
|
eι : {Γ : ZOL.Con S} → mFor (ZOL.ι S {Γ}) ≡ ZOL.ι D {mCon Γ}
|
||||||
|
e⇒ : {Γ : ZOL.Con S}{A B : ZOL.For S Γ} → mFor (ZOL._⇒_ S A B) ≡ ZOL._⇒_ D (mFor A) (mFor B)
|
||||||
|
-- No equation needed for lam, app, ∀i, ∀e as their output are in prop
|
||||||
|
|
||||||
|
\end{code}
|
||||||
180
ZOLInitial.lagda
Normal file
180
ZOLInitial.lagda
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
git s\begin{code}
|
||||||
|
{-# OPTIONS --prop --rewriting #-}
|
||||||
|
|
||||||
|
open import PropUtil
|
||||||
|
|
||||||
|
module ZOLInitial where
|
||||||
|
|
||||||
|
open import ZOL2
|
||||||
|
open import Agda.Primitive
|
||||||
|
open import ListUtil
|
||||||
|
|
||||||
|
data For : Set where
|
||||||
|
ι : For
|
||||||
|
_⇒_ : For → For → For
|
||||||
|
|
||||||
|
data Con : Set where
|
||||||
|
◇ : Con
|
||||||
|
_▹ₚ_ : Con → For → Con
|
||||||
|
|
||||||
|
variable
|
||||||
|
Γ Δ Ξ : Con
|
||||||
|
A B : For
|
||||||
|
|
||||||
|
data PfVar : Con → For → Prop where
|
||||||
|
pvzero : PfVar (Γ ▹ₚ A) A
|
||||||
|
pvnext : PfVar Γ A → PfVar (Γ ▹ₚ B) A
|
||||||
|
data Pf : Con → For → Prop where
|
||||||
|
var : PfVar Γ A → Pf Γ A
|
||||||
|
lam : Pf (Γ ▹ₚ A) B → Pf Γ (A ⇒ B)
|
||||||
|
app : Pf Γ (A ⇒ B) → Pf Γ A → Pf Γ B
|
||||||
|
|
||||||
|
data Ren : Con → Con → Prop where
|
||||||
|
ε : Ren Γ ◇
|
||||||
|
_,ₚR_ : Ren Δ Γ → PfVar Δ A → Ren Δ (Γ ▹ₚ A)
|
||||||
|
|
||||||
|
rightR : Ren Δ Γ → Ren (Δ ▹ₚ A) Γ
|
||||||
|
rightR ε = ε
|
||||||
|
rightR (σ ,ₚR pv) = (rightR σ) ,ₚR (pvnext pv)
|
||||||
|
|
||||||
|
idR : Ren Γ Γ
|
||||||
|
idR {◇} = ε
|
||||||
|
idR {Γ ▹ₚ A} = (rightR (idR {Γ})) ,ₚR pvzero
|
||||||
|
|
||||||
|
data Sub : Con → Con → Prop where
|
||||||
|
ε : Sub Γ ◇
|
||||||
|
_,ₚ_ : Sub Δ Γ → Pf Δ A → Sub Δ (Γ ▹ₚ A)
|
||||||
|
|
||||||
|
πₚ¹ : Sub Δ (Γ ▹ₚ A) → Sub Δ Γ
|
||||||
|
πₚ² : Sub Δ (Γ ▹ₚ A) → Pf Δ A
|
||||||
|
πₚ¹ (σ ,ₚ pf) = σ
|
||||||
|
πₚ² (σ ,ₚ pf) = pf
|
||||||
|
|
||||||
|
SubR : Ren Γ Δ → Sub Γ Δ
|
||||||
|
SubR ε = ε
|
||||||
|
SubR (σ ,ₚR pv) = SubR σ ,ₚ var pv
|
||||||
|
|
||||||
|
id : Sub Γ Γ
|
||||||
|
id = SubR idR
|
||||||
|
|
||||||
|
_[_]pvr : PfVar Γ A → Ren Δ Γ → PfVar Δ A
|
||||||
|
pvzero [ _ ,ₚR pv ]pvr = pv
|
||||||
|
pvnext pv [ σ ,ₚR _ ]pvr = pv [ σ ]pvr
|
||||||
|
_[_]pr : Pf Γ A → Ren Δ Γ → Pf Δ A
|
||||||
|
var pv [ σ ]pr = var (pv [ σ ]pvr)
|
||||||
|
lam pf [ σ ]pr = lam (pf [ (rightR σ) ,ₚR pvzero ]pr)
|
||||||
|
app pf pf' [ σ ]pr = app (pf [ σ ]pr) (pf' [ σ ]pr)
|
||||||
|
|
||||||
|
wkSub : Sub Δ Γ → Sub (Δ ▹ₚ A) Γ
|
||||||
|
wkSub ε = ε
|
||||||
|
wkSub (σ ,ₚ pf) = (wkSub σ) ,ₚ (pf [ rightR idR ]pr)
|
||||||
|
|
||||||
|
_[_]p : Pf Γ A → Sub Δ Γ → Pf Δ A
|
||||||
|
var pvzero [ _ ,ₚ pf ]p = pf
|
||||||
|
var (pvnext pv) [ σ ,ₚ _ ]p = var pv [ σ ]p
|
||||||
|
lam pf [ σ ]p = lam (pf [ wkSub σ ,ₚ var pvzero ]p)
|
||||||
|
app pf pf' [ σ ]p = app (pf [ σ ]p) (pf' [ σ ]p)
|
||||||
|
|
||||||
|
_∘_ : {Γ Δ Ξ : Con} → Sub Δ Ξ → Sub Γ Δ → Sub Γ Ξ
|
||||||
|
ε ∘ β = ε
|
||||||
|
(α ,ₚ pf) ∘ β = (α ∘ β) ,ₚ (pf [ β ]p)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
zol : ZOL
|
||||||
|
zol = record
|
||||||
|
{ Con = Con
|
||||||
|
; Sub = Sub
|
||||||
|
; _∘_ = _∘_
|
||||||
|
; id = id
|
||||||
|
; ◇ = ◇
|
||||||
|
; ε = ε
|
||||||
|
; For = λ Γ → For
|
||||||
|
; _[_]f = λ A σ → A
|
||||||
|
; []f-id = refl
|
||||||
|
; []f-∘ = refl
|
||||||
|
; Pf = Pf
|
||||||
|
; _[_]p = _[_]p
|
||||||
|
; _▹ₚ_ = _▹ₚ_
|
||||||
|
; πₚ¹ = πₚ¹
|
||||||
|
; πₚ² = πₚ²
|
||||||
|
; _,ₚ_ = _,ₚ_
|
||||||
|
; ι = ι
|
||||||
|
; []f-ι = refl
|
||||||
|
; _⇒_ = _⇒_
|
||||||
|
; []f-⇒ = refl
|
||||||
|
; lam = lam
|
||||||
|
; app = app
|
||||||
|
}
|
||||||
|
|
||||||
|
module InitialMorphism (M : ZOL {lzero} {lzero} {lzero} {lzero}) where
|
||||||
|
|
||||||
|
mCon : Con → (ZOL.Con M)
|
||||||
|
mFor : {Γ : Con} → For → (ZOL.For M (mCon Γ))
|
||||||
|
|
||||||
|
mCon ◇ = ZOL.◇ M
|
||||||
|
mCon (Γ ▹ₚ A) = ZOL._▹ₚ_ M (mCon Γ) (mFor {Γ} A)
|
||||||
|
mFor {Γ} ι = ZOL.ι M
|
||||||
|
mFor {Γ} (A ⇒ B) = ZOL._⇒_ M (mFor {Γ} A) (mFor {Γ} B)
|
||||||
|
|
||||||
|
|
||||||
|
mSub : {Δ : Con}{Γ : Con} → Sub Δ Γ → (ZOL.Sub M (mCon Δ) (mCon Γ))
|
||||||
|
mPf : {Γ : Con} {A : For} → Pf Γ A → ZOL.Pf M (mCon Γ) (mFor {Γ} A)
|
||||||
|
|
||||||
|
e[]f⁰ : {Γ : Con}{A B : For} → mFor {Γ ▹ₚ B} A ≡ ZOL._[_]f M (mFor {Γ} A) (ZOL.πₚ¹ M (ZOL.id M))
|
||||||
|
e[]f⁰ {A = ι} = ≡sym (ZOL.[]f-ι M)
|
||||||
|
e[]f⁰ {A = A ⇒ B} = ≡sym (≡tran (ZOL.[]f-⇒ M) (cong₂ (ZOL._⇒_ M) (≡sym (e[]f⁰ {A = A})) (≡sym (e[]f⁰ {A = B}))))
|
||||||
|
|
||||||
|
e[]f : {Γ Δ : Con}{A : For}{σ : Sub Δ Γ} → mFor {Δ} A ≡ ZOL._[_]f M (mFor {Γ} A) (mSub σ)
|
||||||
|
e[]f {A = ι} = ≡sym (ZOL.[]f-ι M)
|
||||||
|
e[]f {Γ} {Δ} {A = A ⇒ B} {σ} = ≡sym (≡tran (ZOL.[]f-⇒ M) (cong₂ (ZOL._⇒_ M) (≡sym (e[]f {A = A}{σ})) (≡sym (e[]f {A = B}{σ}))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mPf {A = A} (var (pvzero {Γ})) = substP (ZOL.Pf M _) (≡sym (e[]f⁰ {Γ} {A} {A})) (ZOL.πₚ² M (ZOL.id M))
|
||||||
|
mPf {A = A} (var (pvnext {Γ} {B = B} pv)) = substP (ZOL.Pf M _) (≡sym (e[]f⁰ {Γ} {A} {B})) (ZOL._[_]p M (mPf (var pv)) (ZOL.πₚ¹ M (ZOL.id M)))
|
||||||
|
mPf {Γ} (lam {A = A} {B} pf) = ZOL.lam M (substP (ZOL.Pf M _) (e[]f⁰ {Γ} {B} {A}) (mPf pf))
|
||||||
|
mPf (app pf pf') = ZOL.app M (mPf pf) (mPf pf')
|
||||||
|
|
||||||
|
mSub ε = ZOL.ε M
|
||||||
|
mSub (_,ₚ_ {Δ} {Γ = Γ} {A} σ pf) = ZOL._,ₚ_ M (mSub σ) (substP (ZOL.Pf M _) (e[]f {Γ} {Δ} {A} {σ}) (mPf pf))
|
||||||
|
|
||||||
|
mor : Morphism zol M
|
||||||
|
mor = record {
|
||||||
|
m = record {
|
||||||
|
mCon = mCon
|
||||||
|
; mSub = mSub
|
||||||
|
; mFor = λ {Γ} A → mFor {Γ} A
|
||||||
|
; mPf = mPf
|
||||||
|
}
|
||||||
|
; e◇ = refl
|
||||||
|
; e[]f = λ {Γ}{Δ}{A}{σ} → e[]f {A = A} {σ}
|
||||||
|
; e▹ₚ = refl
|
||||||
|
; eι = refl
|
||||||
|
; e⇒ = refl
|
||||||
|
}
|
||||||
|
|
||||||
|
module InitialMorphismUniqueness {M : ZOL {lzero} {lzero} {lzero} {lzero}} {m : Morphism zol M} where
|
||||||
|
|
||||||
|
open InitialMorphism M
|
||||||
|
mCon≡ : {Γ : Con} → mCon Γ ≡ (Morphism.mCon m Γ)
|
||||||
|
mFor≡ : {Γ : Con} {A : For} → mFor {Γ} A ≡ subst (ZOL.For M) (≡sym mCon≡) (Morphism.mFor m {Γ} A)
|
||||||
|
|
||||||
|
mCon≡ {◇} = ≡sym (Morphism.e◇ m)
|
||||||
|
mCon≡ {Γ ▹ₚ A} = ≡sym (≡tran (Morphism.e▹ₚ m) (cong₂' (ZOL._▹ₚ_ M) (≡sym mCon≡) (≡sym mFor≡)))
|
||||||
|
mFor≡ {Γ} {ι} = ≡sym (≡tran
|
||||||
|
(cong (subst (ZOL.For M) (≡sym mCon≡)) (Morphism.eι m))
|
||||||
|
(substpoly {f = λ {Ξ} → ZOL.ι M {Ξ}} {eq = ≡sym mCon≡})
|
||||||
|
)
|
||||||
|
mFor≡ {Γ} {A ⇒ B} = ≡sym (≡tran²
|
||||||
|
(cong (subst (ZOL.For M) (≡sym mCon≡)) (Morphism.e⇒ m))
|
||||||
|
(substppoly {eq = ≡sym (mCon≡ {Γ})} {f = λ {ξ} X Y → ZOL._⇒_ M {ξ} X Y})
|
||||||
|
(cong₂ (ZOL._⇒_ M) (≡sym (mFor≡ {Γ} {A})) (≡sym (mFor≡ {Γ} {B}))))
|
||||||
|
|
||||||
|
-- Those two lines are not needed as those sorts are in Prop
|
||||||
|
--mSub≡ : {Δ : Con}{Γ : Con}{σ : Sub Δ Γ} → mSub {Δ} {Γ} σ ≡ Morphism.mSub m {Δ} {Γ} σ
|
||||||
|
--mPf≡ : {Γ : Con} {A : For}{p : Pf Γ A} → mPf {Γ} {A} p ≡ Morphism.mPf m {Γ} {A} p
|
||||||
|
|
||||||
|
\end{code}
|
||||||
@ -36,7 +36,44 @@
|
|||||||
\subsection{Structure of this report}
|
\subsection{Structure of this report}
|
||||||
\section{A first account of Completeness and Normalization}
|
\section{A first account of Completeness and Normalization}
|
||||||
\subsection{Normalization for Propositional Logic}
|
\subsection{Normalization for Propositional Logic}
|
||||||
|
\begin{figure}
|
||||||
|
\begin{tcolorbox}
|
||||||
|
\[
|
||||||
|
\begin{array}{lcl}
|
||||||
|
\For & : & \Set \\
|
||||||
|
- \implies - & : & \For \rightarrow \For \rightarrow \For\\
|
||||||
|
ι & : & \For \\
|
||||||
|
\\
|
||||||
|
\Pf & : & \For \rightarrow \Prop^+ \\
|
||||||
|
\lam & : & (\Pf A \rightarrow^+ \Pf B) \rightarrow \Pf (A \implies B)\\
|
||||||
|
\app & : & \Pf (A \implies B) \rightarrow (\Pf A \rightarrow \Pf B)
|
||||||
|
\end{array}
|
||||||
|
\]
|
||||||
|
\end{tcolorbox}
|
||||||
|
\caption{ZOL Sogat Presentation}
|
||||||
|
\label{fig:zol-sogat}
|
||||||
|
\end{figure}
|
||||||
\subsection{Normalization for Infinitary First Order Logic}
|
\subsection{Normalization for Infinitary First Order Logic}
|
||||||
|
\begin{figure}
|
||||||
|
\begin{tcolorbox}
|
||||||
|
\[
|
||||||
|
\begin{array}{lcl}
|
||||||
|
\For & : & \Set \\
|
||||||
|
- \implies - & : & \For \rightarrow \For \rightarrow \For\\
|
||||||
|
\forall & : & (\operatorname{TM} \rightarrow \For) \rightarrow \For \\
|
||||||
|
\R & : & \operatorname{TM} \rightarrow \operatorname{TM} \rightarrow \For\\
|
||||||
|
\\
|
||||||
|
\Pf & : & \For \rightarrow \Prop^+ \\
|
||||||
|
\lam & : & (\Pf A \rightarrow^+ \Pf B) \rightarrow \Pf (A \implies B)\\
|
||||||
|
\app & : & \Pf (A \implies B) \rightarrow (\Pf A \rightarrow \Pf B)\\
|
||||||
|
\foralli & : & (t : \operatorname{TM} \rightarrow A\;t) \rightarrow \Pf (\forall A)\\
|
||||||
|
\foralle & : & \Pf (\forall A) \rightarrow (t : \operatorname{TM}) \rightarrow \Pf (A\;t)\\
|
||||||
|
\end{array}
|
||||||
|
\]
|
||||||
|
\end{tcolorbox}
|
||||||
|
\caption{ZOL Sogat Presentation}
|
||||||
|
\label{fig:ifol-sogat}
|
||||||
|
\end{figure}
|
||||||
\subsection{Merging the two proofs}
|
\subsection{Merging the two proofs}
|
||||||
\section{Predicate Logic}
|
\section{Predicate Logic}
|
||||||
\subsection{SOGAT Presentation of Predicate Logic}
|
\subsection{SOGAT Presentation of Predicate Logic}
|
||||||
|
|||||||
@ -121,6 +121,7 @@
|
|||||||
\newunicodechar{δ}{\textdelta}
|
\newunicodechar{δ}{\textdelta}
|
||||||
\newunicodechar{ε}{\textvarepsilon}
|
\newunicodechar{ε}{\textvarepsilon}
|
||||||
\newunicodechar{σ}{\textsigma}
|
\newunicodechar{σ}{\textsigma}
|
||||||
|
\newunicodechar{ι}{\textiota}
|
||||||
\newunicodechar{π}{\textpi}
|
\newunicodechar{π}{\textpi}
|
||||||
\newunicodechar{λ}{\textlambda}
|
\newunicodechar{λ}{\textlambda}
|
||||||
\newunicodechar{▹}{\ensuremath{\mathnormal{\triangleright}}}
|
\newunicodechar{▹}{\ensuremath{\mathnormal{\triangleright}}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user