open import Graded.Modality
open import Graded.Usage.Restrictions
open import Definition.Typed.Variant
open import Graded.Usage.Restrictions.Natrec
module Graded.Heap.Untyped.Properties
{a} {M : Set a} {š : Modality M}
(type-variant : Type-variant)
(UR : Usage-restrictions š)
(open Usage-restrictions UR)
(factoring-nr :
⦠has-nr : Nr-available ⦠ā
Is-factoring-nr M (Natrec-mode-Has-nr š has-nr))
where
open Type-variant type-variant
open Modality š
open import Tools.Empty
open import Tools.Fin
open import Tools.Function
open import Tools.Nat using (Nat; 1+; 2+; +-suc) renaming (_+_ to _+āæ_)
open import Tools.PropositionalEquality
open import Tools.Product
open import Tools.Relation
open import Tools.Reasoning.PropositionalEquality
open import Tools.Sum
open import Graded.Modality.Nr-instances
open import Graded.Modality.Properties š
open import Graded.Usage.Erased-matches
open import Graded.Usage.Restrictions.Instance UR
open import Definition.Untyped M
open import Definition.Untyped.Neutral M type-variant
open import Definition.Untyped.Properties M
open import Graded.Heap.Untyped type-variant UR factoring-nr
private variable
k n nā² nā³ m mā² mā³ : Nat
t tā² tā³ u v A z : Term _
H Hā² Hā³ : Heap _ _
Ļ Ļā² Ļā³ : Wk _ _
S Sā² Sā³ : Stack _
p pā² q qā² r rā² : M
y yā² : Ptr _
x : Fin _
e eā² : Entry _ _
Ī : Con Term _
c cā² cā³ : Cont _
s sā² : State _ _ _
Ļ : Subst _ _
em : Erased-matches
opaque
State-injectivity :
{H : Heap _ _} ā
⨠H , t , Ļ , S ⩠┠⨠Hā² , tā² , Ļā² , Sā² ā© ā
H ā” Hā² Ć t ā” tā² Ć Ļ ā” Ļā² Ć S ā” Sā²
State-injectivity refl = refl , refl , refl , refl
opaque
wkValue : (Ļ : Wk m n) ā Value t ā Value (wk Ļ t)
wkValue Ļ lamᵄ = lamᵄ
wkValue Ļ zeroᵄ = zeroᵄ
wkValue Ļ sucᵄ = sucᵄ
wkValue Ļ starᵄ = starᵄ
wkValue Ļ prodᵄ = prodᵄ
wkValue Ļ rflᵄ = rflᵄ
wkValue Ļ Uᵄ = Uᵄ
wkValue Ļ Ī Ī£įµ„ = ΠΣᵄ
wkValue Ļ āᵄ = āᵄ
wkValue Ļ Unitᵄ = Unitᵄ
wkValue Ļ Emptyᵄ = Emptyᵄ
wkValue Ļ Idᵄ = Idᵄ
wkValue Ļ (unitrec-ηᵄ Ī·) = unitrec-ηᵄ Ī·
opaque
substValue : (Ļ : Subst m n) ā Value t ā Value (t [ Ļ ])
substValue Ļ lamᵄ = lamᵄ
substValue Ļ zeroᵄ = zeroᵄ
substValue Ļ sucᵄ = sucᵄ
substValue Ļ starᵄ = starᵄ
substValue Ļ prodᵄ = prodᵄ
substValue Ļ rflᵄ = rflᵄ
substValue Ļ Uᵄ = Uᵄ
substValue Ļ Ī Ī£įµ„ = ΠΣᵄ
substValue Ļ āᵄ = āᵄ
substValue Ļ Unitᵄ = Unitᵄ
substValue Ļ Emptyᵄ = Emptyᵄ
substValue Ļ Idᵄ = Idᵄ
substValue Ļ (unitrec-ηᵄ Ī·) = unitrec-ηᵄ Ī·
opaque
Valueā¬Neutral : Value t ā ¬ Neutral t
Valueā¬Neutral lamᵄ ()
Valueā¬Neutral zeroᵄ ()
Valueā¬Neutral sucᵄ ()
Valueā¬Neutral starᵄ ()
Valueā¬Neutral prodᵄ ()
Valueā¬Neutral rflᵄ ()
Valueā¬Neutral Uᵄ ()
Valueā¬Neutral ΠΣᵄ ()
Valueā¬Neutral āᵄ ()
Valueā¬Neutral Unitᵄ ()
Valueā¬Neutral Emptyᵄ ()
Valueā¬Neutral Idᵄ ()
Valueā¬Neutral (unitrec-ηᵄ Ī·) (unitrecā no-Ī· _) = no-Ī· Ī·
opaque
ValueāWhnf :
Value t ā
Whnf t ā āā Ī» l p q A u v ā t ā” unitrec l p q A u v Ć UnitŹ·-Ī·
ValueāWhnf lamᵄ = injā lamā
ValueāWhnf zeroᵄ = injā zeroā
ValueāWhnf sucᵄ = injā sucā
ValueāWhnf starᵄ = injā starā
ValueāWhnf prodᵄ = injā prodā
ValueāWhnf rflᵄ = injā rflā
ValueāWhnf Uᵄ = injā Uā
ValueāWhnf ΠΣᵄ = injā ΠΣā
ValueāWhnf āᵄ = injā āā
ValueāWhnf Unitᵄ = injā Unitā
ValueāWhnf Emptyᵄ = injā Emptyā
ValueāWhnf Idᵄ = injā Idā
ValueāWhnf (unitrec-ηᵄ x) = injā (_ , _ , _ , _ , _ , _ , refl , x)
opaque
lookup-det : {H : Heap k m} {t : Term n} {u : Term nā²}
ā H ⢠y ā¦[ r ] t , Ļ āØ¾ Hā²
ā H ⢠y ā¦[ r ] u , ĻⲠ⨾ Hā³
ā Ī£ (n ā” nā²) Ī» p ā subst Term p t ā” u
Ć subst (Wk m) p Ļ ā” Ļā² Ć Hā² ā” Hā³
lookup-det (here p-šā”q) (here p-šā”qā²) =
case -ā”-functional p-šā”q p-šā”qā² of Ī» {
refl ā
refl , refl , refl , refl }
lookup-det (there x) (there y) =
case lookup-det x y of Ī» {
(refl , refl , refl , refl) ā
refl , refl , refl , refl }
lookup-det (thereā x) (thereā y) =
case lookup-det x y of Ī» {
(refl , refl , refl , refl) ā
refl , refl , refl , refl}
opaque
lookup-detā² : {H : Heap k m} {t : Term n} {u : Term nā²}
ā H ⢠y ⦠(t , Ļ)
ā H ⢠y ⦠(u , Ļā²)
ā Ī£ (n ā” nā²) Ī» p ā subst Term p t ā” u Ć subst (Wk m) p Ļ ā” Ļā²
lookup-detā² here here = refl , refl , refl
lookup-detā² (there d) (there dā²) =
case lookup-detā² d dā² of Ī» {
(refl , refl , refl) ā
refl , refl , refl }
lookup-detā² (thereā d) (thereā dā²) =
case lookup-detā² d dā² of Ī» {
(refl , refl , refl) ā
refl , refl , refl }
opaque
ā¦āā¦ā : ā y ā (āā Ī» n (c : Entry _ n) ā H ⢠y ⦠c) ā H ⢠y ā¦ā
ā¦āā¦ā {H = ε} ()
ā¦āā¦ā {H = H ā c} y0 = injā (_ , _ , here)
ā¦āā¦ā {H = H āā} y0 = injā here
ā¦āā¦ā {H = H ā c} (y +1) =
case ā¦āā¦ā y of Ī» where
(injā (_ , _ , d)) ā injā (_ , _ , there d)
(injā d) ā injā (there d)
ā¦āā¦ā {H = H āā} (y +1) =
case ā¦āā¦ā y of Ī» where
(injā (_ , _ , d)) ā injā (_ , _ , thereā d)
(injā d) ā injā (thereā d)
opaque
¬ā¦ā§ā¦ā : H ⢠y ⦠e ā H ⢠y ā¦ā ā ā„
¬ā¦ā§ā¦ā here ()
¬ā¦ā§ā¦ā (there d) (there dā²) = ¬ā¦ā§ā¦ā d dā²
¬ā¦ā§ā¦ā (thereā d) (thereā dā²) = ¬ā¦ā§ā¦ā d dā²
opaque
¬erased-heapā¬ā¦ā : {H : Heap k _} ā H ⢠y ā¦ā ā k ā” 0 ā ā„
¬erased-heapā¬ā¦ā here ()
¬erased-heapā¬ā¦ā (there d) kā”0 = ¬erased-heapā¬ā¦ā d kā”0
¬erased-heapā¬ā¦ā (thereā d) ()
opaque
¬erased-heapā⦠:
{H : Heap k m} ā k ā” 0 ā (y : Ptr m) ā
āā Ī» n (e : Entry m n) ā H ⢠y ⦠e
¬erased-heapā⦠kā”0 y =
case ā¦āā¦ā y of Ī» where
(injā x) ā x
(injā x) ā ā„-elim (¬erased-heapā¬ā¦ā x kā”0)
opaque
ā¦[]ā⦠: H ⢠y ā¦[ q ] e ⨾ Hā² ā H ⢠y ⦠e
ā¦[]ā⦠(here x) = here
ā¦[]ā⦠(there d) = there (ā¦[]ā⦠d)
ā¦[]ā⦠(thereā d) = thereā (ā¦[]ā⦠d)
opaque
heapSubstVar : H ⢠y ā¦[ q ] t , Ļ āØ¾ Hā² ā toSubstā H y ā” wk Ļ t [ H ]ā
heapSubstVar {t} (here _) =
sym (step-consSubst t)
heapSubstVar {t} (there d) =
trans (heapSubstVar d) (sym (step-consSubst t))
heapSubstVar {H = H āā} {t} {Ļ = step Ļ} (thereā d) =
trans (cong wk1 (heapSubstVar d))
(trans (sym (wk1-liftSubst (wk Ļ t)))
(cong (_[ H ]āā) (wk1-wk Ļ t)))
opaque
heapSubstVarā² : H ⢠y ⦠(t , Ļ) ā toSubstā H y ā” wk Ļ t [ H ]ā
heapSubstVarā² {t} here =
sym (step-consSubst t)
heapSubstVarā² {t} (there d) =
trans (heapSubstVarā² d) (sym (step-consSubst t))
heapSubstVarā² {H = H āā} {t} {Ļ = step Ļ} (thereā d) =
trans (cong wk1 (heapSubstVarā² d))
(trans (sym (wk1-liftSubst (wk Ļ t)))
(cong (_[ H ]āā) (wk1-wk Ļ t)))
opaque
-ā¢-no-lookup :
(ā {r} ā H ⨠y ā©Ź° - q ā” r ā ā„) ā
H ⢠y ā¦[ q ] e ⨾ Hā² ā ā„
-ā¢-no-lookup p-qā¢r (here p-qā”r) =
p-qā¢r p-qā”r
-ā¢-no-lookup p-qā¢r (there d) =
-ā¢-no-lookup p-qā¢r d
-ā¢-no-lookup p-qā¢r (thereā d) =
-ā¢-no-lookup p-qā¢r d
opaque
ā¦
ā¦į¶-sgSubst : ā c ā ā¦
c ā¦į¶ (t [ u ]ā) ā” ā¦
wk1į¶ c ā¦į¶ t [ u ]ā
ā¦
ā¦į¶-sgSubst (āā p u Ļ) =
cong (_ ā_) (sym (step-sgSubst _ _))
ā¦
ā¦į¶-sgSubst (fstā p) = refl
ā¦
ā¦į¶-sgSubst (sndā p) = refl
ā¦
ā¦į¶-sgSubst {u = v} (prodrecā r p q A u Ļ) =
congā (Ī» u A ā prodrec r p q A _ u)
(lifts-step-sgSubst 2 u)
(lifts-step-sgSubst 1 A)
ā¦
ā¦į¶-sgSubst {u} (natrecā p q r A z s Ļ) =
congā (Ī» A z s ā natrec p q r A z s _)
(lifts-step-sgSubst 1 A)
(lifts-step-sgSubst 0 z)
(lifts-step-sgSubst 2 s)
ā¦
ā¦į¶-sgSubst {u = v} (unitrecā _ p q A u Ļ) =
congā (Ī» u A ā unitrec _ p q A _ u)
(sym (step-sgSubst _ _))
(lifts-step-sgSubst 1 A)
ā¦
ā¦į¶-sgSubst (emptyrecā p A Ļ) =
cong (Ī» A ā emptyrec p A _)
(lifts-step-sgSubst 0 A)
ā¦
ā¦į¶-sgSubst (Jā p q A t B u v Ļ) =
sym (congā
(Ī» A t B u v ā J p q A t B u v _)
(step-sgSubst A _) (step-sgSubst t _)
(sym (lifts-step-sgSubst 2 B))
(step-sgSubst u _) (step-sgSubst v _))
ā¦
ā¦į¶-sgSubst (Kā p A t B u Ļ) =
sym (congā (Ī» A t B u ā K p A t B u _)
(step-sgSubst A _) (step-sgSubst t _)
(sym (lifts-step-sgSubst 1 B))
(step-sgSubst u _))
ā¦
ā¦į¶-sgSubst ([]-congā s A t u Ļ) =
sym (congā (Ī» A t u ā []-cong s A t u _)
(step-sgSubst A _) (step-sgSubst t _)
(step-sgSubst u _))
ā¦
ā¦į¶-sgSubst sucā = refl
opaque
ā¦
ā¦Ė¢-sgSubst : ā S ā ā¦
S ā¦Ė¢ (t [ u ]ā) ā” ā¦
wk1Ė¢ S ā¦Ė¢ t [ u ]ā
ā¦
ā¦Ė¢-sgSubst ε = refl
ā¦
ā¦Ė¢-sgSubst {t} {u} (e ā S) = begin
ā¦
e ā S ā¦Ė¢ (t [ u ]ā) ā”āØā©
ā¦
S ā¦Ė¢ (ā¦
e ā¦į¶ (t [ u ]ā)) ā”⨠cong ā¦
S ā¦Ė¢_ (ā¦
ā¦į¶-sgSubst e) ā©
ā¦
S ā¦Ė¢ (ā¦
wk1į¶ e ā¦į¶ t [ u ]ā) ā”⨠ā¦
ā¦Ė¢-sgSubst S ā©
ā¦
wk1Ė¢ S ā¦Ė¢ (ā¦
wk1į¶ e ā¦į¶ t) [ u ]ā ā”āØā©
ā¦
wk1Ė¢ (e ā S) ā¦Ė¢ t [ u ]ā ā
opaque
ā¦
ā¦į¶-[,] : ā e ā ā¦
e ā¦į¶ (t [ u , v ]āā) ā” ā¦
wk2į¶ e ā¦į¶ t [ u , v ]āā
ā¦
ā¦į¶-[,] (āā p u Ļ) =
cong (_ ā_) (lifts-step-[,] 0 u)
ā¦
ā¦į¶-[,] (fstā x) = refl
ā¦
ā¦į¶-[,] (sndā x) = refl
ā¦
ā¦į¶-[,] (prodrecā r p q A u Ļ) =
congā (Ī» x y ā prodrec r p q x _ y)
(lifts-step-[,] 1 A)
(lifts-step-[,] 2 u)
ā¦
ā¦į¶-[,] (natrecā p q r A z s Ļ) =
congā (Ī» A z s ā natrec p q r A z s _)
(lifts-step-[,] 1 A)
(lifts-step-[,] 0 z)
(lifts-step-[,] 2 s)
ā¦
ā¦į¶-[,] (unitrecā _ p q A u Ļ) =
congā (Ī» x y ā unitrec _ p q x _ y)
(lifts-step-[,] 1 A) (lifts-step-[,] 0 u)
ā¦
ā¦į¶-[,] (emptyrecā p A Ļ) =
cong (Ī» A ā emptyrec p A _) (lifts-step-[,] 0 A)
ā¦
ā¦į¶-[,] (Jā p q A t B u v Ļ) =
congā
(Ī» A t B u v ā J p q A t B u v _)
(lifts-step-[,] 0 A) (lifts-step-[,] 0 t)
(lifts-step-[,] 2 B) (lifts-step-[,] 0 u)
(lifts-step-[,] 0 v)
ā¦
ā¦į¶-[,] (Kā p A t B u Ļ) =
congā (Ī» A t B u ā K p A t B u _)
(lifts-step-[,] 0 A) (lifts-step-[,] 0 t)
(lifts-step-[,] 1 B) (lifts-step-[,] 0 u)
ā¦
ā¦į¶-[,] ([]-congā s A t u Ļ) =
congā (Ī» A t u ā []-cong s A t u _)
(lifts-step-[,] 0 A) (lifts-step-[,] 0 t)
(lifts-step-[,] 0 u)
ā¦
ā¦į¶-[,] sucā = refl
opaque
ā¦
ā¦Ė¢-[,] : ā S ā ā¦
S ā¦Ė¢ (t [ u , v ]āā) ā” ā¦
wk2Ė¢ S ā¦Ė¢ t [ u , v ]āā
ā¦
ā¦Ė¢-[,] ε = refl
ā¦
ā¦Ė¢-[,] {t} {u} {v} (e ā S) = begin
ā¦
e ā S ā¦Ė¢ (t [ u , v ]āā) ā”āØā©
ā¦
S ā¦Ė¢ (ā¦
e ā¦į¶ (t [ u , v ]āā)) ā”⨠cong ā¦
S ā¦Ė¢_ (ā¦
ā¦į¶-[,] e) ā©
ā¦
S ā¦Ė¢ (ā¦
wk2į¶ e ā¦į¶ t [ u , v ]āā) ā”⨠ā¦
ā¦Ė¢-[,] S ā©
ā¦
wk2Ė¢ S ā¦Ė¢ (ā¦
wk2į¶ e ā¦į¶ t) [ u , v ]āā ā”āØā©
ā¦
wk2Ė¢ (e ā S) ā¦Ė¢ t [ u , v ]āā ā
opaque
wk-ā¦
ā¦į¶ : ā {Ļ : Wk m n} e ā wk Ļ (ā¦
e ā¦į¶ t) ā” ā¦
wkį¶ Ļ e ā¦į¶ (wk Ļ t)
wk-ā¦
ā¦į¶ {Ļ} (āā p u Ļā²) =
cong (_ ā_) (wk-comp Ļ Ļā² u)
wk-ā¦
ā¦į¶ (fstā p) = refl
wk-ā¦
ā¦į¶ (sndā p) = refl
wk-ā¦
ā¦į¶ {Ļ} (prodrecā r p q A u Ļā²) =
congā (Ī» A u ā prodrec r p q A _ u)
(wk-comp (lift Ļ) (lift Ļā²) A)
(wk-comp (liftn Ļ 2) (liftn Ļā² 2) u)
wk-ā¦
ā¦į¶ {Ļ} (natrecā p q r A z s Ļā²) =
congā (Ī» A z s ā natrec p q r A z s _)
(wk-comp (lift Ļ) (lift Ļā²) A)
(wk-comp Ļ Ļā² z)
(wk-comp (liftn Ļ 2) (liftn Ļā² 2) s)
wk-ā¦
ā¦į¶ {Ļ} (unitrecā _ p q A u Ļā²) =
congā (Ī» A u ā unitrec _ p q A _ u)
(wk-comp (lift Ļ) (lift Ļā²) A)
(wk-comp Ļ Ļā² u)
wk-ā¦
ā¦į¶ {Ļ} (emptyrecā p A Ļā²) =
cong (Ī» A ā emptyrec p A _) (wk-comp Ļ Ļā² A)
wk-ā¦
ā¦į¶ {Ļ} (Jā p q A t B u v Ļā²) =
congā
(Ī» A t B u v ā J p q A t B u v _)
(wk-comp Ļ Ļā² A) (wk-comp Ļ Ļā² t)
(wk-comp (liftn Ļ 2) (liftn Ļā² 2) B)
(wk-comp Ļ Ļā² u) (wk-comp Ļ Ļā² v)
wk-ā¦
ā¦į¶ {Ļ} (Kā p A t B u Ļā²) =
congā (Ī» A t B u ā K p A t B u _)
(wk-comp Ļ Ļā² A) (wk-comp Ļ Ļā² t)
(wk-comp (lift Ļ) (lift Ļā²) B) (wk-comp Ļ Ļā² u)
wk-ā¦
ā¦į¶ {Ļ} ([]-congā s A t u Ļā²) =
congā (Ī» A t u ā []-cong s A t u _)
(wk-comp Ļ Ļā² A) (wk-comp Ļ Ļā² t)
(wk-comp Ļ Ļā² u)
wk-ā¦
ā¦į¶ {Ļ} sucā = refl
opaque
ā¦
ā¦į¶-cong : ā e ā t [ Ļ ] ā” u [ Ļ ]
ā ā¦
e ā¦į¶ t [ Ļ ] ā” ā¦
e ā¦į¶ u [ Ļ ]
ā¦
ā¦į¶-cong (āā p u Ļ) tā”u =
cong (_ā _) tā”u
ā¦
ā¦į¶-cong (fstā x) tā”u =
cong (fst _) tā”u
ā¦
ā¦į¶-cong (sndā x) tā”u =
cong (snd _) tā”u
ā¦
ā¦į¶-cong (prodrecā r p q A u Ļ) tā”u =
cong (Ī» t ā prodrec _ _ _ _ t _) tā”u
ā¦
ā¦į¶-cong (natrecā p q r A z s Ļ) tā”u =
cong (Ī» t ā natrec _ _ _ _ _ _ t) tā”u
ā¦
ā¦į¶-cong (unitrecā _ p q A u Ļ) tā”u =
cong (Ī» t ā unitrec _ _ _ _ t _) tā”u
ā¦
ā¦į¶-cong (emptyrecā p A Ļ) tā”u =
cong (emptyrec _ _) tā”u
ā¦
ā¦į¶-cong (Jā p q A t B u v Ļ) tā”u =
cong (J _ _ _ _ _ _ _) tā”u
ā¦
ā¦į¶-cong (Kā p A t B u Ļ) tā”u =
cong (K _ _ _ _ _) tā”u
ā¦
ā¦į¶-cong ([]-congā s A t u Ļ) tā”u =
cong ([]-cong _ _ _ _) tā”u
ā¦
ā¦į¶-cong sucā tā”u =
cong suc tā”u
opaque
ā¦
ā¦Ė¢-cong : ā S ā t [ Ļ ] ā” u [ Ļ ]
ā ā¦
S ā¦Ė¢ t [ Ļ ] ā” ā¦
S ā¦Ė¢ u [ Ļ ]
ā¦
ā¦Ė¢-cong ε tā”u = tā”u
ā¦
ā¦Ė¢-cong (e ā S) tā”u = ā¦
ā¦Ė¢-cong S (ā¦
ā¦į¶-cong e tā”u)
opaque
wk-sucā : (Ļ : Wk m n) (k : Nat) ā wkĖ¢ Ļ (sucā k) ā” sucā k
wk-sucā Ļ 0 = refl
wk-sucā Ļ (1+ k) = cong (sucā ā_) (wk-sucā Ļ k)
opaque
ā£ā£ā-inv : ⣠c ā S ā£ā” p ā āā Ī» q r ā ⣠c ā£į¶ā” q à ⣠S ā£ā” r Ć p ā” r Ā· q
ā£ā£ā-inv (e ā S) = _ , _ , e , S , refl
opaque
wk-ā£ā£į¶ : ⣠c ā£į¶ā” p ā ⣠wkį¶ Ļ c ā£į¶ā” p
wk-ā£ā£į¶ āā = āā
wk-ā£ā£į¶ fstā = fstā
wk-ā£ā£į¶ sndā = sndā
wk-ā£ā£į¶ (natrecā x) = natrecā x
wk-ā£ā£į¶ prodrecā = prodrecā
wk-ā£ā£į¶ unitrecā = unitrecā
wk-ā£ā£į¶ emptyrecā = emptyrecā
wk-ā£ā£į¶ (Jā x) = Jā x
wk-ā£ā£į¶ (Kā x) = Kā x
wk-ā£ā£į¶ []-congā = []-congā
wk-ā£ā£į¶ sucā = sucā
opaque
wk-ā£ā£ : ⣠S ā£ā” p ā ⣠wkĖ¢ Ļ S ā£ā” p
wk-ā£ā£ ε = ε
wk-ā£ā£ (e ā S) = wk-ā£ā£į¶ e ā wk-ā£ā£ S
opaque
ā£natrecā£į¶-functional :
ā£natrec p , r ā£ā” q ā ā£natrec p , r ā£ā” qā² ā q ā” qā²
ā£natrecā£į¶-functional
(has-nrā ⦠has-nr ā¦) (has-nrā ⦠has-nr = has-nrā² ā¦) =
case Nr-available-propositional _ has-nr has-nrā² of Ī» where
refl ā refl
ā£natrecā£į¶-functional (has-nrā ⦠has-nr ā¦) (no-nrā ⦠no-nr ⦠x) =
ā„-elim (¬[Nrā§No-nr-glb] _ has-nr no-nr)
ā£natrecā£į¶-functional (no-nrā ⦠no-nr ⦠x) (has-nrā ⦠has-nr ā¦) =
ā„-elim (¬[Nrā§No-nr-glb] _ has-nr no-nr)
ā£natrecā£į¶-functional (no-nrā x) (no-nrā y) =
GLB-unique x y
opaque
ā£Jā£į¶-functional : ā£J em , p , q ā£ā” r ā ā£J em , p , q ā£ā” rā² ā r ā” rā²
ā£Jā£į¶-functional J-all J-all = refl
ā£Jā£į¶-functional (J-someā _ _) (J-someā _ _) = refl
ā£Jā£į¶-functional (J-someā pā”š qā”š) (J-some false) =
ā„-elim (false (pā”š , qā”š))
ā£Jā£į¶-functional (J-some false) (J-someā pā”š qā”š) =
ā„-elim (false (pā”š , qā”š))
ā£Jā£į¶-functional (J-some _) (J-some _) = refl
ā£Jā£į¶-functional J-none J-none = refl
opaque
ā£Kā£į¶-functional : ā£K em , p ā£ā” r ā ā£K em , p ā£ā” rā² ā r ā” rā²
ā£Kā£į¶-functional K-all K-all = refl
ā£Kā£į¶-functional (K-someā _) (K-someā _) = refl
ā£Kā£į¶-functional (K-someā pā”š) (K-some pā¢š) =
ā„-elim (pā¢š pā”š)
ā£Kā£į¶-functional (K-some pā¢š) (K-someā pā”š) =
ā„-elim (pā¢š pā”š)
ā£Kā£į¶-functional (K-some _) (K-some _) = refl
ā£Kā£į¶-functional K-none K-none = refl
opaque
ā£ā£į¶-functional : ⣠c ā£į¶ā” p ā ⣠c ā£į¶ā” q ā p ā” q
ā£ā£į¶-functional āā āā = refl
ā£ā£į¶-functional fstā fstā = refl
ā£ā£į¶-functional sndā sndā = refl
ā£ā£į¶-functional prodrecā prodrecā = refl
ā£ā£į¶-functional (natrecā x) (natrecā y) =
ā£natrecā£į¶-functional x y
ā£ā£į¶-functional unitrecā unitrecā = refl
ā£ā£į¶-functional emptyrecā emptyrecā = refl
ā£ā£į¶-functional (Jā x) (Jā y) = ā£Jā£į¶-functional x y
ā£ā£į¶-functional (Kā x) (Kā y) = ā£Kā£į¶-functional x y
ā£ā£į¶-functional []-congā []-congā = refl
ā£ā£į¶-functional sucā sucā = refl
opaque
ā£ā£-functional : ⣠S ā£ā” p ā ⣠S ā£ā” q ā p ā” q
ā£ā£-functional ε ε = refl
ā£ā£-functional (e ā S) (eā² ā Sā²) =
Ā·-cong (ā£ā£-functional S Sā²) (ā£ā£į¶-functional e eā²)
opaque
ā£nrā£ā” : ⦠has-nr : Nr-available ⦠ā ā Ī» q ā ā£natrec p , r ā£ā” q
ā£nrā£ā” = _ , has-nrā
opaque
ā£Jā£ā” : ā Ī» r ā ā£J em , p , q ā£ā” r
ā£Jā£ā” {em = none} = _ , J-none
ā£Jā£ā” {em = all} = _ , J-all
ā£Jā£ā” {em = some} {p} {q} =
case is-š? p of Ī» where
(yes pā”š) ā
case is-š? q of Ī» where
(yes qā”š) ā _ , J-someā pā”š qā”š
(no qā¢š) ā _ , J-some Ī» (_ , qā”š) ā qā¢š qā”š
(no pā¢š) ā _ , J-some (Ī» (pā”š , _) ā pā¢š pā”š)
opaque
ā£Kā£ā” : ā Ī» r ā ā£K em , p ā£ā” r
ā£Kā£ā” {em = none} = _ , K-none
ā£Kā£ā” {em = all} = _ , K-all
ā£Kā£ā” {em = some} {p} =
case is-š? p of Ī» where
(yes pā”š) ā _ , K-someā pā”š
(no pā¢š) ā _ , K-some pā¢š
opaque
ā£ā£į¶ā” :
(ā {n p q r A u v Ļ} ā c ā” natrecā {n = n} p q r A u v Ļ ā Nr-available) ā
ā ⣠c ā£į¶ā”_
ā£ā£į¶ā” {c = āā p u Ļ} _ = š , āā
ā£ā£į¶ā” {c = fstā x} _ = š , fstā
ā£ā£į¶ā” {c = sndā x} _ = š , sndā
ā£ā£į¶ā” {c = prodrecā r p q A u Ļ} _ = r , prodrecā
ā£ā£į¶ā” {c = natrecā p q r A z s Ļ} has-nr =
_ , natrecā (ā£nrā£ā” ⦠has-nr refl ⦠.projā)
ā£ā£į¶ā” {c = unitrecā l p q A u Ļ} _ = p , unitrecā
ā£ā£į¶ā” {c = emptyrecā p A Ļ} _ = p , emptyrecā
ā£ā£į¶ā” {c = Jā p q A t B u v Ļ} _ = _ , Jā (ā£Jā£ā” .projā)
ā£ā£į¶ā” {c = Kā p A t B u Ļ} _ = _ , Kā (ā£Kā£ā” .projā)
ā£ā£į¶ā” {c = []-congā s A t u Ļ} _ = š , []-congā
ā£ā£į¶ā” {c = sucā} _ = š , sucā
opaque
ā£ā£ā” : (ā {p r} ā natrec p , r ā S ā Nr-available) ā ā ⣠S ā£ā”_
ā£ā£ā” {S = ε} _ = š , ε
ā£ā£ā” {S = e ā S} has-nr =
let _ , ā£Sā£ā” = ā£ā£ā” (has-nr āā there)
_ , ā£eā£ā” = ā£ā£į¶ā” Ī» { refl ā has-nr here}
in _ , ā£eā£ā” ā ā£Sā£ā”
opaque
nrā-ā£ā£ā” : (ā {p r} ā ¬ natrec p , r ā S) ā ā ⣠S ā£ā”_
nrā-ā£ā£ā” nrā = ā£ā£ā” (Ī» nrā ā ā„-elim (nrā nrā))
opaque
ā£natrecā£ā¤ : ā£natrec p , r ā£ā” q ā q ⤠p + r Ā· q
ā£natrecā£ā¤ has-nrā = nrāā¤
ā£natrecā£ā¤ (no-nrā x) = nrįµ¢-GLB-⤠x
opaque
ā£Jā£ā”Ļ :
em ā¤įµįµ some ā (em ā” some ā ¬ (p ā” š Ć q ā” š)) ā
ā£J em , p , q ā£ā” Ļ
ā£Jā£ā”Ļ {(none)} _ _ = J-none
ā£Jā£ā”Ļ {(all)} () _
ā£Jā£ā”Ļ {(some)} _ ā¢š = J-some (ā¢š refl)
opaque
ā£Kā£ā”Ļ :
em ā¤įµįµ some ā (em ā” some ā p ⢠š) ā
ā£K em , p ā£ā” Ļ
ā£Kā£ā”Ļ {(none)} _ _ = K-none
ā£Kā£ā”Ļ {(all)} () _
ā£Kā£ā”Ļ {(some)} _ ā¢š = K-some (ā¢š refl)
opaque
ā£sucāā£ā”š : ā k ā ⣠sucā {m} k ā£ā” š
ā£sucāā£ā”š 0 = ε
ā£sucāā£ā”š (1+ k) =
subst (⣠_ ā sucā k ā£ā”_) (Ā·-identityʳ š) (sucā ā ā£sucāā£ā”š k)
opaque
ā£S++sucāā£ā”ā£S⣠: ⣠S ā£ā” p ā ⣠S ++ sucā k ā£ā” p
ā£S++sucāā£ā”ā£S⣠ε = ā£sucāā£ā”š _
ā£S++sucāā£ā”ā£S⣠(e ā S) = e ā ā£S++sucāā£ā”ā£S⣠S
opaque
prāāāā£Sā£ā”š : ⣠S ā£ā” q ā prodrec š , p ā S ā q ā” š
prāāāā£Sā£ā”š ε ()
prāāāā£Sā£ā”š (prodrecā ā ā£Sā£ā”) here = Ā·-zeroʳ _
prāāāā£Sā£ā”š (_ ā ā£Sā£ā”) (there x) =
trans (Ā·-congʳ (prāāāā£Sā£ā”š ā£Sā£ā” x)) (Ā·-zeroĖ” _)
opaque
urāāāā£Sā£ā”š : ⣠S ā£ā” q ā unitrec š ā S ā q ā” š
urāāāā£Sā£ā”š ε ()
urāāāā£Sā£ā”š (unitrecā ā ā£Sā£ā”) here = Ā·-zeroʳ _
urāāāā£Sā£ā”š (_ ā ā£Sā£ā”) (there x) =
trans (Ā·-congʳ (urāāāā£Sā£ā”š ā£Sā£ā” x)) (Ā·-zeroĖ” _)
opaque
erāāāā£Sā£ā”š : ⣠S ā£ā” q ā emptyrec š ā S ā q ā” š
erāāāā£Sā£ā”š ε ()
erāāāā£Sā£ā”š (emptyrecā ā ā£Sā£ā”) here = Ā·-zeroʳ _
erāāāā£Sā£ā”š (_ ā ā£Sā£ā”) (there x) =
trans (Ā·-congʳ (erāāāā£Sā£ā”š ā£Sā£ā” x)) (Ā·-zeroĖ” _)
opaque
ā£ā£ā”š :
⣠S ā£ā” q ā prodrec š , p ā S ā (unitrec š ā S) ā (emptyrec š ā S) ā
q ā” š
ā£ā£ā”š ā£Sā£ā” (injā prāā) = prāāāā£Sā£ā”š ā£Sā£ā” prāā
ā£ā£ā”š ā£Sā£ā” (injā (injā urāā)) = urāāāā£Sā£ā”š ā£Sā£ā” urāā
ā£ā£ā”š ā£Sā£ā” (injā (injā erāā)) = erāāāā£Sā£ā”š ā£Sā£ā” erāā
opaque
nrāāā£ā£ā”š :
(ā {p r} ā natrec p , r ā S ā ā„) ā
prodrec š , p ā S ā (unitrec š ā S) ā (emptyrec š ā S) ā ⣠S ā£ā” š
nrāāā£ā£ā”š nrā assumption =
let _ , ā£Sā£ā” = nrā-ā£ā£ā” nrā
in subst (⣠_ ā£ā”_) (ā£ā£ā”š ā£Sā£ā” assumption) ā£Sā£ā”
opaque
ā£nrā£ā¢š :
⦠Has-well-behaved-zero _ semiring-with-meet ⦠ā
ā£natrec p , r ā£ā” q ā q ⢠š
ā£nrā£ā¢š has-nrā = nrāā¢š
ā£nrā£ā¢š (no-nrā x) refl = šā°š (x .projā 0)
opaque
ā£ā£ā”šāerased-match :
⦠Has-well-behaved-zero _ semiring-with-meet ⦠ā
⣠S ā£ā” š ā
(ā Ī» p ā prodrec š , p ā S) ā (unitrec š ā S) ā (emptyrec š ā S) ā
(āā Ī» p q ā J p , q ā S) ā (ā Ī» p ā K p ā S) ā ([]-congā S)
ā£ā£ā”šāerased-match = lemma refl
where
thereā² :
(ā Ī» p ā prodrec š , p ā S) ā (unitrec š ā S) ā (emptyrec š ā S) ā
(āā Ī» p q ā J p , q ā S) ā (ā Ī» p ā K p ā S) ā ([]-congā S) ā
(ā Ī» p ā prodrec š , p ā (c ā S)) ā (unitrec š ā c ā S) ā (emptyrec š ā c ā S) ā
(āā Ī» p q ā J p , q ā c ā S) ā (ā Ī» p ā K p ā c ā S) ā ([]-congā c ā S)
thereā² (injā (_ , x)) = injā (_ , there x)
thereā² (injā (injā x)) = injā (injā (there x))
thereā² (injā (injā (injā x))) = injā (injā (injā (there x)))
thereā² (injā (injā (injā (injā (_ , _ , x))))) = injā (injā (injā (injā (_ , _ , there x))))
thereā² (injā (injā (injā (injā (injā (_ , x)))))) = injā (injā (injā (injā (injā (_ , there x)))))
thereā² (injā (injā (injā (injā (injā x))))) = injā (injā (injā (injā (injā (there x)))))
hereā² :
q ā” š ā ⣠c ā£į¶ā” q ā
(ā Ī» p ā prodrec š , p ā (c ā S)) ā (unitrec š ā c ā S) ā (emptyrec š ā c ā S) ā
(āā Ī» p q ā J p , q ā c ā S) ā (ā Ī» p ā K p ā c ā S) ā ([]-congā c ā S)
hereā² qā” āā = ā„-elim (non-trivial qā”)
hereā² qā” fstā = ā„-elim (non-trivial qā”)
hereā² qā” sndā = ā„-elim (non-trivial qā”)
hereā² refl prodrecā = injā (_ , here)
hereā² qā” (natrecā x) = ā„-elim (ā£nrā£ā¢š x qā”)
hereā² refl unitrecā = injā (injā here)
hereā² refl emptyrecā = injā (injā (injā here))
hereā² qā” (Jā x) = injā (injā (injā (injā (_ , _ , here))))
hereā² qā” (Kā x) = injā (injā (injā (injā (injā (_ , here)))))
hereā² qā” []-congā = injā (injā (injā (injā (injā here))))
hereā² qā” sucā = ā„-elim (non-trivial qā”)
lemma :
q ā” š ā ⣠S ā£ā” q ā
(ā Ī» p ā prodrec š , p ā S) ā (unitrec š ā S) ā (emptyrec š ā S) ā
(āā Ī» p q ā J p , q ā S) ā (ā Ī» p ā K p ā S) ā ([]-congā S)
lemma q┠ε = ā„-elim (non-trivial qā”)
lemma qā” (ā£eā£ā” ā ā£Sā£ā”) =
case zero-product qā” of Ī» where
(injā x) ā thereā² (lemma x ā£Sā£ā”)
(injā x) ā hereā² x ā£eā£ā”
opaque
ā£ā£ā¢ :
⦠no-nr : Nr-not-available-GLB ⦠ā
¬ (ā Ī» q ā Greatest-lower-bound q (nrįµ¢ r š p)) ā
ā Ī» (S : Stack m) ā ā q ā ⣠S ā£ā” q ā ā„
ā£ā£ā¢ {r} {p} ⦠no-nr ⦠¬glb =
(natrecā p š r ā zero zero id ā ε) ,
Ī» { _ (natrecā (has-nrā ⦠has-nr ā¦) ā _) ā ¬[Nrā§No-nr-glb] _ has-nr no-nr
; _ (natrecā (no-nrā x) ā _) ā ¬glb (_ , x)}
opaque
ā¦
ā¦Ė¢++ : ā S Sā² ā ā¦
S ++ Sā² ā¦Ė¢ t ā” ā¦
Sā² ā¦Ė¢ (ā¦
S ā¦Ė¢ t)
ā¦
ā¦Ė¢++ ε Sā² = refl
ā¦
ā¦Ė¢++ (c ā S) Sā² = ā¦
ā¦Ė¢++ S Sā²
opaque
wk-++ : (Ļ : Wk m n) (S : Stack n) ā wkĖ¢ Ļ (S ++ Sā²) ā” wkĖ¢ Ļ S ++ wkĖ¢ Ļ Sā²
wk-++ Ļ Īµ = refl
wk-++ Ļ (c ā S) = cong (_ ā_) (wk-++ Ļ S)
opaque
wk-++sucā : (Ļ : Wk m n) (S : Stack n) ā wkĖ¢ Ļ (S ++ sucā k) ā” wkĖ¢ Ļ S ++ sucā k
wk-++sucā {k} Ļ S = trans (wk-++ Ļ S) (cong (_ ++_) (wk-sucā Ļ k))
opaque
sucā++sucā : ā k kā² ā sucā {m} k ++ sucā kā² ā” sucā (k +āæ kā²)
sucā++sucā 0 kā² = refl
sucā++sucā (1+ k) kā² = cong (sucā ā_) (sucā++sucā k kā²)
opaque
ā¦
ā¦į¶-neutral : ā c ā Neutral (ā¦
c ā¦į¶ t) ā Neutral t
ā¦
ā¦į¶-neutral (āā p u Ļ) (āā n) = n
ā¦
ā¦į¶-neutral (fstā x) (fstā n) = n
ā¦
ā¦į¶-neutral (sndā x) (sndā n) = n
ā¦
ā¦į¶-neutral (prodrecā r p q A u Ļ) (prodrecā n) = n
ā¦
ā¦į¶-neutral (natrecā p q r A z s Ļ) (natrecā n) = n
ā¦
ā¦į¶-neutral (unitrecā l p q A u Ļ) (unitrecā x n) = n
ā¦
ā¦į¶-neutral (emptyrecā p A Ļ) (emptyrecā n) = n
ā¦
ā¦į¶-neutral (Jā p q A t B u v Ļ) (Jā n) = n
ā¦
ā¦į¶-neutral (Kā p A t B u Ļ) (Kā n) = n
ā¦
ā¦į¶-neutral ([]-congā s A t u Ļ) ([]-congā n) = n
ā¦
ā¦į¶-neutral sucā ()
opaque
stack-injective : {c : Cont m} {S : Stack m}
ā c ā S ā” cā² ā Sā² ā c ā” cā² Ć S ā” Sā²
stack-injective refl = refl , refl
opaque
sucā-injective : sucā {m} n ā” sucā nā² ā n ā” nā²
sucā-injective {n = 0} {nā² = 0} _ = refl
sucā-injective {n = 1+ _} {nā² = 1+ _} x =
cong 1+ (sucā-injective (stack-injective x .projā))
sucā-injective {n = 0} {nā² = 1+ _} ()
sucā-injective {n = 1+ _} {nā² = 0} ()
opaque
~ʰ-refl : H ~ʰ H
~ʰ-refl {H = ε} = ε
~ʰ-refl {H = H ā c} = ~ʰ-refl ā _
~ʰ-refl {H = H āā} = ~ʰ-refl āā
opaque
~ʰ-sym : H ~ʰ Hā² ā Hā² ~ʰ H
~ʰ-sym ε = ε
~ʰ-sym (H~Hā² ā c) = ~ʰ-sym H~Hā² ā c
~ʰ-sym (H~Hā² āā) = ~ʰ-sym H~Hā² āā
opaque
~ʰ-trans : H ~ʰ Hā² ā Hā² ~ʰ Hā³ ā H ~ʰ Hā³
~ʰ-trans ε ε = ε
~ʰ-trans (H~Hā² ā c) (Hā²~Hā³ ā .c) = ~ʰ-trans H~Hā² Hā²~Hā³ ā c
~ʰ-trans (H~Hā² āā) (Hā²~Hā³ āā) = ~ʰ-trans H~Hā² Hā²~Hā³ āā
opaque
~ʰ-lookup : H ~ʰ Hā² ā H ⢠y ⦠e ā HⲠ⢠y ⦠e
~ʰ-lookup ε ()
~ʰ-lookup (H~Hā² ā _) here = here
~ʰ-lookup (H~Hā² ā _) (there d) = there (~ʰ-lookup H~Hā² d)
~ʰ-lookup (H~Hā² āā) (thereā d) = thereā (~ʰ-lookup H~Hā² d)
opaque
~ʰ-lookupā : H ~ʰ Hā² ā H ⢠y ā¦ā ā HⲠ⢠y ā¦ā
~ʰ-lookupā ε ()
~ʰ-lookupā (H~Hā² āā) here = here
~ʰ-lookupā (H~Hā² ā _) (there d) = there (~ʰ-lookupā H~Hā² d)
~ʰ-lookupā (H~Hā² āā) (thereā d) = thereā (~ʰ-lookupā H~Hā² d)
opaque
~ʰ-subst : H ~ʰ Hā² ā toSubstā H ā” toSubstā Hā²
~ʰ-subst ε = refl
~ʰ-subst (H~Hā² ā (t , Ļ)) =
case ~ʰ-subst H~HⲠof λ
Hā”Hā² ā
congā consSubst Hā”Hā² (cong (wk Ļ t [_]) Hā”Hā²)
~ʰ-subst (H~Hā² āā) =
cong liftSubst (~ʰ-subst H~Hā²)
opaque
update-~ʰ : H ⢠y ā¦[ q ] e ⨾ Hā² ā H ~ʰ Hā²
update-~ʰ (here _) = ~ʰ-refl ā _
update-~ʰ (there d) = update-~ʰ d ā _
update-~ʰ (thereā d) = update-~ʰ d āā
opaque
wk1-Normal : Normal ⨠H , t , Ļ , S ā© ā Normal ⨠H ā (p , e) , t , step Ļ , wk1Ė¢ S ā©
wk1-Normal (val x) = val x
wk1-Normal (var d) = var (there d)
opaque
wk1ā-Normal : Normal ⨠H , t , Ļ , S ā© ā Normal ⨠H āā , t , step Ļ , wk1Ė¢ S ā©
wk1ā-Normal (val x) = val x
wk1ā-Normal (var d) = var (thereā d)
opaque
Normal-stack : Normal ⨠H , t , Ļ , S ā© ā Normal ⨠H , t , Ļ , Sā² ā©
Normal-stack (val x) = val x
Normal-stack (var x) = var x
opaque
~ʰ-Normal : H ~ʰ Hā² ā Normal ⨠H , t , Ļ , S ā© ā Normal ⨠Hā² , t , Ļ , Sā² ā©
~ʰ-Normal H~HⲠ(val x) = val x
~ʰ-Normal H~Hā² (var x) = var (~ʰ-lookupā H~Hā² x)
opaque
wk-[]ā : Ļ ā· H āŹ° Hā² ā (t : Term n) ā t [ Hā² ]ā ā” wk Ļ t [ H ]ā
wk-[]ā {H} id t = cong (_[ H ]ā) (sym (wk-id t))
wk-[]ā (step Ļ) t = trans (wk-[]ā Ļ t) (sym (step-consSubst t))
wk-[]ā (lift {Ļ} {H} {Hā²} {e = u , Ļā²} [Ļ]) t = begin
t [ consSubst (toSubstā Hā²) (wk Ļā² u [ Hā² ]ā) ] ā”Ė⨠singleSubstComp (wk Ļā² u [ Hā² ]ā) (toSubstā Hā²) t ā©
t [ liftSubst (toSubstā Hā²) ] [ wk Ļā² u [ Hā² ]ā ]ā ā”Ė⨠singleSubstLift t (wk Ļā² u) ā©
t [ wk Ļā² u ]ā [ Hā² ]ā ā”⨠wk-[]ā [Ļ] (t [ wk Ļā² u ]ā) ā©
wk Ļ (t [ wk Ļā² u ]ā) [ H ]ā ā”⨠cong (_[ H ]ā) (wk-β t) ā©
wk (lift Ļ) t [ wk Ļ (wk Ļā² u) ]ā [ H ]ā ā”⨠cong (Ī» x ā wk (lift Ļ) t [ x ]ā [ H ]ā) (wk-comp Ļ Ļā² u) ā©
wk (lift Ļ) t [ wk (Ļ ā¢ Ļā²) u ]ā [ H ]ā ā”⨠singleSubstLift (wk (lift Ļ) t) (wk (Ļ ā¢ Ļā²) u) ā©
wk (lift Ļ) t [ liftSubst (toSubstā H) ] [ wk (Ļ ā¢ Ļā²) u [ H ]ā ]ā ā”⨠singleSubstComp (wk (Ļ ā¢ Ļā²) u [ H ]ā) (toSubstā H) (wk (lift Ļ) t) ā©
wk (lift Ļ) t [ consSubst (toSubstā H) (wk (Ļ ā¢ Ļā²) u [ H ]ā) ] ā
opaque
heapUpdateSubst : H ⢠y ā¦[ q ] e ⨾ Hā² ā toSubstā H ā” toSubstā Hā²
heapUpdateSubst d = ~ʰ-subst (update-~ʰ d)
opaque
erasedHeapā”idsubst : ā x ā toSubstā (erasedHeap n) x ā” idSubst x
erasedHeapā”idsubst x0 = refl
erasedHeapā”idsubst (x +1) = cong wk1 (erasedHeapā”idsubst x)
opaque
erasedHeap-subst : ā t ā t [ erasedHeap n ]ā ā” t
erasedHeap-subst t = trans (substVar-to-subst erasedHeapā”idsubst t) (subst-id t)
opaque
toWkā-toSubstā-var : (H : Heap k m) (x : Fin k)
ā toSubstā H (wkVar (toWkā H) x) ā” idSubst x
toWkā-toSubstā-var ε ()
toWkā-toSubstā-var (H ā c) x = toWkā-toSubstā-var H x
toWkā-toSubstā-var (H āā) x0 = refl
toWkā-toSubstā-var (H āā) (x +1) = cong wk1 (toWkā-toSubstā-var H x)
opaque
toWkā-toSubstā : (H : Heap k m) (t : Term k)
ā wk (toWkā H) t [ H ]ā ā” t
toWkā-toSubstā H t = begin
wk (toWkā H) t [ H ]ā ā”⨠subst-wk t ā©
t [ toSubstā H ā⢠toWkā H ] ā”⨠substVar-to-subst (toWkā-toSubstā-var H) t ā©
t [ idSubst ] ā”⨠subst-id t ā©
t ā
opaque
toSubstā-erased : (H : Heap k m) (y : Fin m)
ā H ⢠y ā¦ā ā ā Ī» yā² ā toSubstā H y ā” var yā²
toSubstā-erased ε () _
toSubstā-erased (H ā c) y0 ()
toSubstā-erased (H ā c) (y +1) (there d) = toSubstā-erased H y d
toSubstā-erased (H āā) y0 d = y0 , refl
toSubstā-erased (H āā) (y +1) (thereā d) =
case toSubstā-erased H y d of Ī»
(yā² , ā”yā²) ā
yā² +1 , cong wk1 ā”yā²
opaque
toSubstā-NeutralAt : (d : H ⢠y ā¦ā)
ā NeutralAt y t
ā NeutralAt (toSubstā-erased H y d .projā) (t [ H ]ā)
toSubstā-NeutralAt d var with toSubstā-erased _ _ d
⦠| (xā² , ā”xā²) =
subst (NeutralAt _) (sym ā”xā²) var
toSubstā-NeutralAt d (āā n) =
āā (toSubstā-NeutralAt d n)
toSubstā-NeutralAt d (fstā n) =
fstā (toSubstā-NeutralAt d n)
toSubstā-NeutralAt d (sndā n) =
sndā (toSubstā-NeutralAt d n)
toSubstā-NeutralAt d (natrecā n) =
natrecā (toSubstā-NeutralAt d n)
toSubstā-NeutralAt d (prodrecā n) =
prodrecā (toSubstā-NeutralAt d n)
toSubstā-NeutralAt d (emptyrecā n) =
emptyrecā (toSubstā-NeutralAt d n)
toSubstā-NeutralAt d (unitrecā x n) =
unitrecā x (toSubstā-NeutralAt d n)
toSubstā-NeutralAt d (Jā n) =
Jā (toSubstā-NeutralAt d n)
toSubstā-NeutralAt d (Kā n) =
Kā (toSubstā-NeutralAt d n)
toSubstā-NeutralAt d ([]-congā n) =
[]-congā (toSubstā-NeutralAt d n)
opaque
ā¦
initialā¦ā” : ā¦
initial t ⦠┠t
ā¦
initialā¦ā” = trans (erasedHeap-subst (wk id _)) (wk-id _)