open import Graded.Modality
open import Graded.Mode
open import Graded.Usage.Restrictions
module Graded.Derived.Erased.Usage.Eta
{a b} {M : Set a} {Mode : Set b}
{š : Modality M}
{š : IsMode Mode š}
(R : Usage-restrictions š š)
where
open Modality š
open IsMode š
open import Graded.Context š
open import Graded.Context.Properties š
open import Graded.Modality.Properties š
open import Graded.Usage R
open import Graded.Usage.Inversion R
open import Graded.Usage.Properties R
open import Definition.Untyped M
open import Definition.Untyped.Erased.Eta š
open import Tools.Bool
open import Tools.Empty
open import Tools.Function
open import Tools.Product
import Tools.PropositionalEquality as PE
import Tools.Reasoning.PartialOrder
import Tools.Reasoning.PropositionalEquality
open import Tools.Relation
private variable
t : Term _
γ : Conā _
m : Mode
ok : T _
opaque
unfolding erased
āøerasedā² :
(Trivialįµ ā š ⤠š) ā
γ āø[ šįµ ] t ā šį¶ āø[ šįµ ] erased t
āøerasedā² {γ} {t} hyp āøt =
sub (fstā (āø-š āøt) (ā¤-trans (ā¤-reflexive (Ā·-zeroʳ _)) šā¤āšįµā)) šā¤
where
šā¤āšįµā : š ā¤ ā šįµ ā
šā¤āšįµā =
case trivialįµ? of Ī» where
(yes šįµā”šįµ) ā
ā¤-trans (hyp šįµā”šįµ) (ā¤-reflexive (PE.sym (āšįµāā² šįµā”šįµ)))
(no šįµā¢šįµ) ā
ā¤-reflexive (PE.sym (āšįµā šįµā¢šįµ))
open ā¤į¶-reasoning
šā¤ : šį¶ ā¤į¶ ā šįµ ā ·ᶠγ
šā¤ = case trivialįµ? of Ī» where
(yes šįµā”šįµ) ā begin
šį¶ āĖ⨠·į¶-zeroĖ” _ ā©
š ·ᶠγ ā¤āØ Ā·į¶-monotoneĖ” (hyp šįµā”šįµ) ā©
š ·ᶠγ āĖ⨠·į¶-congʳ (āšįµāā² šįµā”šįµ) ā©
ā šįµ ā ·ᶠγ ā
(no šįµā¢šįµ) ā begin
šį¶ āĖ⨠·į¶-zeroĖ” _ ā©
š ·ᶠγ āĖ⨠·į¶-congʳ (āšįµā šįµā¢šįµ) ā©
ā šįµ ā ·ᶠγ ā
opaque
āøerased : ¬ Trivialįµ ā γ āø[ šįµ ] t ā šį¶ āø[ šįµ ] erased t
āøerased {γ} šįµā¢šįµ āøt = āøerasedā² (ā„-elim āā (šįµā¢šįµ $_)) āøt
opaque
unfolding erased
inv-usage-erasedā² :
γ āø[ m ] erased t ā
ā Ī» Ī“ ā ā šįµ ā Ā·į¶ Ī“ āø[ šįµ ] t à γ ā¤į¶ ā šįµ ā Ā·į¶ Ī“ Ć m PE.ā” šįµ
inv-usage-erasedā² {γ} {m} āø[] =
case inv-usage-fst āø[] of Ī» where
(invUsageFst {Ī“ = Ī“} āøt γ⤠ok) ā
_
, āø-š āøt
, (begin
γ ā¤āØ Ī³ā¤ ā©
Ī“ ā¤āØ āøįµ āøt ā©
ā m ā Ā·į¶ Ī“ ā⨠·į¶-congʳ (āā-cong (lemma ok)) ā©
ā šįµ ā Ā·į¶ Ī“ ā)
, lemma ok
where
lemma : ā m ā Ā· š ⤠ā m ā ā m PE.ā” šįµ
lemma ok =
let open ā¤įµ-reasoning in
ā¤įµ-antisym ā¤šįµ $ begin
šįµ āĖ⨠āšā ā©
ā š ā āĖ⨠āā-cong (Ā·-zeroʳ _) ā©
ā ā m ā Ā· š ā ā¤āØ āā-monotone ok ā©
ā ā m ā ā ā⨠āāāā _ ā©
m ā
open ā¤į¶-reasoning
opaque
inv-usage-erased :
¬ Trivialįµ ā
γ āø[ m ] erased t ā
šį¶ āø[ šįµ ] t à γ ā¤į¶ šį¶ Ć m PE.ā” šįµ
inv-usage-erased {γ = γ} šįµā¢šįµ āø[] =
let _ , āøt , γ⤠, mā” = inv-usage-erasedā² āø[]
āį¶šį¶ = āį¶-trans (Ā·į¶-congʳ (āšįµā šįµā¢šįµ)) (Ā·į¶-zeroĖ” _)
in sub āøt (ā¤į¶-reflexive (āį¶-sym āį¶šį¶))
, ā¤į¶-trans γ⤠(ā¤į¶-reflexive āį¶šį¶)
, mā”