open import Definition.Typed.Restrictions
open import Graded.Modality
module Definition.Conversion.Transitivity
{a} {M : Set a}
{š : Modality M}
(R : Type-restrictions š)
(open Type-restrictions R)
⦠no-equality-reflection : No-equality-reflection ā¦
where
open import Definition.Untyped M
open import Definition.Untyped.Neutral M type-variant
open import Definition.Untyped.Properties M
open import Definition.Untyped.Properties.Neutral M type-variant
open import Definition.Typed R
open import Definition.Typed.EqRelInstance R
open import Definition.Typed.EqualityRelation.Instance R
open import Definition.Typed.Inversion R
open import Definition.Typed.Properties R
open import Definition.Typed.Stability R
open import Definition.Typed.Substitution R
open import Definition.Typed.Syntactic R
open import Definition.Conversion R
open import Definition.Conversion.Inversion R
open import Definition.Conversion.Soundness R
open import Definition.Conversion.Stability R
open import Definition.Conversion.Whnf R
open import Definition.Conversion.Conversion R
open import Definition.Typed.Consequences.Injectivity R
import Definition.Typed.Consequences.Inequality R as WF
open import Definition.Typed.Consequences.NeTypeEq R
open import Tools.Function
open import Tools.Nat
open import Tools.Product
open import Tools.Empty
import Tools.PropositionalEquality as PE
open import Tools.Sum using (injā; injā)
private
variable
n : Nat
Ī Ī : Con Term n
A t u v : Term _
mutual
trans~ā : ā {t u v A B}
ā Π⢠t ~ u ā A
ā Π⢠u ~ v ā B
ā Π⢠t ~ v ā A
à Π⢠A ┠B
trans~ā (var-refl xā xā”y) (var-refl xā xā”yā) =
var-refl xā (PE.trans xā”y xā”yā)
, neTypeEq (var _) xā
(PE.subst (Ī» x ā _ ⢠var x ā· _) (PE.sym xā”y)
xā)
trans~ā (app-cong t~u a<>b) (app-cong u~v b<>c) =
let t~v , Ī FGā”Ī Fā²Gā² = trans~ā t~u u~v
Fā”Fā , Gā”Gā , pā”pā , _ = ΠΣ-injectivity Ī FGā”Ī Fā²Gā²
a<>c = transConvāTerm Fā”Fā a<>b b<>c
in app-cong t~v a<>c , Gā”Gā (soundnessConvāTerm a<>b)
trans~ā (fst-cong t~u) (fst-cong u~v) =
let t~v , Ī£FGā”Ī£Fā²Gā² = trans~ā t~u u~v
Fā”Fā² , _ , _ = ΠΣ-injectivity Ī£FGā”Ī£Fā²Gā²
in fst-cong t~v , Fā”Fā²
trans~ā (snd-cong t~u) (snd-cong u~v) =
let t~v , Ī£FGā”Ī£Fā²Gā² = trans~ā t~u u~v
Fā”Fā² , Gā”Gā² , _ = ΠΣ-injectivity Ī£FGā”Ī£Fā²Gā²
in snd-cong t~v , Gā”Gā² (soundness~ā (fst-cong t~u))
trans~ā (natrec-cong A<>B aā<>bā aā<>bā t~u)
(natrec-cong B<>C bā<>cā bā<>cā u~v) =
let ā¢Ī = wf (projā (syntacticEqTerm (soundness~ā t~u)))
Aā”B = soundnessConvā A<>B
F[0]ā”Fā[0] = substTypeEq Aā”B (refl (zeroā±¼ ā¢Ī))
Fā̲ā”Fāā² = sucCong Aā”B
A<>C = transConvā A<>B B<>C
aā<>cā = transConvāTerm F[0]ā”Fā[0] aā<>bā bā<>cā
aā<>cā = transConvāTerm Fā̲ā”Fāā² aā<>bā
(stabilityConvāTerm (refl-ā (sym Aā”B)) bā<>cā)
t~v , _ = trans~ā t~u u~v
in natrec-cong A<>C aā<>cā aā<>cā t~v
, substTypeEq Aā”B (soundness~ā t~u)
trans~ā {Ī = Ī} (prodrec-cong {F = F} {G} A<>B a~b t<>u)
(prodrec-cong B<>C b~c u<>v) =
let a~c , Ī£ā”ΣⲠ= trans~ā a~b b~c
ā¢Ī = wfEq Ī£ā”Ī£ā²
Fā”Fā² , Gā”Gā² , _ =
ΠΣ-injectivity-no-equality-reflection (sym Ī£ā”Ī£ā²)
_ , ā¢F = syntacticEq Fā”Fā²
_ , ā¢G = syntacticEq Gā”Gā²
ā¢G = stability (refl-ā Fā”Fā²) ā¢G
B<>Cā² = stabilityConvā (refl-ā (sym Ī£ā”Ī£ā²)) B<>C
A<>C = transConvā A<>B B<>Cā²
u<>vā² = stabilityConvāTerm (refl-ā Fā”Fā² ā Gā”Gā²) u<>v
_ , ā¢ĪFG , _ = contextConvSubst (refl-ā Fā”Fā² ā Gā”Gā²)
Aā”B = soundnessConvā A<>B
Aāā”Bā = substā²TypeEq-prod Aā”B
t<>v = transConvāTerm Aāā”Bā t<>u u<>vā²
aā”b = soundness~ā a~b
Aaā”Bb = substTypeEq Aā”B aā”b
in prodrec-cong A<>C a~c t<>v , Aaā”Bb
trans~ā (emptyrec-cong A<>B t~u) (emptyrec-cong B<>C u~v) =
let Aā”B = soundnessConvā A<>B
A<>C = transConvā A<>B B<>C
t~v , _ = trans~ā t~u u~v
in emptyrec-cong A<>C t~v , Aā”B
trans~ā (unitrec-cong A<>B k~l u<>v no-Ī·)
(unitrec-cong B<>C l~m v<>w _) =
let A<>C = transConvā A<>B B<>C
k~m , ā¢Unitā”Unit = trans~ā k~l l~m
ā¢Unit = projā (syntacticEq ā¢Unitā”Unit)
ok = inversion-Unit ā¢Unit
ā¢Ī = wf ā¢Unit
Aā”B = soundnessConvā A<>B
Aāā”Bā = substTypeEq Aā”B (refl (starā±¼ ā¢Ī ok))
Akā”Bl = substTypeEq Aā”B (soundness~ā k~l)
u<>w = transConvāTerm Aāā”Bā u<>v v<>w
in unitrec-cong A<>C k~m u<>w no-Ī· , Akā”Bl
trans~ā (J-cong Aāā”Aā tāā”tā Bāā”Bā uāā”uā vāā”vā wā~wā Cāā”Id-tā-vā)
(J-cong Aāā”Aā tāā”tā Bāā”Bā uāā”uā vāā”vā wā~wā _) =
case soundnessConvā Aāā”Aā of Ī» {
ā¢Aāā”Aā ā
case soundnessConvā Bāā”Bā of Ī» {
ā¢Bāā”Bā ā
case soundnessConvāTerm tāā”tā of Ī» {
ā¢tāā”tā ā
J-cong (transConvā Aāā”Aā Aāā”Aā)
(transConvāTerm ā¢Aāā”Aā tāā”tā tāā”tā)
(transConvā Bāā”Bā
(stabilityConvā
(symConEq (J-motive-context-congā² ā¢Aāā”Aā ā¢tāā”tā)) Bāā”Bā))
(transConvāTerm (J-motive-rfl-cong ā¢Bāā”Bā ā¢tāā”tā) uāā”uā uāā”uā)
(transConvāTerm ā¢Aāā”Aā vāā”vā vāā”vā) (trans~ā wā~wā wā~wā .projā)
Cāā”Id-tā-vā
, J-result-cong ā¢Bāā”Bā (soundnessConvāTerm vāā”vā)
(conv (soundness~ā wā~wā) Cāā”Id-tā-vā) }}}
trans~ā (K-cong Aāā”Aā tāā”tā Bāā”Bā uāā”uā vā~vā Cāā”Id-tā-tā ok)
(K-cong Aāā”Aā tāā”tā Bāā”Bā uāā”uā vā~vā _ _) =
case soundnessConvā Aāā”Aā of Ī» {
ā¢Aāā”Aā ā
case soundnessConvā Bāā”Bā of Ī» {
ā¢Bāā”Bā ā
K-cong (transConvā Aāā”Aā Aāā”Aā)
(transConvāTerm ā¢Aāā”Aā tāā”tā tāā”tā)
(transConvā Bāā”Bā
(stabilityConvā
(symConEq $
K-motive-context-congā² ā¢Aāā”Aā (soundnessConvāTerm tāā”tā))
Bāā”Bā))
(transConvāTerm (K-motive-rfl-cong ā¢Bāā”Bā) uāā”uā uāā”uā)
(trans~ā vā~vā vā~vā .projā) Cāā”Id-tā-tā ok
, substTypeEq ā¢Bāā”Bā (conv (soundness~ā vā~vā) Cāā”Id-tā-tā) }}
trans~ā ([]-cong-cong Aāā”Aā tāā”tā uāā”uā vā~vā Bāā”Id-tā-uā ok)
([]-cong-cong Aāā”Aā tāā”tā uāā”uā vā~vā _ _) =
case soundnessConvā Aāā”Aā of Ī» {
ā¢Aāā”Aā ā
case []-congāErased ok of Ī» {
Erased-ok ā
[]-cong-cong (transConvā Aāā”Aā Aāā”Aā)
(transConvāTerm ā¢Aāā”Aā tāā”tā tāā”tā)
(transConvāTerm ā¢Aāā”Aā uāā”uā uāā”uā)
(trans~ā vā~vā vā~vā .projā) Bāā”Id-tā-uā ok
, Id-cong (Erased-cong Erased-ok ā¢Aāā”Aā)
([]-congā² Erased-ok (soundnessConvāTerm tāā”tā))
([]-congā² Erased-ok (soundnessConvāTerm uāā”uā)) }}
trans~ā : ā {t u v A B}
ā Π⢠t ~ u ā A
ā Π⢠u ~ v ā B
ā Π⢠t ~ v ā A
à Π⢠A ┠B
trans~ā ([~] Aā Dā²@(D , _) k~l) ([~] Aā (Dā , _) k~lā) =
let t~v , Aā”B = trans~ā k~l k~lā
in [~] Aā Dā² t~v
, trans (sym (subset* D))
(trans Aā”B
(subset* Dā))
transConvā : ā {A B C}
ā Π⢠A [convā] B
ā Π⢠B [convā] C
ā Π⢠A [convā] C
transConvā ([ā] Aā² Bā² D Dā² Aā²<>Bā²)
([ā] Aā³ Bā³ Dā Dā³ Aā²<>Bā³) =
[ā] Aā² Bā³ D Dā³
(transConvā Aā²<>Bā²
(PE.subst (Ī» x ā _ ⢠x [convā] Bā³)
(whrDet* Dā Dā²) Aā²<>Bā³))
transConvāā² : ā {A B C}
ā ⢠Π┠Ī
ā Π⢠A [convā] B
ā Π⢠B [convā] C
ā Π⢠A [convā] C
transConvāā² Īā”Ī aConvB bConvC =
transConvā aConvB (stabilityConvā (symConEq Īā”Ī) bConvC)
transConvā : ā {A B C}
ā Π⢠A [convā] B
ā Π⢠B [convā] C
ā Π⢠A [convā] C
transConvā (ne A~B) Bā”C =
case inv-[convā]-neā² Bā”C of Ī» where
(injā (_ , B~C)) ā ne (trans~ā A~B B~C .projā)
(injā (¬-B-ne , _)) ā
let _ , _ , B-ne = ne~ā A~B in
ā„-elim (¬-B-ne B-ne)
transConvā Uā”U@(U-refl _) Uā”C =
case inv-[convā]-Uā² Uā”C of Ī» where
(injā (_ , PE.refl , PE.refl)) ā Uā”U
(injā (Uā¢U , _)) ā ā„-elim (Uā¢U (_ , PE.refl))
transConvā (ΠΣ-cong Aāā”Bā Aāā”Bā ok) ΠΣā”C =
case inv-[convā]-ΠΣⲠΠΣā”C of Ī» where
(injā
(_ , _ , _ , _ , _ , _ , _ ,
PE.refl , PE.refl , Bāā”Cā , Bāā”Cā)) ā
ΠΣ-cong (transConvā Aāā”Bā Bāā”Cā)
(transConvāā² (refl-ā (soundnessConvā Aāā”Bā)) Aāā”Bā Bāā”Cā) ok
(injā (ΠΣā¢Ī Ī£ , _)) ā
ā„-elim (ΠΣā¢Ī Ī£ (_ , _ , _ , _ , _ , PE.refl))
transConvā Emptyā”Empty@(Empty-refl _) Emptyā”C =
case inv-[convā]-Emptyā² Emptyā”C of Ī» where
(injā (PE.refl , PE.refl)) ā Emptyā”Empty
(injā (Emptyā¢Empty , _)) ā ā„-elim (Emptyā¢Empty PE.refl)
transConvā Unitā”Unit@(Unit-refl _ _) Unitā”C =
case inv-[convā]-Unitā² Unitā”C of Ī» where
(injā (_ , _ , PE.refl , PE.refl)) ā Unitā”Unit
(injā (Unitā¢Unit , _)) ā
ā„-elim (Unitā¢Unit (_ , _ , PE.refl))
transConvā āā”ā@(ā-refl _) āā”C =
case inv-[convā]-āā² āā”C of Ī» where
(injā (PE.refl , PE.refl)) ā āā”ā
(injā (āā¢ā , _)) ā ā„-elim (āā¢ā PE.refl)
transConvā (Id-cong Aā”B tāā”uā tāā”uā) Idā”C =
case inv-[convā]-Idā² Idā”C of Ī» where
(injā
(_ , _ , _ , _ , _ , _ ,
PE.refl , PE.refl , Bā”C , uāā”vā , uāā”vā)) ā
let ā¢Aā”B = soundnessConvā Aā”B in
Id-cong (transConvā Aā”B Bā”C) (transConvāTerm ā¢Aā”B tāā”uā uāā”vā)
(transConvāTerm ā¢Aā”B tāā”uā uāā”vā)
(injā (Idā¢Id , _)) ā
ā„-elim (Idā¢Id (_ , _ , _ , PE.refl))
transConvāTerm : ā {t u v A B}
ā Π⢠A ā” B
ā Π⢠t [convā] u ā· A
ā Π⢠u [convā] v ā· B
ā Π⢠t [convā] v ā· A
transConvāTerm Aā”B ([ā]ā Bā tā² uā² D d dā² t<>u)
([ā]ā Bā tā³ uā³ Dā dā dā³ t<>uā) =
let Bāā”Bā = trans (sym (subset* (D .projā)))
(trans Aā”B
(subset* (Dā .projā)))
dāā³ = convāā· dā³ (sym Bāā”Bā)
dāā² = convāā· dā² Bāā”Bā
in [ā]ā Bā tā² uā³ D d dāā³
(transConvāTerm t<>u
(convConvāTerm (sym Bāā”Bā) (whnfConvāTerm t<>u .projā) $
PE.subst (_ ā¢_[convā] _ ā· _) (whrDet*Term dā dāā²) t<>uā))
transConvāTerm :
Π⢠t [convā] u ā· A ā
Π⢠u [convā] v ā· A ā
Π⢠t [convā] v ā· A
transConvāTerm (ne-ins ā¢t _ A-ne t~u) uā”v =
let _ , u~v = inv-[convā]ā·-ne A-ne uā”v
_ , _ , ā¢v = syntacticEqTerm (soundnessConvāTerm uā”v)
in
ne-ins ā¢t ā¢v A-ne (trans~ā t~u u~v .projā)
transConvāTerm (univ ā¢A ā¢B Aā”B) Bā”C =
let _ , _ , ā¢C = syntacticEqTerm (soundnessConvāTerm Bā”C) in
univ ā¢A ā¢C (transConvā Aā”B (inv-[convā]ā·-U Bā”C))
transConvāTerm (Ī·-eq ā¢t ā¢u t-fun u-fun t0ā”u0) uā”v =
let _ , v-fun , u0ā”v0 = inv-[convā]ā·-Ī uā”v
_ , _ , ā¢v = syntacticEqTerm (soundnessConvāTerm uā”v)
in
Ī·-eq ā¢t ā¢v t-fun v-fun (transConvTerm t0ā”u0 u0ā”v0)
transConvāTerm (Ī£-Ī· ā¢t _ t-prod _ fst-tā”fst-u snd-tā”snd-u) uā”v =
let _ , v-prod , fst-uā”fst-v , snd-uā”snd-v = inv-[convā]ā·-Σˢ uā”v
ā¢Ī£ , _ , ā¢v = syntacticEqTerm (soundnessConvāTerm uā”v)
_ , ā¢B , _ = inversion-ΠΣ ā¢Ī£
in
Ī£-Ī· ā¢t ā¢v t-prod v-prod (transConvTerm fst-tā”fst-u fst-uā”fst-v)
(transConvāTerm
(substTypeEq (refl ā¢B) (soundnessConvāTerm fst-tā”fst-u))
snd-tā”snd-u snd-uā”snd-v)
transConvāTerm (Σʷ-ins ā¢t _ t~u) uā”v =
let _ , _ , ā¢v = syntacticEqTerm (soundnessConvāTerm uā”v) in
case inv-[convā]ā·-Σʷ uā”v of Ī» where
(injā (_ , _ , _ , _ , u~v)) ā
Σʷ-ins ā¢t ā¢v (trans~ā t~u u~v .projā)
(injā (_ , _ , _ , _ , PE.refl , _)) ā
ā„-elim $ ¬-Neutral-prod $ ne~ā t~u .projā .projā
transConvāTerm (prod-cong ā¢B tāā”uā tāā”uā ok) uā”v =
let _ , _ , ā¢v = syntacticEqTerm (soundnessConvāTerm uā”v) in
case inv-[convā]ā·-Σʷ uā”v of Ī» where
(injā (_ , _ , _ , _ , u~v)) ā
ā„-elim $ ¬-Neutral-prod $ ne~ā u~v .projā .projā
(injā (_ , _ , _ , _ , uā”prod , PE.refl , uāā”vā , uāā”vā)) ā
case prod-PE-injectivity uā”prod of Ī» {
(_ , _ , PE.refl , PE.refl) ā
prod-cong ā¢B (transConvTerm tāā”uā uāā”vā)
(transConvāTerm
(substTypeEq (refl ā¢B) (soundnessConvāTerm tāā”uā))
tāā”uā uāā”vā)
ok }
transConvāTerm (Empty-ins t~u) uā”v =
Empty-ins (trans~ā t~u (inv-[convā]ā·-Empty uā”v) .projā)
transConvāTerm (Ī·-unit ā¢t _ t-whnf _ Ī·) uā”v =
let _ , _ , ā¢v = syntacticEqTerm (soundnessConvāTerm uā”v) in
case inv-[convā]ā·-Unit uā”v of Ī» where
(injā (_ , _ , v-whnf)) ā Ī·-unit ā¢t ā¢v t-whnf v-whnf Ī·
(injā (no-Ī· , _)) ā ā„-elim (no-Ī· Ī·)
transConvāTerm (UnitŹ·-ins no-Ī· t~u) uā”v =
case inv-[convā]ā·-UnitŹ· uā”v of Ī» where
(injā (_ , injā u~v)) ā
UnitŹ·-ins no-Ī· (trans~ā t~u u~v .projā)
(injā (_ , injā (PE.refl , _))) ā
ā„-elim $ ¬-Neutral-star $ ne~ā t~u .projā .projā
(injā (Ī· , _)) ā
ā„-elim (no-Ī· Ī·)
transConvāTerm (starŹ·-refl _ _ no-Ī·) uā”v =
case inv-[convā]ā·-UnitŹ· uā”v of Ī» where
(injā (_ , injā u~v)) ā
ā„-elim $ ¬-Neutral-star $ ne~ā u~v .projā .projā
(injā (_ , injā (_ , PE.refl))) ā
uā”v
(injā (Ī· , _)) ā
ā„-elim (no-Ī· Ī·)
transConvāTerm (ā-ins t~u) uā”v =
case inv-[convā]ā·-ā uā”v of Ī» where
(injā u~v) ā
ā-ins (trans~ā t~u u~v .projā)
(injā (injā (PE.refl , _))) ā
ā„-elim $ ¬-Neutral-zero $ ne~ā t~u .projā .projā
(injā (injā (_ , _ , PE.refl , _))) ā
ā„-elim $ ¬-Neutral-suc $ ne~ā t~u .projā .projā
transConvāTerm (zero-refl _) uā”v =
case inv-[convā]ā·-ā uā”v of Ī» where
(injā u~v) ā
ā„-elim $ ¬-Neutral-zero $ ne~ā u~v .projā .projā
(injā (injā (_ , PE.refl))) ā
uā”v
(injā (injā (_ , _ , () , _)))
transConvāTerm (suc-cong tā”u) uā”v =
case inv-[convā]ā·-ā uā”v of Ī» where
(injā u~v) ā
ā„-elim $ ¬-Neutral-suc $ ne~ā u~v .projā .projā
(injā (injā (() , _)))
(injā (injā (_ , _ , PE.refl , PE.refl , uā”v))) ā
suc-cong (transConvTerm tā”u uā”v)
transConvāTerm (Id-ins ā¢t t~u) uā”v =
case inv-[convā]ā·-Id uā”v of Ī» where
(injā (_ , _ , _ , u~v)) ā
Id-ins ā¢t (trans~ā t~u u~v .projā)
(injā (PE.refl , _)) ā
ā„-elim $ ¬-Neutral-rfl $ ne~ā t~u .projā .projā
transConvāTerm tā”u@(rfl-refl _) uā”v =
case inv-[convā]ā·-Id uā”v of Ī» where
(injā (_ , _ , _ , u~v)) ā
ā„-elim $ ¬-Neutral-rfl $ ne~ā u~v .projā .projā
(injā (_ , PE.refl , _)) ā
tā”u
transConvTerm :
Π⢠t [convā] u ā· A ā
Π⢠u [convā] v ā· A ā
Π⢠t [convā] v ā· A
transConvTerm t<>u u<>v =
let tā”u = soundnessConvāTerm t<>u
ā¢A , _ , _ = syntacticEqTerm tā”u
in transConvāTerm (refl ā¢A) t<>u u<>v
transConv : ā {A B C}
ā Π⢠A [convā] B
ā Π⢠B [convā] C
ā Π⢠A [convā] C
transConv A<>B B<>C = transConvā A<>B B<>C