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
open import WSLN.Sig.Substitution
open import WSLN.Sig.Concretion
module WSLN.Sig.Abstraction β¦ Ξ£ : Sig β¦ where
infix 6 _<~_ _<~'_
_<~_ :
{m : β}
(_ : Fin (1+ m))
(_ : πΈ)
(_ : Trm[ m ])
β
Trm[ 1+ m ]
_<~'_ :
{ns : List β}
{m : β}
(_ : Fin (1+ m))
(_ : πΈ)
(_ : Arg[ m ] ns)
β
Arg[ 1+ m ] ns
cls :
{m n : β}
(_ : πΈ)
(_ : Fin n)
(_ : Trm[ m ])
(_ : n β‘ 1+ m)
β
Trm[ n ]
cls' :
{m n : β}
{ns : List β}
(_ : πΈ)
(_ : Fin n)
(_ : Arg[ m ] ns)
(_ : n β‘ 1+ m)
β
Arg[ n ] ns
(i <~ x) t = cls x i t refl
(i <~' x) ts = cls' x i ts refl
cls x i (π’ j) refl = π’ (insert i j)
cls x i (π y) refl with x β y
... | yes _ = π’ i
... | no _ = π y
cls x i (π¨ op ts) refl = π¨ op (cls' x i ts refl)
cls' _ _ [] _ = []
cls' {m = m} x i (t :: ts) refl =
(cls x (suc^ i) t 1++) :: (cls' x i ts refl)
infixr 2 _οΌ_
_οΌ_ : β{n} β πΈ β Trm[ n ] β Trm[ 1+ n ]
x οΌ t = (zero <~ x) t
{-# DISPLAY _<~_ Fin.zero x t = x οΌ t #-}
{-# DISPLAY cls x Fin.zero t refl = x οΌ t #-}
opnFinβ’ :
{n : β}
{i j : Fin (1+ n)}
β¦ _ : i β j β¦
(t : Trm)
β
opn i t (π’ j) refl β‘ π’ (remove i j)
opnFinβ’ {i = i} {j} β¦ p β¦ _ with i β j
... | no Β¬p' = cong π’ (removeIrrel i j j β¦ β’ββ i Β¬p' β¦ β¦ p β¦ refl)
... | equ = Γelim (β iirrefl p)
opnCls :
{m n : β}
(x : πΈ)
(i : Fin n)
(t : Trm[ m ])
(e : n β‘ 1+ m)
(b : Trm)
β
opn i b (cls x i t e) e β‘ (x := b) * t
opnCls' :
{m n : β}
{ns : List β}
(x : πΈ)
(i : Fin n)
(ts : Arg[ m ] ns)
(e : n β‘ 1+ m)
(b : Trm)
β
opn' i b (cls' x i ts e) e β‘ (x := b) * ts
opnCls x i (π’ j) refl b
rewrite opnFinβ’ β¦ insertAvoids i j β¦ b = cong π’
(removeInsert i j β¦ insertAvoids i j β¦)
opnCls x i (π y) refl _ with x β y
... | no _ = refl
... | equ with i β i
... | no Β¬p = Γelim (Β¬p refl)
... | yes _ = refl
opnCls x i (π¨ op ts) refl b = cong (π¨ op)
(opnCls' x i ts refl b)
opnCls' _ _ [] _ _ = refl
opnCls' x i (t :: ts) refl b = congβ _::_
(opnCls x (suc^ i) t 1++ b)
(opnCls' x i ts refl b)
concAbs :
{n : β}
(x : πΈ)
(t : Trm[ n ])
(b : Trm)
β
(x οΌ t) [ b ] β‘ (x := b) * t
concAbs x t = opnCls x zero t refl
concAbs' :
{n : β}
(x : πΈ)
(t : Trm[ n ])
β
(x οΌ t) [ x ] β‘ t
concAbs' x t = subst ((x οΌ t) [ x ] β‘_) (updateIdSb x t)
(concAbs x t (π x))
clsOpn :
{m n : β}
(x : πΈ)
(i : Fin m)
(t : Trm[ m ])
(e : m β‘ 1+ n)
(_ : x # t)
β
cls x i (opn i (π x) t e) e β‘ t
clsOpn' :
{m n : β}
{ns : List β}
(x : πΈ)
(i : Fin m)
(ts : Arg[ m ] ns)
(e : m β‘ 1+ n)
(_ : x # ts)
β
cls' x i (opn' i (π x) ts e) e β‘ ts
clsOpn x i (π’ j) refl ββ
with i β j
... | no Β¬p = cong π’ (insertRemove i j β¦ β’ββ i Β¬p β¦)
... | equ with x β x
... | no Β¬p = Γelim (Β¬p refl)
... | yes _ = refl
clsOpn x i (π y) refl (βο½ο½ p) with x β y
... | equ = Γelim (β πΈirrefl p)
... | no _ = refl
clsOpn x i (π¨ op ts) refl p = cong (π¨ op)
(clsOpn' x i ts refl p)
clsOpn' _ _ [] _ _ = refl
clsOpn' x i (t :: ts) refl (p ββͺ p') = congβ _::_
(clsOpn x (suc^ i) t 1++ p)
(clsOpn' x i ts refl p')
absConc :
{n : β}
(x : πΈ)
(t : Trm[ 1+ n ])
(_ : x # t)
β
(x οΌ t [ x ]) β‘ t
absConc x t = clsOpn x zero t refl
cls# :
{k m n : β}
(x : πΈ)
(i : Fin n)
(e : n β‘ 1+ m)
(_ : k β€ toβ i)
β¦ _ : k β€ m β¦
β¦ _ : k β€ n β¦
(t : Trm[ k ])
(_ : x # t)
β
cls x i (t βΏ m) e β‘ t βΏ n
cls#' :
{k m n : β}
{ns : List β}
(x : πΈ)
(i : Fin n)
(e : n β‘ 1+ m)
(_ : k β€ toβ i)
β¦ _ : k β€ m β¦
β¦ _ : k β€ n β¦
(ts : Arg[ k ] ns)
(_ : x # ts)
β
cls' x i (ts βΏ m) e β‘ ts βΏ n
cls# x i refl q (π’ j) ββ
= cong π’
(insert< i j (β€trans (toβ< j) q))
cls# x i refl q (π y) (βο½ο½ p) with x β y
... | no _ = refl
... | equ = Γelim (β πΈirrefl p)
cls# x i refl q (π¨ op ts) p = cong (π¨ op)
(cls#' x i refl q ts p)
cls#' _ _ _ _ [] _ = refl
cls#'{k} x i refl q (_::_{m = m} t ts) (p ββͺ p') = congβ _::_
(cls# x (suc^ i) 1++ r β¦ +β€ β¦ β¦ +β€ β¦ t p)
(cls#' x i refl q ts p')
where
r : m + k β€ toβ (suc^{m} i)
r rewrite toββsuc^ i m = +β€ β¦ q β¦
abs# :
(x : πΈ)
(t : Trm)
β
x # t β (x οΌ t) β‘ t βΏ _
abs# x t x#t =
begin
cls x zero t refl
β‘Λβ¨ cong (Ξ» b β cls x zero b refl) (βΏunit t) β©
cls x zero (t βΏ _) refl
β‘β¨ cls# x zero refl 0β€ t x#t β©
t βΏ _
β
suppCls :
{m n : β}
(x : πΈ)
(i : Fin n)
(t : Trm[ m ])
(e : n β‘ 1+ m)
β
supp (cls x i t e) β supp t
suppCls' :
{m n : β}
{ns : List β}
(x : πΈ)
(i : Fin n)
(ts : Arg[ m ] ns)
(e : n β‘ 1+ m)
β
supp (cls' x i ts e) β supp ts
suppCls x _ (π y) refl p with x β y
... | equ with () β p
... | no _ = p
suppCls x i (π¨ op ts) refl p = suppCls' x i ts refl p
suppCls' x i (t :: _) refl (ββͺβ p) =
ββͺβ (suppCls x (suc^ i) t 1++ p)
suppCls' x i (_ :: ts) refl (ββͺβ p) =
ββͺβ (suppCls' x i ts refl p)
suppAbs :
{n : β}
(x : πΈ)
(t : Trm[ n ])
β
supp (x οΌ t) β supp t
suppAbs x t = suppCls x zero t refl
#cls :
{m n : β}
(x : πΈ)
(i : Fin n)
(t : Trm[ m ])
(e : n β‘ 1+ m)
β
x # (cls x i t e)
#cls' :
{m n : β}
{ns : List β}
(x : πΈ)
(i : Fin n)
(ts : Arg[ m ] ns)
(e : n β‘ 1+ m)
β
x # (cls' x i ts e)
#cls _ _ (π’ _) refl = ββ
#cls x _ (π y) refl with x β y
... | equ = ββ
... | no Β¬p = βο½ο½ (β’ββ πΈ Β¬p)
#cls x i (π¨ op ts) refl = #cls' x i ts refl
#cls' _ _ [] refl = ββ
#cls'{m} x i (_::_{m = k} t ts) refl =
(#cls x (suc^ i) t 1++) ββͺ (#cls' x i ts refl)
#abs :
{n : β}
(x : πΈ)
(t : Trm[ n ])
β
x # (x οΌ t)
#abs x t = #cls x zero t refl
#clsβ :
{m n : β}
{x y : πΈ}
(i : Fin n)
(t : Trm[ m ])
(e : n β‘ 1+ m)
(_ : y # (x , t))
β
y # (cls x i t e)
#cls'β :
{m n : β}
{ns : List β}
{x y : πΈ}
(i : Fin n)
(ts : Arg[ m ] ns)
(e : n β‘ 1+ m)
(_ : y # (x , ts))
β
y # (cls' x i ts e)
#clsβ _ (π’ _) refl _ = ββ
#clsβ {x = x} i (π z) refl (_ ββͺ y#z) with x β z
... | equ = ββ
... | no _ = y#z
#clsβ i (π¨ op ts) refl y# = #cls'β i ts refl y#
#cls'β _ [] refl _ = ββ
#cls'β i (t :: ts) refl (y#x ββͺ y#t ββͺ y#ts) =
(#clsβ (suc^ i) t 1++ (y#x ββͺ y#t))
ββͺ
(#cls'β i ts refl (y#x ββͺ y#ts))
#abs' :
{n : β}
{x y : πΈ}
(t : Trm[ n ])
(_ : y # t)
β
y # (x οΌ t)
#abs' {x = x} {y} t y#t with x β y
... | equ = #abs x t
... | no Β¬p = #clsβ zero t refl
((βο½ο½(β πΈsymm (β’ββ πΈ Β¬p))) ββͺ y#t)
y#xοΌπx :
(x y : πΈ)
β
y # (x οΌ π{0} x)
y#xοΌπx x y with x β y
... | equ = #abs x (π x)
... | no Β¬p = #abs'{x = x} (π x)
(βο½ο½(β πΈsymm (β’ββ πΈ Β¬p)))
sbCls :
{m n : β}
(Ο : Sb)
(x x' : πΈ)
(i : Fin n)
(t : Trm[ m ])
(_ : β y β y β supp t β Β¬(x β‘ y) β x' # Ο y)
(e : n β‘ 1+ m)
β
Ο * (cls x i t e) β‘ cls x' i ((Ο β/ x := π x') * t) e
sbCls' :
{m n : β}
{ns : List β}
(Ο : Sb)
(x x' : πΈ)
(i : Fin n)
(ts : Arg[ m ] ns)
(_ : β y β y β supp ts β Β¬(x β‘ y) β x' # Ο y)
(e : n β‘ 1+ m)
β
Ο * (cls' x i ts e) β‘ cls' x' i ((Ο β/ x := π x') * ts) e
sbCls _ _ _ _ (π’ _) _ refl = refl
sbCls _ x _ _ (π y) f refl with x β y
sbCls Ο _ x' i (π y) f refl | no Β¬p =
symm (cls# x' i refl 0β€ (Ο y) (f y βο½ο½ Β¬p))
sbCls _ _ x' _ (π _) f refl | yes _ with x' β x'
sbCls _ _ _ _ (π _) _ refl | yes _ | no Β¬p = Γelim (Β¬p refl)
sbCls _ _ _ _ (π _) _ refl | yes _ | yes _ = refl
sbCls Ο x x' i (π¨ op ts) f refl
rewrite sbCls' Ο x x' i ts f refl = refl
sbCls' _ _ _ _ [] _ _ = refl
sbCls' Ο x x' i (t :: ts) f refl = congβ _::_
(sbCls Ο x x' (suc^ i) t (Ξ» y p β f y (ββͺβ p)) 1++)
(sbCls' Ο x x' i ts (Ξ» y p β f y (ββͺβ p)) refl)
sbAbs :
{m : β}
(Ο : Sb)
(x x' : πΈ)
(t : Trm[ m ])
(_ : β y β y β supp t β Β¬(x β‘ y) β x' # Ο y)
β
Ο * (x οΌ t) β‘ (x' οΌ (Ο β/ x := π x') * t)
sbAbs Ο x x' t f = sbCls Ο x x' zero t f refl
rnAbs :
{m : β}
(Ο : Rn)
(x x' : πΈ)
(t : Trm[ m ])
(_ : β y β y β supp t β Β¬(x β‘ y) β Β¬(x' β‘ Ο y))
β
Ο * (x οΌ t) β‘ (x' οΌ (Ο β/ x := x') * t)
rnAbs Ο x x' t f
rewrite sbAbs (πβ Ο) x x' t Ξ» y p q β βο½ο½ (β’ββ πΈ (f y p q))
= cong (x' οΌ_) (updateRn Ο x x' t)
alphaEquiv :
{n : β}
(x x' : πΈ)
(t : Trm[ n ])
(_ : x' # t)
β
(x οΌ t) β‘ (x' οΌ (x := x') * t)
alphaEquiv x x' t p =
begin
(x οΌ t)
β‘Λβ¨ absConc x' (x οΌ t) (#abs' t p) β©
(x' οΌ (x οΌ t)[ x' ])
β‘β¨ cong (Ξ» b β x' οΌ b) (concAbs x t (π x')) β©
(x' οΌ (x := π x') * t)
β‘β¨ cong (Ξ» b β x' οΌ b) (updateRn idΚ³ x x' t) β©
(x' οΌ (x := x') * t)
β