open import Prelude
open import WSLN.Index
open import WSLN.Atom
open import WSLN.Fresh
open import WSLN.Sig.Sig
open import WSLN.Sig.Term
module WSLN.Sig.Substitution β¦ Ξ£ : Sig β¦ where
Sb : Set
Sb = πΈ β Trm
idΛ’ : Sb
idΛ’ = π
instance
IdentitySb : Identity Sb
id β¦ IdentitySb β¦ = idΛ’
Rn : Set
Rn = πΈ β πΈ
idΚ³ : Rn
idΚ³ = id
πβ : Rn β Sb
πβ Ο = π β Ο
actSb : β{n} β Sb β Trm[ n ] β Trm[ n ]
actSb' : β{n ns} β Sb β Arg[ n ] ns β Arg[ n ] ns
actSb Ο (π’ i) = π’ i
actSb Ο (π x) = (Ο x βΏ _)
actSb Ο (π¨ op ts) = π¨ op (actSb' Ο ts)
actSb' Ο [] = []
actSb' Ο (t :: ts) = actSb Ο t :: actSb' Ο ts
instance
ApplySb : β{n} β Apply Sb Trm[ n ] Trm[ n ]
_*_ β¦ ApplySb β¦ = actSb
ApplySb' : β{n ns } β Apply Sb (Arg[ n ] ns) (Arg[ n ] ns)
_*_ β¦ ApplySb' β¦ = actSb'
ApplyRn : β{n} β Apply Rn Trm[ n ] Trm[ n ]
_*_ β¦ ApplyRn β¦ Ο t = πβ Ο * t
ApplyRn' : β{n ns} β Apply Rn (Arg[ n ] ns) (Arg[ n ] ns)
_*_ β¦ ApplyRn' β¦ Ο t = πβ Ο * t
{-# DISPLAY actSb Ο t = Ο * t #-}
{-# DISPLAY actSb' Ο ts = Ο * ts #-}
sbRespSupp :
{n : β}
(Ο Ο' : Sb)
(t : Trm[ n ])
(_ : β x β x β supp t β Ο x β‘ Ο' x)
β
Ο * t β‘ Ο' * t
sbRespSupp' :
{n : β}
{ns : List β}
(Ο Ο' : Sb)
(ts : Arg[ n ] ns)
(_ : β x β x β supp ts β Ο x β‘ Ο' x)
β
Ο * ts β‘ Ο' * ts
sbRespSupp _ _ (π’ _) _ = refl
sbRespSupp _ _ (π x) e
rewrite e x βο½ο½ = refl
sbRespSupp Ο Ο' (π¨ op ts) e
rewrite sbRespSupp' Ο Ο' ts e = refl
sbRespSupp' _ _ [] _ = refl
sbRespSupp' Ο Ο' (t :: ts) e
rewrite sbRespSupp Ο Ο' t (Ξ» x xβt β e x (ββͺβ xβt))
| sbRespSupp' Ο Ο' ts (Ξ» x xβts β e x (ββͺβ xβts)) = refl
rnRespSupp :
{n : β}
(Ο Ο' : Rn)
(t : Trm[ n ])
(_ : β x β x β supp t β Ο x β‘ Ο' x)
β
Ο * t β‘ Ο' * t
rnRespSupp Ο Ο' t e =
sbRespSupp (πβ Ο) (πβ Ο') t (Ξ» x xβt β cong π (e x xβt))
infixr 5 _βΛ’_
_βΛ’_ : Sb β Sb β Sb
(Ο' βΛ’ Ο) x = Ο' * (Ο x)
instance
CompositionSb : Composition Sb Sb Sb
_β_ β¦ CompositionSb β¦ = _βΛ’_
sbβΏ :
{m : β}
(t : Trm[ m ])
(n : β)
β¦ _ : m β€ n β¦
(Ο : Sb)
β
Ο * (t βΏ n) β‘ (Ο * t) βΏ n
sbβΏ' :
{ns : List β}
{m : β}
(ts : Arg[ m ] ns)
(n : β)
β¦ _ : m β€ n β¦
(Ο : Sb)
β
Ο * (ts βΏ n) β‘ (Ο * ts) βΏ n
sbβΏ (π’ _) _ _ = refl
sbβΏ (π x) _ Ο = symm (βΏassoc (Ο x) _ _)
sbβΏ (π¨ op ts) n Ο = cong (π¨ op) (sbβΏ' ts n Ο )
sbβΏ' [] _ _ = refl
sbβΏ' (t :: ts) n Ο = congβ _::_
(sbβΏ t (_ + n) β¦ +β€ β¦ Ο)
(sbβΏ' ts n Ο)
rnβΏ :
{m : β}
(t : Trm[ m ])
(n : β)
β¦ _ : m β€ n β¦
(Ο : Rn)
β
Ο * (t βΏ n) β‘ (Ο * t) βΏ n
rnβΏ t n Ο = sbβΏ t n (πβ Ο)
sbUnit :
{n : β}
(t : Trm[ n ])
β
idΛ’ * t β‘ t
sbUnit' :
{ns : List β}
{n : β}
(ts : Arg[ n ] ns)
β
idΛ’ * ts β‘ ts
sbUnit (π’ _) = refl
sbUnit (π _) = refl
sbUnit (π¨ op ts)
rewrite sbUnit' ts = refl
sbUnit' [] = refl
sbUnit' (t :: ts)
rewrite sbUnit t
| sbUnit' ts = refl
sbAssoc :
{n : β}
(Ο Ο' : Sb)
(t : Trm[ n ])
β
(Ο' β Ο) * t β‘ Ο' * (Ο * t)
sbAssoc' :
{ns : List β}
{n : β}
(Ο Ο' : Sb)
(ts : Arg[ n ] ns)
β
(Ο' β Ο) * ts β‘ Ο' * (Ο * ts)
sbAssoc _ _ (π’ _) = refl
sbAssoc{n} Ο Ο' (π x)
rewrite sbβΏ (Ο x) n Ο' = refl
sbAssoc Ο Ο' (π¨ op ts)
rewrite sbAssoc' Ο Ο' ts = refl
sbAssoc' _ _ [] = refl
sbAssoc' Ο Ο' (t :: ts)
rewrite sbAssoc Ο Ο' t
| sbAssoc' Ο Ο' ts = refl
rnUnit :
{n : β}
(t : Trm[ n ])
β
idΚ³ * t β‘ t
rnUnit = sbUnit
rnAssoc :
{n : β}
(Ο Ο' : Rn)
(t : Trm[ n ])
β
(Ο' β Ο) * t β‘ Ο' * (Ο * t)
rnAssoc Ο Ο' = sbAssoc (πβ Ο) (πβ Ο')
updateEq :
{Ο : Sb}
{t : Trm}
(x : πΈ)
β
(Ο β/ x := t) * π x β‘ t
updateEq{Ο}{t} x
rewrite :=Eq {f = Ο} {t} x
| βΏunit t β¦ it β¦ = refl
updateFresh :
{n : β}
(Ο : Sb)
(x : πΈ)
(u : Trm)
(t : Trm[ n ])
(_ : x # t)
β
(Ο β/ x := u) * t β‘ Ο * t
updateFresh Ο x u t x#t = sbRespSupp (Ο β/ x := u) Ο t
(Ξ» y yβt β :=Neq x _ Ξ»{refl β ββΒ¬β x#t yβt})
updateIdSb :
{n : β}
(x : πΈ)
(t : Trm[ n ])
β
(x := π x) * t β‘ t
updateIdSb x t
rewrite sbRespSupp (x := π x) idΛ’ t (Ξ» x' _ β :=Id x x')
| sbUnit t = refl
ssbFresh :
{n : β}
(x : πΈ)
(u : Trm)
(t : Trm[ n ])
(_ : x # t)
β
(x := u) * t β‘ t
ssbFresh x u t x#t
rewrite updateFresh idΛ’ x u t x#t
| sbUnit t = refl
updateRn :
{n : β}
(Ο : Rn)
(x x' : πΈ)
(t : Trm[ n ])
β
(πβ Ο β/ x := π x') * t β‘ πβ(Ο β/ x := x') * t
updateRn Ο x x' t =
sbRespSupp (πβ Ο β/ x := π x') (πβ (Ο β/ x := x')) t f
where
f : β y β y β supp t β (πβ Ο β/ x := π x') y β‘ πβ (Ο β/ x := x') y
f y _ with x β y
... | no _ = refl
... | yes _ = refl
updateId :
{n : β}
(x : πΈ)
(t : Trm[ n ])
β
(x := x) * t β‘ t
updateId x t
rewrite rnRespSupp (x := x) id t (Ξ» x' _ β :=Id x x') = rnUnit t
updateFreshRn :
{n : β}
(Ο : Rn)
(x y : πΈ)
(t : Trm[ n ])
(_ : x # t)
β
(Ο β/ x := y) * t β‘ Ο * t
updateFreshRn Ο x y t x#t
rewrite symm (updateRn Ο x y t) = updateFresh (πβ Ο) x (π y) t x#t