open import Graded.Modality
open import Tools.PropositionalEquality as PE hiding (subst)
module Graded.Erasure.Extraction.Properties
{a} {M : Set a}
(π : Modality M)
where
open Modality π
open import Graded.Modality.Nr-instances
open import Graded.Modality.Properties π
open import Graded.Erasure.Extraction π
open import Graded.Erasure.Target as T
hiding (refl; trans)
open import Graded.Erasure.Target.Non-terminating
open import Graded.Erasure.Target.Properties
open import Definition.Untyped M as U
hiding (Term; wk; _[_]; _[_,_]ββ; liftSubst)
open import Definition.Untyped.Erased π using (substα΅; Jα΅)
open import Definition.Untyped.Identity π using (subst)
open import Definition.Untyped.Omega M as O using (Ξ©)
import Definition.Untyped.Properties M as UP
open import Graded.Context π
open import Graded.Context.Properties π
import Graded.Usage π as MU
import Graded.Usage.Properties π as MUP
import Graded.Usage.Properties.Has-well-behaved-zero π as MUPπ
open import Graded.Usage.Restrictions π
open import Graded.Mode π
open import Tools.Bool
open import Tools.Empty
open import Tools.Fin
open import Tools.Function
open import Tools.List
open import Tools.Nat as Nat using (Nat; 1+) renaming (_+_ to _+βΏ_)
open import Tools.Product
open import Tools.Relation
open import Tools.Sum using (injβ; injβ)
import Tools.Reasoning.Equivalence
import Tools.Reasoning.PartialOrder
import Tools.Reasoning.PropositionalEquality
private
variable
b : Bool
Ξ± m n : Nat
π π : Set _
A Aβ Aβ t tβ tβ tβ tβ u : U.Term n
v vβ vβ : T.Term n
ts : DCon (U.Term _) _
β : List (T.Term n)
Ο : U.Subst m n
Οβ² : T.Subst m n
Ο : Wk _ _
Ξ³ : Conβ n
x : Fin n
p q r : M
k : Strength
s : Strictness
opaque
prod-π :
β k β p PE.β‘ π β
eraseβ² b s (U.prod k p t u) PE.β‘ eraseβ² b s u
prod-π {p} _ pβ‘π with is-π? p
β¦ | yes _ = PE.refl
β¦ | no pβ’π = β₯-elim (pβ’π pβ‘π)
opaque
prod-Ο :
β k β p PE.β’ π β
eraseβ² b s (U.prod k p t u) PE.β‘
prod⨠s ⩠(eraseⲠb s t) (eraseⲠb s u)
prod-Ο {p} _ pβ’π with is-π? p
β¦ | yes pβ‘π = β₯-elim (pβ’π pβ‘π)
β¦ | no _ = PE.refl
opaque
fst-β’π :
p PE.β’ π β
eraseβ² b s (U.fst p t) PE.β‘ T.fst (eraseβ² b s t)
fst-β’π {p} pβ’π with is-π? p
β¦ | yes pβ‘π = β₯-elim (pβ’π pβ‘π)
β¦ | no _ = PE.refl
opaque
snd-π :
p PE.β‘ π β
eraseβ² b s (U.snd p t) PE.β‘ eraseβ² b s t
snd-π {p} pβ‘π with is-π? p
... | yes _ = PE.refl
... | no pβ’π = β₯-elim (pβ’π pβ‘π)
opaque
snd-Ο :
p PE.β’ π β
eraseβ² b s (U.snd p t) PE.β‘ T.snd (eraseβ² b s t)
snd-Ο {p} pβ’π with is-π? p
β¦ | yes pβ‘π = β₯-elim (pβ’π pβ‘π)
β¦ | no _ = PE.refl
opaque
prodrec-Ο :
β q A β r PE.β’ π β
eraseβ² b s (U.prodrec r p q A t u) PE.β‘
erase-prodrecΟ s p (eraseβ² b s t) (eraseβ² b s u)
prodrec-Ο {r} _ _ rβ’π with is-π? r
... | yes rβ‘π = β₯-elim (rβ’π rβ‘π)
... | no _ = PE.refl
opaque
prodrec-π :
β q A β
eraseβ² b s (U.prodrec π p q A t u) β‘
eraseβ² b s u T.[ loop s , loop s ]ββ
prodrec-π _ _ with is-π? π
β¦ | yes _ = refl
β¦ | no πβ’π = β₯-elim (πβ’π refl)
opaque
prodrec-β’π-π :
β q A β r β’ π β
eraseβ² b s (U.prodrec r π q A t u) β‘
T.lam (eraseβ² b s u T.[ T.sgSubst (loop s) T.β ]) T.ββ¨ s β©
eraseβ² b s t
prodrec-β’π-π {b} {s} {t} {u} q A rβ’π
rewrite prodrec-Ο {b = b} {s = s} {p = π} {t = t} {u = u} q A rβ’π
with is-π? π
β¦ | yes _ = refl
β¦ | no πβ’π = β₯-elim (πβ’π refl)
opaque
prodrec-β’π-β’π :
β q A β r β’ π β p β’ π β
eraseβ² b s (U.prodrec r p q A t u) β‘
T.prodrec (eraseβ² b s t) (eraseβ² b s u)
prodrec-β’π-β’π {p} {b} {s} {t} {u} q A rβ’π pβ’π
rewrite prodrec-Ο {b = b} {s = s} {p = p} {t = t} {u = u} q A rβ’π
with is-π? p
β¦ | no _ = refl
β¦ | yes pβ‘π = β₯-elim (pβ’π pβ‘π)
opaque
unitrec-π :
β l q A β p PE.β‘ π β
eraseβ² b s (U.unitrec l p q A t u) PE.β‘ eraseβ² b s u
unitrec-π {p} _ _ _ pβ‘π with is-π? p
β¦ | yes _ = PE.refl
β¦ | no pβ’π = β₯-elim (pβ’π pβ‘π)
opaque
unitrec-Ο :
β l q A β p PE.β’ π β
eraseβ² b s (U.unitrec l p q A t u) PE.β‘
T.unitrec (eraseβ² b s t) (eraseβ² b s u)
unitrec-Ο {p} _ _ _ pβ’π with is-π? p
β¦ | yes pβ‘π = β₯-elim (pβ’π pβ‘π)
β¦ | no _ = PE.refl
opaque
β-β’π :
p β’ π β
eraseβ² b s (t U.ββ¨ p β© u) β‘ eraseβ² b s t T.ββ¨ s β© eraseβ² b s u
β-β’π {p} pβ’π with is-π? p
β¦ | no _ = refl
β¦ | yes pβ‘π = β₯-elim $ pβ’π pβ‘π
opaque
β-π : eraseβ² b s (t U.ββ¨ π β© u) β‘ app-πβ² b s (eraseβ² b s t)
β-π with is-π? π
β¦ | yes _ = refl
β¦ | no πβ’π = β₯-elim $ πβ’π refl
opaque
lam-β’π :
β b β p β’ π β
eraseβ² b s (U.lam p t) β‘ T.lam (eraseβ² b s t)
lam-β’π false _ = refl
lam-β’π {p} true pβ’π with is-π? p
β¦ | no _ = refl
β¦ | yes pβ‘π = β₯-elim $ pβ’π pβ‘π
opaque
lam-π-keep :
(t : U.Term (1+ n)) β
eraseβ² false s (U.lam π t) β‘ T.lam (eraseβ² false s t)
lam-π-keep _ with is-π? π
β¦ | yes _ = refl
β¦ | no πβ’π = β₯-elim $ πβ’π refl
opaque
lam-π-remove :
eraseβ² true s (U.lam π t) β‘ eraseβ² true s t T.[ loop s ]β
lam-π-remove with is-π? π
β¦ | yes _ = refl
β¦ | no πβ’π = β₯-elim $ πβ’π refl
opaque
unfolding subst
erase-subst :
eraseβ² b s (subst p Aβ Aβ tβ tβ tβ tβ) PE.β‘ eraseβ² b s tβ
erase-subst = PE.refl
opaque
unfolding substα΅ subst
erase-substα΅ :
eraseβ² b s (substα΅ k Aβ Aβ tβ tβ tβ tβ) PE.β‘ eraseβ² b s tβ
erase-substα΅ = PE.refl
opaque
unfolding Jα΅ substα΅ subst
erase-Jα΅ : eraseβ² b s (Jα΅ k Aβ tβ Aβ tβ tβ tβ) PE.β‘ eraseβ² b s tβ
erase-Jα΅ = PE.refl
opaque
wk-loop? : β s β wk Ο (loop? s) β‘ loop? s
wk-loop? non-strict = wk-loop
wk-loop? strict = refl
opaque
loop?-[] : β s β loop? s T.[ Οβ² ] β‘ loop? s
loop?-[] non-strict = loop-[]
loop?-[] strict = refl
opaque
loop?-closed : β s β Β¬ HasX x (loop? s)
loop?-closed non-strict = loop-closed
loop?-closed strict = Ξ» ()
opaque
Valueβ¨β©-loop? : β s β Valueβ¨ s β© (loop? {n = n} s)
Valueβ¨β©-loop? non-strict = _
Valueβ¨β©-loop? strict = T.β―
opaque
app-πβ²-subst : β T.β’ vβ β vβ β β T.β’ app-πβ² b s vβ β app-πβ² b s vβ
app-πβ²-subst {b = true} vββvβ = vββvβ
app-πβ²-subst {b = false} vββvβ = app-subst vββvβ
wk-erase-comm : (Ο : U.Wk m n) (t : U.Term n)
β wk Ο (eraseβ² b s t) β‘ eraseβ² b s (U.wk Ο t)
wk-erase-comm _ (var _) = refl
wk-erase-comm _ (defn _) = refl
wk-erase-comm {s} _ (U _) = wk-loop? s
wk-erase-comm {s} _ (Ξ Ξ£β¨ _ β© _ , _ β· _ βΉ _) = wk-loop? s
wk-erase-comm {b = true} {s} Ο (U.lam p t) with is-π? p
... | no _ = cong T.lam $ wk-erase-comm _ t
... | yes _ =
wk Ο (eraseβ² true s t T.[ loop s ]β) β‘β¨ wk-Ξ² (eraseβ² _ _ t) β©
wk (lift Ο) (eraseβ² true s t) T.[ wk Ο (loop s) ]β β‘β¨ cong (wk _ (eraseβ² _ _ t) T.[_]β) wk-loop β©
wk (lift Ο) (eraseβ² true s t) T.[ loop s ]β β‘β¨ cong T._[ _ ]β $ wk-erase-comm _ t β©
eraseβ² true s (U.wk (lift Ο) t) T.[ loop s ]β β
where
open Tools.Reasoning.PropositionalEquality
wk-erase-comm {b = false} Ο (U.lam p t) =
cong T.lam (wk-erase-comm (lift Ο) t)
wk-erase-comm Ο (t U.ββ¨ p β© u) with is-π? p
wk-erase-comm {b = false} {s} _ (t U.ββ¨ _ β© _) | yes _ =
congβ T._ββ¨ _ β©_ (wk-erase-comm _ t) (wk-loop? s)
wk-erase-comm {b = true} _ (t U.ββ¨ _ β© _) | yes _ =
wk-erase-comm _ t
wk-erase-comm _ (t U.ββ¨ _ β© u) | no _ =
congβ T._ββ¨ _ β©_ (wk-erase-comm _ t) (wk-erase-comm _ u)
wk-erase-comm {b} {s} Ο (U.prod _ p t u) with is-π? p
... | yes _ = wk-erase-comm Ο u
... | no _ =
wk Ο (prodβ¨ s β© (eraseβ² b s t) (eraseβ² b s u)) β‘β¨ wk-prodβ¨β© β©
prodβ¨ s β© (wk Ο (eraseβ² b s t)) (wk Ο (eraseβ² b s u)) β‘β¨ congβ prodβ¨ _ β© (wk-erase-comm _ t) (wk-erase-comm _ u) β©
prodβ¨ s β© (eraseβ² b s (U.wk Ο t)) (eraseβ² b s (U.wk Ο u)) β
where
open Tools.Reasoning.PropositionalEquality
wk-erase-comm Ο (U.fst p t) with is-π? p
... | yes _ = wk-loop
... | no _ = cong T.fst (wk-erase-comm Ο t)
wk-erase-comm Ο (U.snd p t) with is-π? p
... | yes _ = wk-erase-comm Ο t
... | no _ = cong T.snd (wk-erase-comm Ο t)
wk-erase-comm {b} {s} Ο (U.prodrec r p _ A t u) with is-π? r
... | yes _ =
wk Ο (eraseβ² b s u [ loop s , loop s ]ββ) β‘β¨ wk-Ξ²-doubleSubst _ (eraseβ² _ _ u) _ _ β©
wk (lift (lift Ο)) (eraseβ² b s u) [ wk Ο (loop s) , wk Ο (loop s) ]ββ β‘β¨ congβ _[_,_]ββ (wk-erase-comm _ u) wk-loop wk-loop β©
eraseβ² b s (U.wk (lift (lift Ο)) u) [ loop s , loop s ]ββ β
where
open Tools.Reasoning.PropositionalEquality
... | no _ with is-π? p
... | yes _ =
T.lam (wk (lift Ο) (eraseβ² b s u T.[ liftSubst (T.sgSubst (loop s)) ]))
T.ββ¨ s β© wk Ο (eraseβ² b s t) β‘β¨ cong (Ξ» u β T.lam u T.ββ¨ _ β© _) $
wk-lift-Ξ² (eraseβ² _ _ u) β©
T.lam (wk (lift (lift Ο)) (eraseβ² b s u)
T.[ liftSubst (T.sgSubst (wk Ο (loop s))) ])
T.ββ¨ s β© wk Ο (eraseβ² b s t) β‘β¨ congβ (Ξ» u v t β T.lam (u T.[ T.liftSubst (T.sgSubst v) ]) T.ββ¨ _ β© t)
(wk-erase-comm _ u)
wk-loop
(wk-erase-comm _ t) β©
T.lam (eraseβ² b s (U.wk (lift (lift Ο)) u)
T.[ liftSubst (T.sgSubst (loop s)) ])
T.ββ¨ s β© eraseβ² b s (U.wk Ο t) β
where
open Tools.Reasoning.PropositionalEquality
... | no _ = congβ T.prodrec (wk-erase-comm Ο t)
(wk-erase-comm (lift (lift Ο)) u)
wk-erase-comm {s} _ β = wk-loop? s
wk-erase-comm Ο U.zero = refl
wk-erase-comm {b} {s} Ο (U.suc t) =
wk Ο (sucβ¨ s β© (eraseβ² b s t)) β‘β¨ wk-sucβ¨β© β©
sucβ¨ s β© (wk Ο (eraseβ² b s t)) β‘β¨ cong sucβ¨ _ β© (wk-erase-comm _ t) β©
sucβ¨ s β© (eraseβ² b s (U.wk Ο t)) β
where
open Tools.Reasoning.PropositionalEquality
wk-erase-comm Ο (U.natrec p q r A z s n) =
congβ T.natrec (wk-erase-comm Ο z)
(wk-erase-comm (lift (lift Ο)) s)
(wk-erase-comm Ο n)
wk-erase-comm {s} _ Unit! = wk-loop? s
wk-erase-comm Ο U.star! = refl
wk-erase-comm Ο (U.unitrec _ p _ _ t u)
with is-π? p
... | yes _ =
wk-erase-comm _ u
... | no _ =
congβ T.unitrec (wk-erase-comm Ο t)
(wk-erase-comm Ο u)
wk-erase-comm {s} _ Empty = wk-loop? s
wk-erase-comm _ (emptyrec _ _ _) = wk-loop
wk-erase-comm {s} _ (Id _ _ _) = wk-loop? s
wk-erase-comm {s} _ U.rfl = wk-loop? s
wk-erase-comm _ (J _ _ _ _ _ u _ _) = wk-erase-comm _ u
wk-erase-comm _ (K _ _ _ _ u _) = wk-erase-comm _ u
wk-erase-comm {s} _ ([]-cong _ _ _ _ _) = wk-loop? s
liftSubst-erase-comm :
(x : Fin (1+ n)) β
liftSubst (eraseSubstβ² b s Ο) x β‘ eraseSubstβ² b s (U.liftSubst Ο) x
liftSubst-erase-comm x0 = refl
liftSubst-erase-comm {Ο} (_ +1) = wk-erase-comm _ (Ο _)
liftSubsts-erase-comm :
(k : Nat) (x : Fin (k +βΏ n)) β
T.liftSubstn (eraseSubstβ² b s Ο) k x β‘
eraseSubstβ² b s (U.liftSubstn Ο k) x
liftSubsts-erase-comm 0 x = refl
liftSubsts-erase-comm (1+ k) x0 = refl
liftSubsts-erase-comm {b} {s} {Ο} (1+ k) (x +1) =
T.wk1 (T.liftSubstn (eraseSubstβ² b s Ο) k x) β‘β¨ cong T.wk1 $ liftSubsts-erase-comm k _ β©
T.wk1 (eraseSubstβ² b s (U.liftSubstn Ο k) x) β‘β¨β©
wk (step id) (eraseSubstβ² b s (U.liftSubstn Ο k) x) β‘β¨ wk-erase-comm _ (U.liftSubstn Ο _ _) β©
eraseβ² b s (U.wk (U.step U.id) (U.liftSubstn Ο k x)) β‘β¨β©
eraseSubstβ² b s (U.liftSubstn Ο (1+ k)) (x +1) β
where
open Tools.Reasoning.PropositionalEquality
opaque
app-π-[] :
(t : T.Term n) β
app-πβ² b s t T.[ Οβ² ] β‘
app-πβ² b s (t T.[ Οβ² ])
app-π-[] {b = true} _ = refl
app-π-[] {b = false} {s} _ = cong (T._ββ¨_β©_ _ _) $ loop?-[] s
subst-erase-comm :
(Ο : U.Subst m n) (t : U.Term n) β
eraseβ² b s t T.[ eraseSubstβ² b s Ο ] β‘ eraseβ² b s (t U.[ Ο ])
subst-erase-comm Ο (var x) = refl
subst-erase-comm _ (defn _) = refl
subst-erase-comm {s} _ (U _) = loop?-[] s
subst-erase-comm {s} _ (Ξ Ξ£β¨ _ β© _ , _ β· _ βΉ _) = loop?-[] s
subst-erase-comm {b = true} {s} Ο (U.lam p t) with is-π? p
... | no _ =
cong T.lam
(eraseβ² true s t T.[ liftSubst (eraseSubstβ² true s Ο) ] β‘β¨ substVar-to-subst liftSubst-erase-comm (eraseβ² _ _ t) β©
eraseβ² true s t T.[ eraseSubstβ² true s (U.liftSubst Ο) ] β‘β¨ subst-erase-comm _ t β©
eraseβ² true s (t U.[ U.liftSubst Ο ]) β)
where
open Tools.Reasoning.PropositionalEquality
... | yes _ =
eraseβ² true s t T.[ loop s ]β T.[ (eraseSubstβ² true s Ο) ] β‘β¨ singleSubstLift (eraseβ² _ _ t) _ β©
eraseβ² true s t T.[ liftSubst (eraseSubstβ² true s Ο) ]
T.[ loop s [ eraseSubstβ² true s Ο ] ]β β‘β¨ cong (eraseβ² _ _ t T.[ liftSubst _ ] T.[_]β) loop-[] β©
eraseβ² true s t T.[ liftSubst (eraseSubstβ² true s Ο) ] T.[ loop s ]β β‘β¨ cong T._[ _ ]β $ substVar-to-subst liftSubst-erase-comm (eraseβ² _ _ t) β©
eraseβ² true s t T.[ eraseSubstβ² true s (U.liftSubst Ο) ]
T.[ loop s ]β β‘β¨ cong T._[ _ ]β $ subst-erase-comm _ t β©
eraseβ² true s (t U.[ U.liftSubst Ο ]) T.[ loop s ]β β
where
open Tools.Reasoning.PropositionalEquality
subst-erase-comm {b = false} {s} Ο (U.lam _ t) =
cong Term.lam
(eraseβ² false s t T.[ liftSubst (eraseSubstβ² false s Ο) ] β‘β¨ substVar-to-subst (liftSubsts-erase-comm 1) (eraseβ² _ _ t) β©
eraseβ² false s t T.[ eraseSubstβ² false s (U.liftSubst Ο) ] β‘β¨ subst-erase-comm _ t β©
eraseβ² false s (t U.[ U.liftSubst Ο ]) β)
where
open Tools.Reasoning.PropositionalEquality
subst-erase-comm Ο (t U.ββ¨ p β© u) with is-π? p
subst-erase-comm {b} {s} Ο (t U.ββ¨ _ β© _) | yes _ =
app-πβ² b s (eraseβ² b s t) T.[ eraseSubstβ² b s Ο ] β‘β¨ app-π-[] (eraseβ² _ _ t) β©
app-πβ² b s (eraseβ² b s t T.[ eraseSubstβ² b s Ο ]) β‘β¨ cong (app-πβ² _ _) $ subst-erase-comm _ t β©
app-πβ² b s (eraseβ² b s (t U.[ Ο ])) β
where
open Tools.Reasoning.PropositionalEquality
subst-erase-comm Ο (t U.ββ¨ _ β© u) | no _ =
congβ T._ββ¨ _ β©_ (subst-erase-comm Ο t) (subst-erase-comm Ο u)
subst-erase-comm {b} {s} Ο (U.prod _ p t u) with is-π? p
... | yes _ = subst-erase-comm Ο u
... | no _ =
prodβ¨ s β© (eraseβ² b s t) (eraseβ² b s u) [ eraseSubstβ² b s Ο ] β‘β¨ prodβ¨β©-[] β©
prodβ¨ s β© (eraseβ² b s t [ eraseSubstβ² b s Ο ])
(eraseβ² b s u [ eraseSubstβ² b s Ο ]) β‘β¨ congβ prodβ¨ _ β© (subst-erase-comm _ t) (subst-erase-comm _ u) β©
prodβ¨ s β© (eraseβ² b s (t U.[ Ο ])) (eraseβ² b s (u U.[ Ο ])) β
where
open Tools.Reasoning.PropositionalEquality
subst-erase-comm Ο (U.fst p t) with is-π? p
... | yes _ = loop-[]
... | no _ = cong T.fst (subst-erase-comm Ο t)
subst-erase-comm Ο (U.snd p t) with is-π? p
... | yes _ = subst-erase-comm Ο t
... | no _ = cong T.snd (subst-erase-comm Ο t)
subst-erase-comm {b} {s} Ο (U.prodrec r p _ A t u) with is-π? r
... | yes _ =
eraseβ² b s u [ loop s , loop s ]ββ T.[ eraseSubstβ² b s Ο ] β‘β¨ doubleSubstLift _ (eraseβ² _ _ u) _ _ β©
eraseβ² b s u T.[ T.liftSubstn (eraseSubstβ² b s Ο) 2 ]
[ loop s T.[ eraseSubstβ² b s Ο ]
, loop s T.[ eraseSubstβ² b s Ο ]
]ββ β‘β¨ congβ _[_,_]ββ
(substVar-to-subst (liftSubsts-erase-comm 2) (eraseβ² _ _ u))
loop-[]
loop-[] β©
eraseβ² b s u T.[ eraseSubstβ² b s (U.liftSubstn Ο 2) ]
[ loop s , loop s ]ββ β‘β¨ cong _[ _ , _ ]ββ $
subst-erase-comm _ u β©
eraseβ² b s (u U.[ U.liftSubstn Ο 2 ]) [ loop s , loop s ]ββ β
where
open Tools.Reasoning.PropositionalEquality
... | no _ with is-π? p
... | yes _ =
T.lam (eraseβ² b s u T.[ liftSubst (T.sgSubst (loop s)) ]
T.[ liftSubst (eraseSubstβ² b s Ο) ])
T.ββ¨ s β© (eraseβ² b s t T.[ eraseSubstβ² b s Ο ]) β‘β¨ cong (Ξ» u β T.lam u T.ββ¨ _ β© _) $
subst-liftSubst-sgSubst (eraseβ² _ _ u) β©
T.lam (eraseβ² b s u T.[ T.liftSubstn (eraseSubstβ² b s Ο) 2 ]
T.[ liftSubst (T.sgSubst (loop s T.[ eraseSubstβ² b s Ο ])) ])
T.ββ¨ s β© (eraseβ² b s t T.[ eraseSubstβ² b s Ο ]) β‘β¨ cong (Ξ» u β T.lam (u T.[ _ ]) T.ββ¨ _ β© _) $
substVar-to-subst (liftSubsts-erase-comm 2) (eraseβ² _ _ u) β©
T.lam (eraseβ² b s u T.[ eraseSubstβ² b s (U.liftSubstn Ο 2) ]
T.[ liftSubst (T.sgSubst (loop s T.[ eraseSubstβ² b s Ο ])) ])
T.ββ¨ s β© (eraseβ² b s t T.[ eraseSubstβ² b s Ο ]) β‘β¨ congβ (Ξ» u v t β T.lam (u T.[ liftSubst (T.sgSubst v) ]) T.ββ¨ _ β© t)
(subst-erase-comm _ u)
loop-[]
(subst-erase-comm _ t) β©
T.lam (eraseβ² b s (u U.[ U.liftSubstn Ο 2 ])
T.[ liftSubst (T.sgSubst (loop s)) ])
T.ββ¨ s β© eraseβ² b s (t U.[ Ο ]) β
where
open Tools.Reasoning.PropositionalEquality
... | no _ =
congβ Term.prodrec (subst-erase-comm Ο t)
(trans (substVar-to-subst (liftSubsts-erase-comm 2) (eraseβ² _ _ u))
(subst-erase-comm (U.liftSubstn Ο 2) u))
subst-erase-comm {s} _ β = loop?-[] s
subst-erase-comm Ο U.zero = refl
subst-erase-comm {b} {s} Ο (U.suc t) =
sucβ¨ s β© (eraseβ² b s t) T.[ eraseSubstβ² b s Ο ] β‘β¨ sucβ¨β©-[] β©
sucβ¨ s β© (eraseβ² b s t T.[ eraseSubstβ² b s Ο ]) β‘β¨ cong sucβ¨ _ β© (subst-erase-comm _ t) β©
sucβ¨ s β© (eraseβ² b s (t U.[ Ο ])) β
where
open Tools.Reasoning.PropositionalEquality
subst-erase-comm Ο (U.natrec p q r A z s n) = congβ T.natrec
(subst-erase-comm Ο z)
(trans (substVar-to-subst (liftSubsts-erase-comm 2) (eraseβ² _ _ s))
(subst-erase-comm (U.liftSubst (U.liftSubst Ο)) s))
(subst-erase-comm Ο n)
subst-erase-comm {s} _ Unit! = loop?-[] s
subst-erase-comm Ο U.star! = refl
subst-erase-comm Ο (U.unitrec _ p _ _ t u) with is-π? p
... | yes _ =
subst-erase-comm Ο u
... | no _ =
congβ T.unitrec (subst-erase-comm Ο t)
(subst-erase-comm Ο u)
subst-erase-comm {s} _ Empty = loop?-[] s
subst-erase-comm _ (emptyrec _ _ _) = loop-[]
subst-erase-comm {s} _ (Id _ _ _) = loop?-[] s
subst-erase-comm {s} _ U.rfl = loop?-[] s
subst-erase-comm _ (J _ _ _ _ _ u _ _) = subst-erase-comm _ u
subst-erase-comm _ (K _ _ _ _ u _) = subst-erase-comm _ u
subst-erase-comm {s} _ ([]-cong _ _ _ _ _) = loop?-[] s
subst-undefined : (x : Fin (1+ n)) β
eraseSubstβ² b s (U.sgSubst Empty) x β‘
T.sgSubst (loop? s) x
subst-undefined x0 = refl
subst-undefined (x +1) = refl
erase-consSubst-var : (Ο : U.Subst m n) (a : U.Term m) (x : Fin (1+ n))
β T.consSubst (eraseSubstβ² b s Ο) (eraseβ² b s a) x
β‘ eraseSubstβ² b s (U.consSubst Ο a) x
erase-consSubst-var Ο a x0 = refl
erase-consSubst-var Ο a (x +1) = refl
erase-consSubst : (Ο : U.Subst m n) (a : U.Term m) (t : T.Term (1+ n))
β t T.[ T.consSubst (eraseSubstβ² b s Ο) (eraseβ² b s a) ]
β‘ t T.[ eraseSubstβ² b s (U.consSubst Ο a) ]
erase-consSubst Ο a t = substVar-to-subst (erase-consSubst-var Ο a) t
opaque
unfolding eraseDConβ³
eraseDConβ³-glassify :
{erase : π β π} {β : DCon π n} β
eraseDConβ³ erase (glassify β) β‘ eraseDConβ³ erase β
eraseDConβ³-glassify {β = Ξ΅} = refl
eraseDConβ³-glassify {β = β β!} =
cong (_++ _) (eraseDConβ³-glassify {β = β})
opaque
unfolding eraseDConβ²
eraseDCon-glassify :
{β : DCon (U.Term 0) n} β
eraseDConβ² b s (glassify β) β‘ eraseDConβ² b s β
eraseDCon-glassify {β} = eraseDConβ³-glassify {β = β}
opaque
unfolding eraseDConβ²
length-eraseDCon :
(ts : DCon (U.Term 0) n) β length (eraseDConβ² b s ts) β‘ n
length-eraseDCon Ξ΅ = refl
length-eraseDCon {b} {s} (_ββ¨_β©[_β·_] {n} ts _ t _) =
length (eraseDConβ² b s ts ++ eraseβ² b s t β· []) β‘β¨ length-++ (eraseDConβ² _ _ ts) β©
length (eraseDConβ² b s ts) +βΏ 1 β‘Λβ¨ Nat.+-comm 1 _ β©
1+ (length (eraseDConβ² b s ts)) β‘β¨ cong 1+ (length-eraseDCon ts) β©
1+ n β
where
open Tools.Reasoning.PropositionalEquality
opaque
unfolding eraseDConβ²
β¦eraseβeraseDCon :
Ξ± U.β¦ t β· A β ts β Ξ± β¦ eraseβ² b s t β eraseDConβ² b s ts
β¦eraseβeraseDCon (there Ξ±β¦t) = β¦β++ (β¦eraseβeraseDCon Ξ±β¦t)
β¦eraseβeraseDCon (here {β}) =
PE.substβ _β¦_β_ (length-eraseDCon β) refl refl lengthβ¦β++β·
opaque
β¦eraseβeraseDConβ² :
Ξ± U.β¦ t β· A β glassify ts β Ξ± β¦ eraseβ² b s t β eraseDConβ² b s ts
β¦eraseβeraseDConβ² =
PE.subst (_β¦_β_ _ _) eraseDCon-glassify ββ
β¦eraseβeraseDCon
opaque
unfolding Ξ© O.Ο loop
erase-Ξ©-does-not-have-a-value :
Value v β Β¬ β β’ eraseβ² b s (Ξ© {n = n} p) β* v
erase-Ξ©-does-not-have-a-value {v} {β} {b} {s} {p} v-value
with is-π? p
β¦ | no pβ’π =
PE.subst (Ξ» t β Β¬ β β’ t ββ¨ s β© t β* v) (PE.sym $ lam-β’π b pβ’π) $
PE.subst (Ξ» t β Β¬ β β’ lam t ββ¨ s β© lam t β* v) (PE.sym $ β-β’π pβ’π) $
Β¬loopβ* v-value
erase-Ξ©-does-not-have-a-value {v} {β} {b = true} {s} {p} v-value
| yes refl =
PE.subst (Ξ» t β Β¬ β β’ t β* v) (PE.sym lam-π-remove) $
PE.subst (Ξ» t β Β¬ β β’ t T.[ loop s ]β β* v) (PE.sym β-π) $
Β¬loopβ* v-value
erase-Ξ©-does-not-have-a-value {v} {β} {b = false} {s} {p} v-value
| yes refl =
PE.subst (Ξ» t β Β¬ β β’ lam t ββ¨ s β© loop? s β* v) (PE.sym β-π)
(lemma _)
where
lemma : β s β Β¬ β β’ lam (var x0 ββ¨ s β© loop? s) ββ¨ s β© loop? s β* v
lemma strict T.refl =
case v-value of Ξ» ()
lemma strict (T.trans (app-subst ()) _)
lemma strict (T.trans (app-subst-arg _ ()) _)
lemma strict (T.trans (Ξ²-red _) T.refl) =
case v-value of Ξ» ()
lemma strict (T.trans (Ξ²-red _) (T.trans (app-subst ()) _))
lemma strict (T.trans (Ξ²-red _) (T.trans (app-subst-arg _ ()) _))
lemma non-strict T.refl =
case v-value of Ξ» ()
lemma non-strict (T.trans (app-subst ()) _)
lemma non-strict (T.trans (Ξ²-red _) loopβloopβv) =
let _ , vβ²-value , loopβvβ² = ββValueββValue v-value loopβloopβv in
Β¬loopβ* vβ²-value loopβvβ²
module hasX (R : Usage-restrictions) where
open MU R
open MUP R
open MUPπ R
open import Graded.Usage.Restrictions.Instance R
private
OK : U.Subst n n β Conβ n β Set a
OK Ο Ξ³ = β {x} β Ο x β’ var x β x β π β Ξ³
private opaque
Β¬βπβ,βπ :
β¦ π-well-behaved : Has-well-behaved-zero M semiring-with-meet β¦ β
Β¬ x β π β (Ξ³ , x β π)
Β¬βπβ,βπ {x} {Ξ³} =
x β π β (Ξ³ , x β π) ββ¨ βββ β©β
(Ξ³ , x β π) β¨ x β© β‘ π β‘β¨ cong (_β‘ _) $ update-lookup Ξ³ x β©β
π β‘ π ββ¨ non-trivial β©
β₯ β‘
erase-[]-var :
β¦ π-well-behaved : Has-well-behaved-zero M semiring-with-meet β¦
(y : Fin n) β
OK Ο (παΆ , y β π) β
eraseβ² b s (Ο y) β‘ var y
erase-[]-var {Ο} {b} {s} y ok
with Ο y | ok {x = y} | UP.is-var? (Ο y)
β¦ | _ | ok | UP.not-var β’var =
β₯-elim $ Β¬βπβ,βπ $ ok β’var
β¦ | _ | ok | UP.var x with x ββ±½ y
β¦ | yes xβ‘y = cong var xβ‘y
β¦ | no xβ’y =
β₯-elim $ Β¬βπβ,βπ $ ok (xβ’y ββ UP.var-PE-injectivity)
OK-β-β : OK Ο Ξ³ β OK (Ο U.β) (Ξ³ β p)
OK-β-β _ {x = x0} β’var = β₯-elim $ β’var refl
OK-β-β erased {x = _ +1} β’var =
there (erased (β’var ββ cong U.wk1))
opaque
erase-[] :
{Ο : U.Subst n n}
β¦ π-well-behaved : Has-well-behaved-zero M semiring-with-meet β¦ β
(β {x} β Ο x β’ var x β x β π β Ξ³) β
Ξ³ βΈ[ πα΅ ] t β
eraseβ² b s (t U.[ Ο ]) β‘ eraseβ² b s t
erase-[] ok (sub βΈt Ξ³β€Ξ΄) =
erase-[] (flip xβπβΞ³β€Ξ΄ Ξ³β€Ξ΄ ββ ok) βΈt
erase-[] ok var =
erase-[]-var _ ok
erase-[] _ defn =
refl
erase-[] _ Uβ =
refl
erase-[] _ Emptyβ =
refl
erase-[] _ (emptyrecβ _ _ _) =
refl
erase-[] _ Unitβ =
refl
erase-[] _ (starΛ’β _) =
refl
erase-[] _ starΚ·β =
refl
erase-[] ok (unitrecβ {p} βΈtβ βΈtβ _ _) with is-π? p
β¦ | no pβ’π =
congβ unitrec
(erase-[] (xβπβpΞ³ refl pβ’π ββ xβπβΞ³+Ξ΄Λ‘ refl ββ ok)
(βΈ-cong (β’πββββ‘πα΅ pβ’π) βΈtβ))
(erase-[] (xβπβΞ³+Ξ΄Κ³ refl ββ ok) βΈtβ)
β¦ | yes _ =
erase-[] (xβπβΞ³+Ξ΄Κ³ refl ββ ok) βΈtβ
erase-[] _ (Ξ Ξ£β _ _) =
refl
erase-[] {b = false} ok (lamβ βΈt) =
cong lam (erase-[] (OK-β-β ok) βΈt)
erase-[] {b = true} ok (lamβ {p} βΈt) with is-π? p
β¦ | no _ =
cong lam (erase-[] (OK-β-β ok) βΈt)
β¦ | yes _ =
cong T._[ _ ]β (erase-[] (OK-β-β ok) βΈt)
erase-[] ok (_ββ_ {p} βΈt βΈu) with is-π? p
β¦ | no pβ’π =
congβ _ββ¨ _ β©_ (erase-[] (xβπβΞ³+Ξ΄Λ‘ refl ββ ok) βΈt)
(erase-[] (xβπβpΞ³ refl pβ’π ββ xβπβΞ³+Ξ΄Κ³ refl ββ ok)
(βΈ-cong (β’πββββ‘πα΅ pβ’π) βΈu))
erase-[] {b = false} ok (βΈt ββ _) | yes _ =
cong (_ββ¨ _ β© _) (erase-[] (xβπβΞ³+Ξ΄Λ‘ refl ββ ok) βΈt)
erase-[] {b = true} ok (βΈt ββ _) | yes _ =
erase-[] (xβπβΞ³+Ξ΄Λ‘ refl ββ ok) βΈt
erase-[] ok (prodΛ’β {p} βΈtβ βΈtβ) with is-π? p
β¦ | yes _ =
erase-[] (xβπβΞ³β§Ξ΄Κ³ refl ββ ok) βΈtβ
β¦ | no pβ’π =
congβ prodβ¨ _ β©
(erase-[] (xβπβpΞ³ refl pβ’π ββ xβπβΞ³β§Ξ΄Λ‘ refl ββ ok)
(βΈ-cong (β’πββββ‘πα΅ pβ’π) βΈtβ))
(erase-[] (xβπβΞ³β§Ξ΄Κ³ refl ββ ok) βΈtβ)
erase-[] ok (fstβ {p} _ βΈt eq _) with is-π? p
β¦ | yes _ =
refl
β¦ | no _ =
cong fst (erase-[] ok (βΈ-cong eq βΈt))
erase-[] ok (sndβ {p} βΈt) with is-π? p
β¦ | yes _ =
erase-[] ok βΈt
β¦ | no _ =
cong snd (erase-[] ok βΈt)
erase-[] ok (prodΚ·β {p} βΈtβ βΈtβ) with is-π? p
β¦ | yes _ =
erase-[] (xβπβΞ³+Ξ΄Κ³ refl ββ ok) βΈtβ
β¦ | no pβ’π =
congβ prodβ¨ _ β©
(erase-[] (xβπβpΞ³ refl pβ’π ββ xβπβΞ³+Ξ΄Λ‘ refl ββ ok)
(βΈ-cong (β’πββββ‘πα΅ pβ’π) βΈtβ))
(erase-[] (xβπβΞ³+Ξ΄Κ³ refl ββ ok) βΈtβ)
erase-[] ok (prodrecβ {r} βΈtβ βΈtβ _ _) with is-π? r
β¦ | yes _ =
cong _[ _ , _ ]ββ
(erase-[] (OK-β-β $ OK-β-β $ xβπβΞ³+Ξ΄Κ³ refl ββ ok) βΈtβ)
β¦ | no rβ’π =
congβ (erase-prodrecΟ _ _)
(erase-[] (xβπβpΞ³ refl rβ’π ββ xβπβΞ³+Ξ΄Λ‘ refl ββ ok)
(βΈ-cong (β’πββββ‘πα΅ rβ’π) βΈtβ))
(erase-[] (OK-β-β $ OK-β-β $ xβπβΞ³+Ξ΄Κ³ refl ββ ok) βΈtβ)
erase-[] _ ββ =
refl
erase-[] _ zeroβ =
refl
erase-[] ok (sucβ βΈt) =
cong sucβ¨ _ β© (erase-[] ok βΈt)
erase-[] ok (natrecβ {Ξ³} {Ξ΄} {p} {r} {Ξ·} βΈtβ βΈtβ βΈtβ _) =
congβ natrec
(erase-[]
(Ξ» {x = x} Οxβ’var-x β
let xβπ = ok Οxβ’var-x in
$β¨ xβπ β©
x β π β nrαΆ p r Ξ³ Ξ΄ Ξ· ββ¨ βββ .projβ β©
nrαΆ p r Ξ³ Ξ΄ Ξ· β¨ x β© β‘ π ββ¨ trans (sym (nrαΆ-β¨β© Ξ³)) β©
nr p r (Ξ³ β¨ x β©) (Ξ΄ β¨ x β©) (Ξ· β¨ x β©) β‘ π ββ¨ trans (update-lookup Ξ³ _) β©
(Ξ³ , x β nr p r (Ξ³ β¨ x β©) (Ξ΄ β¨ x β©) (Ξ· β¨ x β©)) β¨ x β© β‘ π ββ¨ βββ .projβ β©
x β π β Ξ³ , x β nr p r (Ξ³ β¨ x β©) (Ξ΄ β¨ x β©) (Ξ· β¨ x β©) ββ¨ flip xβπβΞ³β€Ξ΄ $ begin
Ξ³ , x β nr p r (Ξ³ β¨ x β©) (Ξ΄ β¨ x β©) (Ξ· β¨ x β©) β€β¨ update-monotoneΚ³ _
($β¨ xβπ β©
x β π β nrαΆ p r Ξ³ Ξ΄ Ξ· ββ¨ βπβnrαΆβ refl β©
x β π β Ξ· ββ¨ βββ .projβ β©
Ξ· β¨ x β© β‘ π ββ¨ nr-zero ββ β€-reflexive β©
nr p r (Ξ³ β¨ x β©) (Ξ΄ β¨ x β©) (Ξ· β¨ x β©) β€ Ξ³ β¨ x β© β‘) β©
Ξ³ , x β Ξ³ β¨ x β© β‘β¨ update-self _ _ β©
Ξ³ β β©
x β π β Ξ³ β‘)
βΈtβ)
(erase-[] (OK-β-β $ OK-β-β $ βπβnrαΆβ refl ββ ok) βΈtβ)
(erase-[] (βπβnrαΆβ refl ββ ok) βΈtβ)
where
open β€αΆ-reasoning
erase-[] ok (natrec-no-nrβ βΈtβ βΈtβ βΈtβ _ Ξ³β€β _ Ξ³β€β Ξ³β€β) =
congβ natrec (erase-[] ok (sub βΈtβ Ξ³β€β))
(erase-[]
(OK-β-β $ OK-β-β $ xβπβΞ³+Ξ΄Λ‘ refl ββ flip xβπβΞ³β€Ξ΄ Ξ³β€β ββ ok)
βΈtβ)
(erase-[] (flip xβπβΞ³β€Ξ΄ Ξ³β€β ββ ok) βΈtβ)
erase-[]
ok (natrec-no-nr-glbβ {Ξ³} {Ξ΄} {r} {Ο} βΈtβ βΈtβ βΈtβ _ glb Ο-glb) =
congβ natrec
(erase-[] (xβπβΞ³+Ξ΄Κ³ refl ββ ok) $
sub βΈtβ $ begin
Ο β€β¨ Ο-glb .projβ 0 β©
nrα΅’αΆ r Ξ³ Ξ΄ 0 ββ¨ nrα΅’αΆ-zero β©
Ξ³ β)
(erase-[]
(OK-β-β $ OK-β-β $ xβπβΞ³+Ξ΄Λ‘ refl ββ
flip xβπβΞ³β€Ξ΄
(begin
Ο β€β¨ Ο-glb .projβ 1 β©
nrα΅’αΆ r Ξ³ Ξ΄ 1 ββ¨ nrα΅’αΆ-suc β©
Ξ΄ +αΆ r Β·αΆ nrα΅’αΆ r Ξ³ Ξ΄ 0 β) ββ
xβπβΞ³+Ξ΄Κ³ refl ββ ok)
βΈtβ)
(erase-[]
(xβπβpΞ³ refl (Ξ» { refl β πβ°π (glb .projβ 0) }) ββ
xβπβΞ³+Ξ΄Λ‘ refl ββ ok)
βΈtβ)
where
open β€αΆ-reasoning
erase-[] _ (Idβ _ _ _ _) =
refl
erase-[] _ (Idββ _ _ _ _) =
refl
erase-[] _ rflβ =
refl
erase-[] ok (Jβ _ _ _ _ _ βΈt _ _) =
erase-[]
(xβπβΞ³+Ξ΄Λ‘ refl ββ xβπβΞ³+Ξ΄Κ³ refl ββ xβπβΞ³+Ξ΄Κ³ refl ββ
xβπβpΞ³ refl Οβ’π ββ ok)
βΈt
erase-[] ok (Jβββ _ _ _ _ _ _ βΈt _ _) =
erase-[] (xβπβΞ³+Ξ΄Κ³ refl ββ xβπβpΞ³ refl Οβ’π ββ ok) βΈt
erase-[] ok (Jβββ _ _ _ _ βΈt _ _) =
erase-[] ok βΈt
erase-[] ok (Kβ _ _ _ _ _ βΈt _) =
erase-[]
(xβπβΞ³+Ξ΄Λ‘ refl ββ xβπβΞ³+Ξ΄Κ³ refl ββ xβπβΞ³+Ξ΄Κ³ refl ββ
xβπβpΞ³ refl Οβ’π ββ ok)
βΈt
erase-[] ok (Kβββ _ _ _ _ _ βΈt _) =
erase-[] (xβπβΞ³+Ξ΄Κ³ refl ββ xβπβpΞ³ refl Οβ’π ββ ok) βΈt
erase-[] ok (Kβββ _ _ _ _ βΈt _) =
erase-[] ok βΈt
erase-[] _ ([]-congβ _ _ _ _ _) =
refl
opaque
wkβ-erase-[] :
{Ο : U.Subst 0 n}
β¦ π-well-behaved : Has-well-behaved-zero M semiring-with-meet β¦ β
παΆ βΈ[ πα΅ ] t β
T.wk wkβ (eraseβ² b s (t U.[ Ο ])) β‘ eraseβ² b s t
wkβ-erase-[] {t} {b} {s} {Ο} βΈt =
T.wk wkβ (eraseβ² b s (t U.[ Ο ])) β‘β¨ wk-erase-comm _ (t U.[ _ ]) β©
eraseβ² b s (U.wk wkβ (t U.[ Ο ])) β‘β¨ cong (eraseβ² _ _) $ UP.wk-subst t β©
eraseβ² b s (t U.[ wkβ U.β’β Ο ]) β‘β¨ erase-[] (Ξ» {x = x} _ β βββ .projβ (παΆ-lookup x)) βΈt β©
eraseβ² b s t β
where
open Tools.Reasoning.PropositionalEquality
opaque
erase-ββ :
β¦ π-well-behaved : Has-well-behaved-zero M semiring-with-meet β¦ β
x β π β Ξ³ β Ξ³ βΈ[ πα΅ ] t β
eraseβ² b s (t U.[ β¨ x β u β©β ]) β‘ eraseβ² b s t
erase-ββ xβ βΈt = erase-[] (flip (lemma _ _) xβ) βΈt
where
lemma :
β (x y : Fin n) {u} β
β¨ x β u β©β y β’ var y β x β π β Ξ³ β y β π β Ξ³
lemma x0 x0 _ xβπ =
xβπ
lemma x0 (_ +1) β’var =
β₯-elim $ β’var refl
lemma (_+1 {n = 0} ())
lemma (_+1 {n = 1+ _} x) x0 β’var =
β₯-elim $ β’var refl
lemma (_+1 {n = 1+ _} x) (y +1) β’var (there xβπ) =
there (lemma x y (β’var ββ cong U.wk1) xβπ)
opaque
erase-[]β :
β¦ π-well-behaved : Has-well-behaved-zero M semiring-with-meet β¦ β
x0 β π β Ξ³ β Ξ³ βΈ[ πα΅ ] t β
eraseβ² b s (t U.[ u ]β) β‘ eraseβ² b s t
erase-[]β = erase-ββ
opaque
erase-β :
β¦ π-well-behaved : Has-well-behaved-zero M semiring-with-meet β¦ β
x β π β Ξ³ β Ξ³ βΈ[ πα΅ ] t β
wk (step-at x) (eraseβ² b s (t U.[ β¨ x β u β© ])) β‘ eraseβ² b s t
erase-β {x} {t} {b} {s} {u} xβ βΈt =
wk (step-at x) (eraseβ² b s (t U.[ β¨ x β u β© ])) β‘β¨ wk-erase-comm _ (t U.[ _ ]) β©
eraseβ² b s (U.wk (step-at x) (t U.[ β¨ x β u β© ])) β‘β¨ PE.cong (eraseβ² _ _) $ UP.wk-subst t β©
eraseβ² b s (t U.[ step-at x U.β’β β¨ x β u β© ]) β‘β¨β©
eraseβ² b s (t U.[ U.wk (step-at x) ββ β¨ x β u β© ]) β‘β¨ PE.cong (eraseβ² _ _) $ UP.substVar-to-subst UP.β¨ββ©β‘β¨ββ©β t β©
eraseβ² b s (t U.[ β¨ x β U.wk (step-atβ² x) u β©β ]) β‘β¨ erase-ββ xβ βΈt β©
eraseβ² b s t β
where
open Tools.Reasoning.PropositionalEquality
opaque
erase-[]β :
β¦ π-well-behaved : Has-well-behaved-zero M semiring-with-meet β¦ β
x0 β π β Ξ³ β Ξ³ βΈ[ πα΅ ] t β
T.wk1 (eraseβ² b s (t U.[ u ]β)) β‘ eraseβ² b s t
erase-[]β = erase-β
opaque
erased-hasX :
β¦ π-well-behaved : Has-well-behaved-zero M semiring-with-meet β¦ β
x β π β Ξ³ β Ξ³ βΈ[ πα΅ ] t β Β¬ HasX x (eraseβ² b s t)
erased-hasX {x} {t} {b} {s} xβ βΈt =
HasX x (eraseβ² b s t) ββ¨ PE.subst (HasX _) (sym $ erase-β xβ βΈt) β©
HasX x (wk (step-at x) (eraseβ² b s (t U.[ β¨ x β β β© ]))) ββ¨ Β¬-HasX-wk-step-at β©
β₯ β‘