open import Definition.Typed.Restrictions
open import Graded.Erasure.LogicalRelation.Assumptions
open import Graded.Modality
module Graded.Erasure.LogicalRelation.Reduction
{a} {M : Set a}
{š : Modality M}
{R : Type-restrictions š}
(as : Assumptions R)
where
open Assumptions as
open Modality š
open Type-restrictions R
open import Definition.LogicalRelation.Simplified R
open import Definition.Untyped M as U
open import Definition.Untyped.Whnf M type-variant
open import Definition.Typed R
open import Definition.Typed.Properties R
open import Definition.Untyped.Properties M as UP using (wk-id ; wk-lift-id)
open import Graded.Erasure.Extraction.Properties š
open import Graded.Erasure.LogicalRelation as
open import Graded.Erasure.Target as T hiding (_ā¢_ā_; _ā¢_ā*_)
open import Graded.Erasure.Target.Properties as TP
open import Graded.Erasure.Target.Reasoning
open import Tools.Function
open import Tools.Nat
open import Tools.Product as Σ
import Tools.PropositionalEquality as PE
open import Tools.Relation
open import Tools.Sum using (injā; injā)
private
variable
n : Nat
t tā² A : U.Term n
v vā² : T.Term n
Ī : U.Con U.Term n
opaque
sourceRedSubstTerm :
([A] : ts Ā» Π⨠A) ā
tā² Ā® v ā· A / [A] ā
t ā tā² ā· A ā
t Ā® v ā· A / [A]
sourceRedSubstTerm (Levelįµ£ _) (U/Levelįµ£ ā*āÆ) _ =
U/Levelįµ£ ā*āÆ
sourceRedSubstTerm (Uįµ£ _) (U/Levelįµ£ ā*āÆ) _ =
U/Levelįµ£ ā*āÆ
sourceRedSubstTerm (LiftᵣⲠā*Lift ā©A) tā²Ā®v tātā² =
sourceRedSubstTerm ā©A tā²Ā®v (lower-ā (conv-ā tātā² (subset* ā*Lift)))
sourceRedSubstTerm (āįµ£ D) (zeroįµ£ tā²āzero vāvā²) tātā² =
zeroįµ£ (trans-ā (conv-ā tātā² (subset* D)) tā²āzero) vāvā²
sourceRedSubstTerm (āįµ£ ā*ā) (sucįµ£ tā²āsuc vāvā² num tĀ®v) tātā² =
sucįµ£ (trans-ā (conv-ā tātā² (subset* ā*ā)) tā²āsuc) vāvā² num tĀ®v
sourceRedSubstTerm (Unitįµ£ D) (starįµ£ tā²āstar vāstar) tātā² =
starįµ£ (trans-ā (conv-ā tātā² (subset* D)) tā²āstar) vāstar
sourceRedSubstTerm (BᵣⲠBMĪ p q F G D [F] [G]) tĀ®v tātā²
with is-š? p
... | yes PE.refl = tĀ®v .projā , Ī» {a = a} ā¢a ā
sourceRedSubstTerm ([G] ā¢a) (tĀ®v .projā ā¢a)
(app-ā (conv-ā tātā² (subset* D)) ā¢a)
... | no pā¢š = tĀ®v .projā , Ī» {a = a} ā¢a aĀ®w ā
sourceRedSubstTerm ([G] ā¢a) (tĀ®v .projā ā¢a aĀ®w)
(app-ā (conv-ā tātā² (subset* D)) ā¢a)
sourceRedSubstTerm
(BᵣⲠ(BMΣ _) _ _ F G D [F] [G])
(tā , tā , tā²āp , ā¢tā , vā , tāĀ®vā , extra) tātā² =
tā , tā , trans-ā (conv-ā tātā² (subset* D)) tā²āp , ā¢tā , vā , tāĀ®vā ,
extra
sourceRedSubstTerm (Idįµ£ ā©A) (rflįµ£ tā²ā*rfl ā*āÆ) tātā² =
rflįµ£ (trans-ā (conv-ā tātā² (subset* (_āØId_.ā*Id ā©A))) tā²ā*rfl) ā*āÆ
sourceRedSubstTerm (ne record{}) ()
sourceRedSubstTerm (Emptyįµ£ _) ()
opaque
targetRedSubstTerm :
([A] : ts Ā» Π⨠A) ā
t Ā® vā² ā· A / [A] ā
vs T.⢠v ā vā² ā
t Ā® v ā· A / [A]
targetRedSubstTerm (Levelįµ£ _) (U/Levelįµ£ ā*āÆ) vāvā² =
U/Levelįµ£ (T.trans vāvā² āā ā*āÆ)
targetRedSubstTerm (Uįµ£ _) (U/Levelįµ£ ā*āÆ) vāvā² =
U/Levelįµ£ (T.trans vāvā² āā ā*āÆ)
targetRedSubstTerm (LiftᵣⲠ_ ā©A) tĀ®vā² vāvā² =
targetRedSubstTerm ā©A tĀ®vā² vāvā²
targetRedSubstTerm (āįµ£ x) (zeroįµ£ tā²āzero vā²āzero) vāvā² = zeroįµ£ tā²āzero (trans vāvā² vā²āzero)
targetRedSubstTerm (āįµ£ _) (sucįµ£ tā²āsuc vā²āsuc num tĀ®v) vāvā² =
sucįµ£ tā²āsuc (trans vāvā² vā²āsuc) num tĀ®v
targetRedSubstTerm (Unitįµ£ x) (starįµ£ xā vā²āstar) vāvā² = starįµ£ xā (trans vāvā² vā²āstar)
targetRedSubstTerm
(BᵣⲠBMĪ p q F G D [F] [G]) (vā²ā*lam , tĀ®v) vāvā²
with is-š? p | Ī£.map idį¶ (T.trans vāvā²) āā vā²ā*lam
... | yes PE.refl | vā*lam = vā*lam , Ī» ā¢a ā
targetRedSubstTerm ([G] ā¢a) (tĀ®v ā¢a) (app-šā²-subst vāvā²)
... | no pā¢š | vā*lam = vā*lam , Ī» ā¢a aĀ®w ā
targetRedSubstTerm ([G] ā¢a) (tĀ®v ā¢a aĀ®w) (app-subst vāvā²)
targetRedSubstTerm {A = A} {t = t} {v = v}
[Σ]@(BᵣⲠ(BMΣ _) p _ F G D [F] [G])
(tā , tā , tātā² , ā¢tā , vā , tāĀ®vā , extra) vāvā² =
tā , tā , tātā² , ā¢tā , vā , tāĀ®vā
, Ī£-Ā®-elim (Ī» _ ā Ī£-Ā® F [F] tā v vā p) extra
(Ī» vā²āvā ā Ī£-Ā®-intro-š (trans vāvā² vā²āvā))
(Ī» vā vā²āp tāĀ®vā ā Ī£-Ā®-intro-Ļ vā (trans vāvā² vā²āp) tāĀ®vā)
targetRedSubstTerm (Idįµ£ _) (rflįµ£ tā*rfl ā*āÆ) vāvā² =
rflįµ£ tā*rfl (T.trans vāvā² āā ā*āÆ)
targetRedSubstTerm (ne record{}) ()
targetRedSubstTerm (Emptyįµ£ _) ()
opaque
targetRedSubstTerm* :
([A] : ts Ā» Π⨠A) ā
t Ā® vā² ā· A / [A] ā
vs T.⢠v ā* vā² ā
t Ā® v ā· A / [A]
targetRedSubstTerm* [A] tĀ®vā² refl = tĀ®vā²
targetRedSubstTerm* [A] tĀ®vā² (trans x vāvā²) =
targetRedSubstTerm [A] (targetRedSubstTerm* [A] tĀ®vā² vāvā²) x
opaque
redSubstTerm :
([A] : ts Ā» Π⨠A) ā
tā² Ā® vā² ā· A / [A] ā
t ā tā² ā· A ā
vs T.⢠v ā vā² ā
t Ā® v ā· A / [A]
redSubstTerm [A] tā²Ā®vā² tātā² vāvā² =
targetRedSubstTerm [A] (sourceRedSubstTerm [A] tā²Ā®vā² tātā²) vāvā²
opaque
redSubstTerm* :
([A] : ts Ā» Π⨠A) ā
tā² Ā® vā² ā· A / [A] ā
t ā tā² ā· A ā
vs T.⢠v ā* vā² ā
t Ā® v ā· A / [A]
redSubstTerm* [A] tā²Ā®vā² tātā² vāvā² =
targetRedSubstTerm* [A] (sourceRedSubstTerm [A] tā²Ā®vā² tātā²) vāvā²
opaque
sourceRedSubstTermā² :
([A] : ts Ā» Π⨠A) ā
t Ā® v ā· A / [A] ā
t ā tā² ā· A ā
tā² Ā® v ā· A / [A]
sourceRedSubstTermā² (Levelįµ£ _) (U/Levelįµ£ ā*āÆ) _ =
U/Levelįµ£ ā*āÆ
sourceRedSubstTermā² (Uįµ£ _) (U/Levelįµ£ ā*āÆ) _ =
U/Levelįµ£ ā*āÆ
sourceRedSubstTermā² (LiftᵣⲠā*Lift ā©A) tĀ®v tātā² =
sourceRedSubstTermā² ā©A tĀ®v (lower-ā (conv-ā tātā² (subset* ā*Lift)))
sourceRedSubstTermā² (āįµ£ D) (zeroįµ£ tāzero vāzero) tātā²
with whnf-ā tāzero zeroā (conv-ā tātā² (subset* D))
... | tā²āzero = zeroįµ£ tā²āzero vāzero
sourceRedSubstTermā² (āįµ£ D) (sucįµ£ tāsuc vāsuc num tĀ®v) tātā²
with whnf-ā tāsuc sucā (conv-ā tātā² (subset* D))
... | tā²āsuc = sucįµ£ tā²āsuc vāsuc num tĀ®v
sourceRedSubstTermā² (Unitįµ£ x) (starįµ£ tāstar vāstar) tātā²
with whnf-ā tāstar starā (conv-ā tātā² (subset* x))
... | tā²āstar = starįµ£ tā²āstar vāstar
sourceRedSubstTermā²
(BᵣⲠBMĪ p q F G D [F] [G]) tĀ®v tātā²
with is-š? p
... | yes PE.refl = tĀ®v .projā , Ī» ā¢a ā
sourceRedSubstTermā² ([G] ā¢a) (tĀ®v .projā ā¢a)
(app-ā (conv-ā tātā² (subset* D)) ā¢a)
... | no pā¢š = tĀ®v .projā , Ī» {a = a} ā¢a aĀ®w ā
sourceRedSubstTermā² ([G] ā¢a) (tĀ®v .projā ā¢a aĀ®w)
(app-ā (conv-ā tātā² (subset* D)) ā¢a)
sourceRedSubstTermā²
(BᵣⲠ(BMΣ _) _ _ F G D [F] [G])
(tā , tā , tāp , ā¢tā , vā , tāĀ®vā , extra) tātā² =
tā , tā
, whnf-ā tāp prodā (conv-ā tātā² (subset* D))
, ā¢tā , vā , tāĀ®vā , extra
sourceRedSubstTermā² (Idįµ£ ā©A) (rflįµ£ tā*rfl ā*āÆ) tātā² =
rflįµ£ (whnf-ā tā*rfl rflā (conv-ā tātā² (subset* (_āØId_.ā*Id ā©A)))) ā*āÆ
sourceRedSubstTermā² (ne record{}) ()
sourceRedSubstTermā² (Emptyįµ£ _) ()
private opaque
Ī -lemma :
vs T.⢠v ā vā² ā
(ā Ī» vā³ ā vs T.⢠v ā* T.lam vā³) ā
(ā Ī» vā³ ā vs T.⢠vā² ā* T.lam vā³)
Ī -lemma vāvā² (_ , vā*lam)
with red*Det vā*lam (T.trans vāvā² T.refl)
⦠| injā lamā*vā² rewrite Valueāā*āā” T.lam lamā*vā² = _ , T.refl
⦠| injā vā²ā*lam = _ , vā²ā*lam
ā*āÆāāāā*⯠:
(str PE.ā” strict ā vs T.⢠v ā* āÆ) ā vs T.⢠v ā vā² ā
str PE.ā” strict ā vs T.⢠vā² ā* āÆ
ā*āÆāāāā*⯠{vā²} vā*⯠vāvā² ā”strict =
case red*Det (vā*⯠ā”strict) (T.trans vāvā² T.refl) of Ī» where
(injā vā²ā*āÆ) ā vā²ā*āÆ
(injā āÆā*vā²) ā
vā² ā”⨠āÆ-noRed āÆā*vā² ā©ā
⯠āā
opaque
targetRedSubstTerm*ā² :
([A] : ts Ā» Π⨠A) ā t Ā® v ā· A / [A] ā
vs T.⢠v ā* vā² ā t Ā® vā² ā· A / [A]
targetRedSubstTermā² : ([A] : ts Ā» Π⨠A) ā t Ā® v ā· A / [A]
ā vs T.⢠v ā vā² ā t Ā® vā² ā· A / [A]
targetRedSubstTermā² (Levelįµ£ _) (U/Levelįµ£ vā*āÆ) vāvā² =
U/Levelįµ£ (ā*āÆāāāā*⯠vā*⯠vāvā²)
targetRedSubstTermā² (Uįµ£ _) (U/Levelįµ£ vā*āÆ) vāvā² =
U/Levelįµ£ (ā*āÆāāāā*⯠vā*⯠vāvā²)
targetRedSubstTermā² (LiftᵣⲠ_ ā©A) tĀ®v vāvā² =
targetRedSubstTermā² ā©A tĀ®v vāvā²
targetRedSubstTermā² (āįµ£ x) (zeroįµ£ xā vāzero) vāvā² with red*Det vāzero (T.trans vāvā² T.refl)
... | injā xā rewrite zero-noRed xā = zeroįµ£ xā T.refl
... | injā xā = zeroįµ£ xā xā
targetRedSubstTermā² (āįµ£ _) (sucįµ£ tāsuc vāsuc num tĀ®v) vāvā²
with red*Det vāsuc (T.trans vāvā² T.refl)
... | injā sucā* rewrite suc-noRed sucā* = sucįµ£ tāsuc T.refl num tĀ®v
... | injā ā*suc = sucįµ£ tāsuc ā*suc num tĀ®v
targetRedSubstTermā² (Unitįµ£ x) (starįµ£ xā vāstar) vāvā² with red*Det vāstar (T.trans vāvā² T.refl)
... | injā xā rewrite star-noRed xā = starįµ£ xā T.refl
... | injā xā = starįµ£ xā xā
targetRedSubstTermā²
(BᵣⲠBMĪ p q F G D [F] [G]) tĀ®v vāvā²
with is-š? p
... | yes PE.refl = Ī -lemma vāvā² āā tĀ®v .projā , Ī» ā¢a ā
targetRedSubstTermā² ([G] ā¢a) (tĀ®v .projā ā¢a) (app-šā²-subst vāvā²)
... | no pā¢š = Ī -lemma vāvā² āā tĀ®v .projā , Ī» ā¢a aĀ®w ā
targetRedSubstTermā² ([G] ā¢a) (tĀ®v .projā ā¢a aĀ®w) (T.app-subst vāvā²)
targetRedSubstTermā²
{vā² = vā²}
(BᵣⲠ(BMΣ _) p _ F G D [F] [G])
(tā , tā , tātā² , ā¢tā , vā , tāĀ®vā , extra) vāvā² =
let [Gtā] = [G] ā¢tā
in tā , tā , tātā² , ā¢tā
, Σ-®-elim
(Ī» _ ā ā Ī» vā ā (tā Ā® vā ā· G U.[ tā ]ā / [Gtā])
à Σ-Ā® F _ tā vā² vā p)
extra
(Ī» vāvā pā”š ā case red*Det vāvā (trans vāvā² refl) of Ī» where
(injā vāāvā²) ā vā² , targetRedSubstTerm*ā² [Gtā] tāĀ®vā vāāvā²
, Ī£-Ā®-intro-š refl pā”š
(injā vā²āvā) ā vā , tāĀ®vā , Ī£-Ā®-intro-š vā²āvā pā”š)
Ī» vā vāp tāĀ®vā pā¢š ā vā , tāĀ®vā , (case red*Det vāp (trans vāvā² refl) of Ī» where
(injā pāvā²) ā case prod-noRed pāvā² of Ī» where
PE.refl ā Ī£-Ā®-intro-Ļ vā refl tāĀ®vā pā¢š
(injā vā²āp) ā Ī£-Ā®-intro-Ļ vā vā²āp tāĀ®vā pā¢š)
targetRedSubstTermā² (Idįµ£ _) (rflįµ£ tā*rfl vā*āÆ) vāvā² =
rflįµ£ tā*rfl (ā*āÆāāāā*⯠vā*⯠vāvā²)
targetRedSubstTermā² (ne record{}) ()
targetRedSubstTermā² (Emptyįµ£ _) ()
targetRedSubstTerm*Ⲡ[A] t®v refl = t®v
targetRedSubstTerm*ā² [A] tĀ®v (trans x vāvā²) =
targetRedSubstTerm*ā² [A] (targetRedSubstTermā² [A] tĀ®v x) vāvā²
opaque
redSubstTermā² :
([A] : ts Ā» Π⨠A) ā
t Ā® v ā· A / [A] ā
t ā tā² ā· A ā
vs T.⢠v ā vā² ā
tā² Ā® vā² ā· A / [A]
redSubstTermā² [A] tĀ®v tātā² vāvā² =
targetRedSubstTermā² [A] (sourceRedSubstTermā² [A] tĀ®v tātā²) vāvā²
opaque
redSubstTerm*ā² :
([A] : ts Ā» Π⨠A) ā
t Ā® v ā· A / [A] ā
t ā tā² ā· A ā
vs T.⢠v ā* vā² ā
tā² Ā® vā² ā· A / [A]
redSubstTerm*ā² [A] tĀ®v tātā² vāvā² =
targetRedSubstTerm*ā² [A] (sourceRedSubstTermā² [A] tĀ®v tātā²) vāvā²