module Combinatory.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 Combinatory.Signature
private
variable
Ξ Ξ Ξ : Ctx
Ξ± : *T
π : Familyβ
module CL:Terms (π : Familyβ) where
data CL : Familyβ where
var : β βΎΜ£ CL
mvar : π Ξ± Ξ β Sub CL Ξ Ξ β CL Ξ± Ξ
_$_ : CL * Ξ β CL * Ξ β CL * Ξ
I : CL * Ξ
K : CL * Ξ
S : CL * Ξ
infixl 20 _$_
open import SOAS.Metatheory.MetaAlgebra β
F π
CLα΅ : MetaAlg CL
CLα΅ = record
{ πππ = Ξ» where
(appβ β
a , b) β _$_ a b
(iβ β
_) β I
(kβ β
_) β K
(sβ β
_) β S
; π£ππ = var ; ππ£ππ = Ξ» πͺ mΞ΅ β mvar πͺ (tabulate mΞ΅) }
module CLα΅ = MetaAlg CLα΅
module _ {π : Familyβ}(πα΅ : MetaAlg π) where
open MetaAlg πα΅
π€ππ : CL βΎΜ£ π
π : Sub CL Ξ Ξ β Ξ ~[ π ]β Ξ
π (t β Ο) new = π€ππ t
π (t β Ο) (old v) = π Ο v
π€ππ (mvar πͺ mΞ΅) = ππ£ππ πͺ (π mΞ΅)
π€ππ (var v) = π£ππ v
π€ππ (_$_ a b) = πππ (appβ β
π€ππ a , π€ππ b)
π€ππ I = πππ (iβ β
tt)
π€ππ K = πππ (kβ β
tt)
π€ππ S = πππ (sβ β
tt)
π€ππα΅β : MetaAlgβ CLα΅ πα΅ π€ππ
π€ππα΅β = record
{ β¨πππβ© = Ξ»{ {t = t} β β¨πππβ© t }
; β¨π£ππβ© = refl
; β¨ππ£ππβ© = Ξ»{ {πͺ = πͺ}{mΞ΅} β cong (ππ£ππ πͺ) (dext (π-tab mΞ΅)) } }
where
open β‘-Reasoning
β¨πππβ© : (t : β
CL Ξ± Ξ) β π€ππ (CLα΅.πππ t) β‘ πππ (β
β π€ππ t)
β¨πππβ© (appβ β
_) = refl
β¨πππβ© (iβ β
_) = refl
β¨πππβ© (kβ β
_) = refl
β¨πππβ© (sβ β
_) = refl
π-tab : (mΞ΅ : Ξ ~[ CL ]β Ξ)(v : β Ξ± Ξ ) β π (tabulate mΞ΅) v β‘ π€ππ (mΞ΅ v)
π-tab mΞ΅ new = refl
π-tab mΞ΅ (old v) = π-tab (mΞ΅ β old) v
module _ (g : CL βΎΜ£ π)(gα΅β : MetaAlgβ CLα΅ πα΅ g) where
open MetaAlgβ gα΅β
π€ππ! : (t : CL Ξ± Ξ) β π€ππ t β‘ g t
π-ix : (mΞ΅ : Sub CL Ξ Ξ)(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 β¨πππβ©
π€ππ! I = sym β¨πππβ©
π€ππ! K = sym β¨πππβ©
π€ππ! S = sym β¨πππβ©
CL:Syn : Syntax
CL:Syn = record
{ β
F = β
F
; β
:CS = β
:CompatStr
; mvarα΅’ = CL:Terms.mvar
; π:Init = Ξ» π β let open CL:Terms π in record
{ β₯ = CL β CLα΅
; β₯-is-initial = record { ! = Ξ»{ {π β πα΅} β π€ππ πα΅ β π€ππα΅β πα΅ }
; !-unique = Ξ»{ {π β πα΅} (f β fα΅β) {x = t} β π€ππ! πα΅ f fα΅β t } } } }
open Syntax CL:Syn public
open CL:Terms public
open import SOAS.Families.Build public
open import SOAS.Syntax.Shorthands CLα΅ public
open import SOAS.Metatheory CL:Syn public