module TLC.Syntax where
open import SOAS.Common
open import SOAS.Context
open import SOAS.Variable
open import SOAS.Families.Core
open import SOAS.Construction.Structure
open import SOAS.ContextMaps.Inductive
open import SOAS.Metatheory.Syntax
open import TLC.Signature
private
variable
Ξ Ξ Ξ : Ctx
Ξ± Ξ² Ξ³ : ΞT
π : Familyβ
module Ξ:Terms (π : Familyβ) where
data Ξ : Familyβ where
var : β βΎΜ£ Ξ
mvar : π Ξ± Ξ β Sub Ξ Ξ Ξ β Ξ Ξ± Ξ
_$_ : Ξ (Ξ± β£ Ξ²) Ξ β Ξ Ξ± Ξ β Ξ Ξ² Ξ
Ζ_ : Ξ Ξ² (Ξ± β Ξ) β Ξ (Ξ± β£ Ξ²) Ξ
unit : Ξ π Ξ
β¨_,_β© : Ξ Ξ± Ξ β Ξ Ξ² Ξ β Ξ (Ξ± β Ξ²) Ξ
fst : Ξ (Ξ± β Ξ²) Ξ β Ξ Ξ± Ξ
snd : Ξ (Ξ± β Ξ²) Ξ β Ξ Ξ² Ξ
abort : Ξ π Ξ β Ξ Ξ± Ξ
inl : Ξ Ξ± Ξ β Ξ (Ξ± β Ξ²) Ξ
inr : Ξ Ξ² Ξ β Ξ (Ξ± β Ξ²) Ξ
case : Ξ (Ξ± β Ξ²) Ξ β Ξ Ξ³ (Ξ± β Ξ) β Ξ Ξ³ (Ξ² β Ξ) β Ξ Ξ³ Ξ
ze : Ξ N Ξ
su : Ξ N Ξ β Ξ N Ξ
nrec : Ξ N Ξ β Ξ Ξ± Ξ β Ξ Ξ± (Ξ± β N β Ξ) β Ξ Ξ± Ξ
infixl 20 _$_
infixr 10 Ζ_
open import SOAS.Metatheory.MetaAlgebra β
F π
Ξα΅ : MetaAlg Ξ
Ξα΅ = record
{ πππ = Ξ» where
(appβ β
a , b) β _$_ a b
(lamβ β
a) β Ζ_ a
(unitβ β
_) β unit
(pairβ β
a , b) β β¨_,_β© a b
(fstβ β
a) β fst a
(sndβ β
a) β snd a
(abortβ β
a) β abort a
(inlβ β
a) β inl a
(inrβ β
a) β inr a
(caseβ β
a , b , c) β case a b c
(zeβ β
_) β ze
(suβ β
a) β su a
(nrecβ β
a , b , c) β nrec a b c
; π£ππ = var ; ππ£ππ = Ξ» πͺ mΞ΅ β mvar πͺ (tabulate mΞ΅) }
module Ξα΅ = MetaAlg Ξα΅
module _ {π : Familyβ}(πα΅ : MetaAlg π) where
open MetaAlg πα΅
π€ππ : Ξ βΎΜ£ π
π : Sub Ξ Ξ Ξ β Ξ ~[ π ]β Ξ
π (t β Ο) new = π€ππ t
π (t β Ο) (old v) = π Ο v
π€ππ (mvar πͺ mΞ΅) = ππ£ππ πͺ (π mΞ΅)
π€ππ (var v) = π£ππ v
π€ππ (_$_ a b) = πππ (appβ β
π€ππ a , π€ππ b)
π€ππ (Ζ_ a) = πππ (lamβ β
π€ππ a)
π€ππ unit = πππ (unitβ β
tt)
π€ππ (β¨_,_β© a b) = πππ (pairβ β
π€ππ a , π€ππ b)
π€ππ (fst a) = πππ (fstβ β
π€ππ a)
π€ππ (snd a) = πππ (sndβ β
π€ππ a)
π€ππ (abort a) = πππ (abortβ β
π€ππ a)
π€ππ (inl a) = πππ (inlβ β
π€ππ a)
π€ππ (inr a) = πππ (inrβ β
π€ππ a)
π€ππ (case a b c) = πππ (caseβ β
π€ππ a , π€ππ b , π€ππ c)
π€ππ ze = πππ (zeβ β
tt)
π€ππ (su a) = πππ (suβ β
π€ππ a)
π€ππ (nrec a b c) = πππ (nrecβ β
π€ππ a , π€ππ b , π€ππ c)
π€ππα΅β : MetaAlgβ Ξα΅ πα΅ π€ππ
π€ππα΅β = record
{ β¨πππβ© = Ξ»{ {t = t} β β¨πππβ© t }
; β¨π£ππβ© = refl
; β¨ππ£ππβ© = Ξ»{ {πͺ = πͺ}{mΞ΅} β cong (ππ£ππ πͺ) (dext (π-tab mΞ΅)) } }
where
open β‘-Reasoning
β¨πππβ© : (t : β
Ξ Ξ± Ξ) β π€ππ (Ξα΅.πππ t) β‘ πππ (β
β π€ππ t)
β¨πππβ© (appβ β
_) = refl
β¨πππβ© (lamβ β
_) = refl
β¨πππβ© (unitβ β
_) = refl
β¨πππβ© (pairβ β
_) = refl
β¨πππβ© (fstβ β
_) = refl
β¨πππβ© (sndβ β
_) = refl
β¨πππβ© (abortβ β
_) = refl
β¨πππβ© (inlβ β
_) = refl
β¨πππβ© (inrβ β
_) = refl
β¨πππβ© (caseβ β
_) = refl
β¨πππβ© (zeβ β
_) = refl
β¨πππβ© (suβ β
_) = refl
β¨πππβ© (nrecβ β
_) = refl
π-tab : (mΞ΅ : Ξ ~[ Ξ ]β Ξ)(v : β Ξ± Ξ ) β π (tabulate mΞ΅) v β‘ π€ππ (mΞ΅ v)
π-tab mΞ΅ new = refl
π-tab mΞ΅ (old v) = π-tab (mΞ΅ β old) v
module _ (g : Ξ βΎΜ£ π)(gα΅β : MetaAlgβ Ξα΅ πα΅ g) where
open MetaAlgβ gα΅β
π€ππ! : (t : Ξ Ξ± Ξ) β π€ππ t β‘ g t
π-ix : (mΞ΅ : Sub Ξ Ξ Ξ)(v : β Ξ± Ξ ) β π mΞ΅ v β‘ g (index mΞ΅ v)
π-ix (x β mΞ΅) new = π€ππ! x
π-ix (x β mΞ΅) (old v) = π-ix mΞ΅ v
π€ππ! (mvar πͺ mΞ΅) rewrite cong (ππ£ππ πͺ) (dext (π-ix mΞ΅))
= trans (sym β¨ππ£ππβ©) (cong (g β mvar πͺ) (tabβixβid mΞ΅))
π€ππ! (var v) = sym β¨π£ππβ©
π€ππ! (_$_ a b) rewrite π€ππ! a | π€ππ! b = sym β¨πππβ©
π€ππ! (Ζ_ a) rewrite π€ππ! a = sym β¨πππβ©
π€ππ! unit = sym β¨πππβ©
π€ππ! (β¨_,_β© a b) rewrite π€ππ! a | π€ππ! b = sym β¨πππβ©
π€ππ! (fst a) rewrite π€ππ! a = sym β¨πππβ©
π€ππ! (snd a) rewrite π€ππ! a = sym β¨πππβ©
π€ππ! (abort a) rewrite π€ππ! a = sym β¨πππβ©
π€ππ! (inl a) rewrite π€ππ! a = sym β¨πππβ©
π€ππ! (inr a) rewrite π€ππ! a = sym β¨πππβ©
π€ππ! (case a b c) rewrite π€ππ! a | π€ππ! b | π€ππ! c = sym β¨πππβ©
π€ππ! ze = sym β¨πππβ©
π€ππ! (su a) rewrite π€ππ! a = sym β¨πππβ©
π€ππ! (nrec a b c) rewrite π€ππ! a | π€ππ! b | π€ππ! c = sym β¨πππβ©
Ξ:Syn : Syntax
Ξ:Syn = record
{ β
F = β
F
; β
:CS = β
:CompatStr
; mvarα΅’ = Ξ:Terms.mvar
; π:Init = Ξ» π β let open Ξ:Terms π in record
{ β₯ = Ξ β Ξα΅
; β₯-is-initial = record { ! = Ξ»{ {π β πα΅} β π€ππ πα΅ β π€ππα΅β πα΅ }
; !-unique = Ξ»{ {π β πα΅} (f β fα΅β) {x = t} β π€ππ! πα΅ f fα΅β t } } } }
open Syntax Ξ:Syn public
open Ξ:Terms public
open import SOAS.Families.Build public
open import SOAS.Syntax.Shorthands Ξα΅ public
open import SOAS.Metatheory Ξ:Syn public
true : Ξ π B Ξ
true = inl unit
false : Ξ π B Ξ
false = inr unit
if : Ξ π B Ξ β Ξ π Ξ± Ξ β Ξ π Ξ± Ξ β Ξ π Ξ± Ξ
if b t e = case b (Theory.π¨π _ t) (Theory.π¨π _ e)
plus : Ξ π (N β£ N β£ N) Ξ
plus = Ζ (Ζ (nrec xβ xβ (su xβ)))
uncurry : Ξ π ((Ξ± β£ Ξ² β£ Ξ³) β£ (Ξ± β Ξ²) β£ Ξ³) Ξ
uncurry = Ζ Ζ xβ $ fst xβ $ snd xβ