{- ------------------------------------------------------------------------------------------------- thanks to ames, dolio, drvink, mxu, ncf, ovi, pgiarrusso, pounce, rak, roconnor, tuplanolla join ##dependent on libera.chat - Abel (2013) “NbE: Dependent types and impredicativity” https://www.cse.chalmers.se/~abela/habil.pdf - Altenkirch (1993) “Constructions, inductive types, and strong normalization” http://www.cs.nott.ac.uk/~psztxa/publ/phd93.pdf - Coquand (2002) “A formalised proof of the soundness and completeness of a STLC with explicit substitutions” https://github.com/dpndnt/library/blob/master/doc/pdf/coquand-2002.pdf - Ghani (1995) “Adjoint rewriting” https://www.cs.le.ac.uk/people/ng13/papers/yellowthesis.ps.gz - Kovacs (2017) “A machine-checked correctness proof of NBE for STLC” https://github.com/dpndnt/library/blob/master/doc/pdf/kovacs-2017.pdf - Schäfer (2019) “Engineering formal systems in constructive type theory” https://www.ps.uni-saarland.de/~schaefer/thesis/draft-screen.pdf ------------------------------------------------------------------------------------------------- -} module A202401.Everything where import A202401.Prelude import A202401.GAN import A202401.DBI ---------------------------------------------------------------------------------------------------- -- main version, with order-preserving embeddings import A202401.OPE import A202401.OPE-GAN import A202401.Kit1 import A202401.Kit2 import A202401.Kit2-GAN import A202401.Kit3 import A202401.Kit3-GAN import A202401.Kit4 import A202401.STLC-Base import A202401.STLC-Base-RenSub import A202401.STLC-Base-WNF import A202401.STLC-Base-WNF-CBV import A202401.STLC-Base-WNF-CBV-SN import A202401.STLC-Base-WNF-CBV-SN2 import A202401.STLC-Base-WNF-NBE import A202401.STLC-Base-WNF-NBE2 import A202401.STLC-Base-EWNF import A202401.STLC-Base-EWNF-CBV import A202401.STLC-Base-NF import A202401.STLC-Base-NF-AO import A202401.STLC-Base-NF-NDR import A202401.STLC-Base-NF-NDPR import A202401.STLC-Negative import A202401.STLC-Negative-RenSub import A202401.STLC-Negative-WNF import A202401.STLC-Negative-WNF-CBV import A202401.STLC-Negative-WNF-NBE import A202401.STLC-Negative-WNF-NBE2 import A202401.STLC-Naturals import A202401.STLC-Naturals-RenSub import A202401.STLC-Naturals-SWNF import A202401.STLC-Naturals-SWNF-CBV import A202401.STLC-Naturals-SWNF-NBE import A202401.STLC-Naturals-SWNF-NBE2 import A202401.STLC-Naturals-SWNF-NBE3 import A202401.STLC-Naturals-WNF import A202401.STLC-Naturals-WNF-CBV import A202401.STLC-Naturals-WNF-NBE import A202401.STLC-Naturals2 import A202401.STLC-Naturals2-NF import A202401.STLC-Naturals2-NF-NBE ---------------------------------------------------------------------------------------------------- -- alternative version, with first-order renamings import A202401.FOR import A202401.FOR-GAN import A202401.FOR-Kit1 import A202401.FOR-Kit2 import A202401.FOR-Kit2-GAN import A202401.FOR-Kit3 import A202401.FOR-Kit3-GAN import A202401.FOR-STLC-Base import A202401.FOR-STLC-Base-RenSub import A202401.FOR-STLC-Base-WNF import A202401.FOR-STLC-Base-WNF-CBV ---------------------------------------------------------------------------------------------------- -- alternative version, with higher-order renamings import A202401.HOR ---------------------------------------------------------------------------------------------------- -- roadmap towards correctness of NBE open A202401.STLC-Base-WNF-NBE2 open BetaShortEtaLongDefEq postulate -- Abel p.8: “preservation of meaning” lem-1 : ∀ {ℳ : Model} {W : World ℳ} {Γ A} (t : Γ ⊢ A) → ⟦ t ⟧ {ℳ} {W} ≡ ⟦ fst (nbe t) ⟧ -- Abel p.8: “idempotency” -- Kovacs p.59: “stability” lem-2 : ∀ {Γ A} (t : Γ ⊢ A) → NF t → t ≡ fst (nbe t) -- Abel p.8: “semantic equality” lem-3 : ∀ {ℳ : Model} {W : World ℳ} {Γ A} (t t′ : Γ ⊢ A) → ⟦ t ⟧ {ℳ} {W} ≡ ⟦ t′ ⟧ → nbe t ≡ nbe t′ -- Abel p.8: “βη-equivalence”; “definitional equality” _≝′_ : ∀ {Γ A} → Γ ⊢ A → Γ ⊢ A → Set _≝′_ = _≝_ postulate -- Abel p.8: “substitution is meaning-preserving” thm-i : ∀ {ℳ : Model} {W : World ℳ} {Γ A B} (t : Γ , A ⊢ B) (s : Γ ⊢ A) (γ : ℳ / W ⊩§ Γ) → ⟦ t ⟧ (γ , ⟦ s ⟧ γ) ≡ ⟦ t [ s ] ⟧ γ -- completeness of definitional equality? thm-j : ∀ {ℳ : Model} {W : World ℳ} {Γ A} {t t′ : Γ ⊢ A} → ⟦ t ⟧ {ℳ} {W} ≡ ⟦ t′ ⟧ → t ≝ t′ -- Abel p.10: “soundness of definitional equality” thm-k : ∀ {ℳ : Model} {W : World ℳ} {Γ A} {t t′ : Γ ⊢ A} → t ≝ t′ → ⟦ t ⟧ {ℳ} {W} ≡ ⟦ t′ ⟧ -- Coquand p.68: “extensional equality on semantic objects” Eq : ∀ {ℳ : Model} {W : World ℳ} A → ℳ / W ⊩ A → ℳ / W ⊩ A → Set -- Coquand p.73 thm-1 : ∀ {Γ A} {v v′ : 𝒞 / Γ ⊩ A} → Eq A v v′ → ↓ {A} v ≡ ↓ v′ -- Coquand p.73 cor-1 : ∀ {Γ A} (t t′ : Γ ⊢ A) → Eq A (⟦ t ⟧ vid§) (⟦ t′ ⟧ vid§) → nbe t ≡ nbe t′ -- Abel p.10: “soundness”, “normalization is compatible with definitional equality” -- Coquand p.74 -- Kovacs p.45: “completeness” thm-2 : ∀ {Γ A} (t : Γ ⊢ A) → t ≝ fst (nbe t) -- Coquand p.75: “completeness of conversion rules” thm-3 : ∀ {Γ A} (t t′ : Γ ⊢ A) → Eq A (⟦ t ⟧ vid§) (⟦ t′ ⟧ vid§) → t ≝ t′ -- Coquand p.76: “soundness of conversion rules” thm-4 : ∀ {ℳ : Model} {W : World ℳ} {Γ A} (t t′ : Γ ⊢ A) (γ : ℳ / W ⊩§ Γ) → t ≝ t′ → Eq A (⟦ t ⟧ γ) (⟦ t′ ⟧ γ) -- Coquand p.76: “correctness [soundness?] of decision algorithm for conversion” thm-5 : ∀ {Γ A} (t t′ : Γ ⊢ A) → nbe t ≡ nbe t′ → t ≝ t′ lem-t : ∀ {Γ} → vid§ {Γ = Γ} ≡ vren§ (refl≤ 𝒞) vid§ -- -- Abel p.10: “completeness”, “definitionally equal terms have identical normal forms” -- -- Coquand p.76: “completeness of decision algorithm for conversion” -- -- Kovacs p.52: “soundness” -- module _ where -- open ≡-Reasoning -- thm-6 : ∀ {Γ A} {t t′ : Γ ⊢ A} → t ≝ t′ → nbe t ≡ nbe t′ -- thm-6 refl≝ = refl -- thm-6 (sym≝ deq) with thm-k deq -- ... | eq = (λ v → ↓ (v vid§)) & eq ⁻¹ -- thm-6 (trans≝ deq deq′) with thm-k deq | thm-k deq′ -- ... | eq | eq′ = (λ v → ↓ (v vid§)) & (eq ⋮ eq′) -- thm-6 {Γ} (congλ deq) with thm-k {ℳ = 𝒞} {W = Γ} deq -- TODO -- ... | eq = {!!} -- thm-6 (cong$ {t₁ = t₁} {t₁′} {t₂} {t₂′} deq₁ deq₂) with thm-k deq₁ | thm-k deq₂ -- ... | eq | eq′ = ↓ & ( -- begin -- ⟦ t₁ ⟧ vid§ id⊑ (⟦ t₂ ⟧ vid§) -- ≡⟨ ⟦ t₁ ⟧ vid§ id⊑ & congapp eq′ vid§ ⟩ -- ⟦ t₁ ⟧ vid§ id⊑ (⟦ t₂′ ⟧ vid§) -- ≡⟨ congapp (congapp (congapp′ (congapp eq vid§)) id⊑) (⟦ t₂′ ⟧ vid§) ⟩ -- ⟦ t₁′ ⟧ vid§ id⊑ (⟦ t₂′ ⟧ vid§) -- ∎) -- thm-6 (βred⊃ {t₁ = t₁} {t₂} refl) = ↓ & ( -- begin -- ⟦ ⌜λ⌝ t₁ ⌜$⌝ t₂ ⟧ vid§ -- ≡⟨⟩ -- ⟦ t₁ ⟧ (vren§ id⊑ vid§ , ⟦ t₂ ⟧ vid§) -- ≡⟨ (λ γ → ⟦ t₁ ⟧ (γ , ⟦ t₂ ⟧ vid§)) & lem-t ⁻¹ ⟩ -- ⟦ t₁ ⟧ (vid§ , ⟦ t₂ ⟧ vid§) -- ≡⟨ thm-i t₁ t₂ vid§ ⟩ -- ⟦ t₁ [ t₂ ] ⟧ vid§ -- ∎) -- thm-6 {Γ} (ηexp⊃ refl) = {!!} -- TODO -- -- Kovacs p.59: “decision procedure for conversion” -- module _ where -- open ≝-Reasoning -- _≝?_ : ∀ {Γ A} (t t′ : Γ ⊢ A) → Dec (t ≝ t′) -- t ≝? t′ with fst (nbe t) ≟ fst (nbe t′) -- ... | no ¬eq = no λ eq → (fst & thm-6 eq) ↯ ¬eq -- ... | yes eq = yes ( -- begin -- t -- ≝⟨ thm-2 t ⟩ -- fst (nbe t) -- ≡⟨ eq ⟩ -- fst (nbe t′) -- ≝˘⟨ thm-2 t′ ⟩ -- t′ -- ∎) -- ----------------------------------------------------------------------------------------------------