open import Definition.Typed.Restrictions
open import Graded.Modality
module Definition.Conversion.Soundness
{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.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
import Definition.Typed.Reasoning.Term R as TmR
import Definition.Typed.Reasoning.Type R as TyR
open import Definition.Typed.Stability R
open import Definition.Typed.Syntactic R
open import Definition.Typed.Well-formed R
open import Definition.Conversion R
open import Definition.Conversion.Whnf R
open import Definition.Typed.Consequences.Injectivity R
open import Definition.Typed.Consequences.Reduction R
open import Definition.Typed.Consequences.NeTypeEq R
open import Tools.Function
open import Tools.Nat
open import Tools.Product
import Tools.PropositionalEquality as PE
private
variable
n : Nat
Ī : Con Term n
A B : Term _
lā lā : Universe-level
mutual
soundness~ā : ā {k l A} ā Π⢠k ~ l ā A ā Π⢠k ā” l ā· A
soundness~ā (var-refl x xā”y) = PE.subst (Ī» y ā _ ⢠_ ā” var y ā· _) xā”y (refl x)
soundness~ā (app-cong k~l xā) =
app-cong (soundness~ā k~l) (soundnessConvāTerm xā)
soundness~ā (fst-cong x) =
let pā” = soundness~ā x
ā¢Ī£FG = projā (syntacticEqTerm pā”)
_ , ā¢G , _ = inversion-ΠΣ ā¢Ī£FG
in fst-cong ā¢G pā”
soundness~ā (snd-cong x) =
let pā” = soundness~ā x
ā¢Ī£FG = projā (syntacticEqTerm pā”)
_ , ā¢G , _ = inversion-ΠΣ ā¢Ī£FG
in snd-cong ā¢G pā”
soundness~ā (natrec-cong xā xā xā k~l) =
let Fā”G = soundnessConvā xā in
natrec-cong Fā”G (soundnessConvāTerm xā) (soundnessConvāTerm xā)
(soundness~ā k~l)
soundness~ā (prodrec-cong x xā xā) =
let Cā”E = soundnessConvā x
gā”h = soundness~ā xā
uā”v = soundnessConvāTerm xā
_ , _ , ok = inversion-ΠΣ (projā (syntacticEqTerm gā”h))
in prodrec-cong Cā”E gā”h uā”v ok
soundness~ā (emptyrec-cong xā k~l) =
emptyrec-cong (soundnessConvā xā) (soundness~ā k~l)
soundness~ā (unitrec-cong x xā xā no-Ī·) =
let Fā”H = soundnessConvā x
kā”l = soundness~ā xā
uā”v = soundnessConvāTerm xā
ok = inversion-Unit (projā (syntacticEqTerm kā”l))
in unitrec-cong Fā”H kā”l uā”v ok no-Ī·
soundness~ā (J-cong Aāā”Aā tāā”tā Bāā”Bā uāā”uā vāā”vā wā~wā ā”Id) =
case soundnessConvā Aāā”Aā of Ī» {
Aāā”Aā ā
case soundnessConvāTerm tāā”tā of Ī» {
tāā”tā ā
J-cong Aāā”Aā
(syntacticEqTerm tāā”tā .projā .projā) tāā”tā (soundnessConvā Bāā”Bā)
(soundnessConvāTerm uāā”uā) (soundnessConvāTerm vāā”vā)
(conv (soundness~ā wā~wā) ā”Id) }}
soundness~ā (K-cong Aāā”Aā tāā”tā Bāā”Bā uāā”uā vā~vā ā”Id ok) =
K-cong (soundnessConvā Aāā”Aā) (soundnessConvāTerm tāā”tā)
(soundnessConvā Bāā”Bā) (soundnessConvāTerm uāā”uā)
(conv (soundness~ā vā~vā) ā”Id) ok
soundness~ā ([]-cong-cong Aāā”Aā tāā”tā uāā”uā vā~vā ā”Id ok) =
[]-cong-cong (soundnessConvā Aāā”Aā) (soundnessConvāTerm tāā”tā)
(soundnessConvāTerm uāā”uā) (conv (soundness~ā vā~vā) ā”Id) ok
soundness~ā : ā {k l A} ā Π⢠k ~ l ā A ā Π⢠k ā” l ā· A
soundness~ā ([~] Aā (D , _) k~l) = conv (soundness~ā k~l) (subset* D)
soundnessConvā : ā {A B} ā Π⢠A [convā] B ā Π⢠A ā” B
soundnessConvā ([ā] _ _ (D , _) (Dā² , _) Aā²<>Bā²) =
trans (subset* D) (trans (soundnessConvā Aā²<>Bā²) (sym (subset* Dā²)))
soundnessConvā : ā {A B} ā Π⢠A [convā] B ā Π⢠A ā” B
soundnessConvā (U-refl ā¢Ī) = refl (Uā±¼ ā¢Ī)
soundnessConvā (ā-refl ā¢Ī) = refl (āā±¼ ā¢Ī)
soundnessConvā (Empty-refl ā¢Ī) = refl (Emptyā±¼ ā¢Ī)
soundnessConvā (Unit-refl ā¢Ī ok) = refl (Unitā±¼ ā¢Ī ok)
soundnessConvā (ne x) = univ (soundness~ā x)
soundnessConvā (ΠΣ-cong Aāā”Aā Bāā”Bā ok) =
ΠΣ-cong (soundnessConvā Aāā”Aā) (soundnessConvā Bāā”Bā) ok
soundnessConvā (Id-cong Aāā”Aā tāā”tā uāā”uā) =
Id-cong (soundnessConvā Aāā”Aā) (soundnessConvāTerm tāā”tā)
(soundnessConvāTerm uāā”uā)
soundnessConvāTerm : ā {a b A} ā Π⢠a [convā] b ā· A ā Π⢠a ā” b ā· A
soundnessConvāTerm ([ā]ā B tā² uā² (D , _) (d , _) (dā² , _) t<>u) =
conv (trans (subset*Term d)
(trans (soundnessConvāTerm t<>u)
(symā² (subset*Term dā²))))
(sym (subset* D))
soundnessConvāTerm : ā {a b A} ā Π⢠a [convā] b ā· A ā Π⢠a ā” b ā· A
soundnessConvāTerm (ā-ins x) = soundness~ā x
soundnessConvāTerm (Empty-ins x) = soundness~ā x
soundnessConvāTerm (UnitŹ·-ins _ t~u) = soundness~ā t~u
soundnessConvāTerm (Σʷ-ins x xā xā) =
let aā”b = soundness~ā xā
_ , neA , _ = ne~ā xā
_ , ā¢a , _ = syntacticEqTerm aā”b
Ī£ā”ΣⲠ= neTypeEq neA x ā¢a
in conv aā”b (sym Ī£ā”Ī£ā²)
soundnessConvāTerm (ne-ins t u x xā) =
let _ , neA , _ = ne~ā xā
_ , tā·M , _ = syntacticEqTerm (soundness~ā xā)
Mā”A = neTypeEq neA tā·M t
in conv (soundness~ā xā) Mā”A
soundnessConvāTerm (univ ā¢A ā¢B Aā”B) =
soundnessConvā-U ā¢A ā¢B Aā”B .projā
soundnessConvāTerm (zero-refl ā¢Ī) = refl (zeroā±¼ ā¢Ī)
soundnessConvāTerm (starŹ·-refl ā¢Ī ok _) = refl (starā±¼ ā¢Ī ok)
soundnessConvāTerm (suc-cong c) = suc-cong (soundnessConvāTerm c)
soundnessConvāTerm (prod-cong xā xā xā ok) =
prod-cong xā (soundnessConvāTerm xā)
(soundnessConvāTerm xā) ok
soundnessConvāTerm (Ī·-eq x xā y yā c) =
Ī·-eqā² x xā (soundnessConvāTerm c)
soundnessConvāTerm (Ī£-Ī· ā¢p ā¢r pProd rProd fstConv sndConv) =
let fstā” = soundnessConvāTerm fstConv
sndā” = soundnessConvāTerm sndConv
in Ī£-Ī·ā² ā¢p ā¢r fstā” sndā”
soundnessConvāTerm (Ī·-unit [a] [b] aUnit bUnit ok) =
Ī·-unit [a] [b] ok
soundnessConvāTerm
{Ī} (Id-ins {vā} {t} {u} {A} {Aā²} {tā²} {uā²} ā¢vā vā~vā) =
case soundness~ā vā~vā of Ī» {
vāā”vā ā
conv vāā”vā
( $⨠syntacticEqTerm vāā”vā .projā .projā , ā¢vā ā©
Π⢠vā ā· Id Aā² tā² uⲠà Π⢠vā ā· Id A t u ā⨠uncurry (neTypeEq (ne~ā vā~vā .projā .projā)) ā©
Π⢠Id Aā² tā² uā² ā” Id A t u ā”) }
soundnessConvāTerm (rfl-refl tā”u) =
refl (rflⱼⲠtā”u)
soundnessConvā-U :
Π⢠A ā· U lā ā
Π⢠B ā· U lā ā
Π⢠A [convā] B ā
Π⢠A ā” B ā· U lā Ć lā PE.ā” lā
soundnessConvā-U {lā} {lā} ā¢A ā¢B (ne {l} A~B) =
let Aā”B = soundness~ā A~B
_ , A-ne , B-ne = ne~ā A~B
_ , ā¢Aā² , ā¢Bā² = syntacticEqTerm Aā”B
Uā”Uā = neTypeEq A-ne ā¢Aā² ā¢A
Uā”Uā = neTypeEq B-ne ā¢Bā² ā¢B
in
conv Aā”B Uā”Uā
, U-injectivity
(U lā ā”Ė⨠Uā”Uā ā©ā¢
U l ā”⨠Uā”Uā ā©ā¢ā
U lā ā)
where
open TyR
soundnessConvā-U {lā} {lā} ā¢Uā ā¢Uā (U-refl {l} _) =
refl ā¢Uā
, U-injectivity
(U lā ā”⨠inversion-U ā¢Uā ā©ā¢
U (1+ l) ā”Ė⨠inversion-U ā¢Uā ā©ā¢ā
U lā ā)
where
open TyR
soundnessConvā-U {lā} {lā} ā¢Ī Ī£AāAā ā¢Ī Ī£BāBā (ΠΣ-cong Aāā”Bā Aāā”Bā ok) =
let lā , lā , ā¢Aā , ā¢Aā , Uā”Uā , _ = inversion-ΠΣ-U ā¢Ī Ī£AāAā
lā
, lā , ā¢Bā , ā¢Bā , Uā”Uā , _ = inversion-ΠΣ-U ā¢Ī Ī£BāBā
Aāā”Bā , lāā”lā
= soundnessConvā-U ā¢Aā ā¢Bā Aāā”Bā
Aāā”Bā , lāā”lā =
soundnessConvā-U ā¢Aā
(stabilityTerm (refl-ā (sym (univ Aāā”Bā))) ā¢Bā) Aāā”Bā
in
conv (ΠΣ-cong Aāā”Bā Aāā”Bā ok) (sym Uā”Uā)
, U-injectivity
(U lā ā”⨠Uā”Uā ā©ā¢
U (lā āįµ lā) ā”⨠PE.cong U $ PE.congā _āįµ_ lāā”lā
lāā”lā ā©ā¢ā”
U (lā
āįµ lā) ā”Ė⨠Uā”Uā ā©ā¢ā
U lā ā)
where
open TyR
soundnessConvā-U {lā} {lā} ā¢Emptyā ā¢Emptyā (Empty-refl _) =
refl ā¢Emptyā
, U-injectivity
(U lā ā”⨠inversion-Empty ā¢Emptyā ā©ā¢
U 0 ā”Ė⨠inversion-Empty ā¢Emptyā ā©ā¢ā
U lā ā)
where
open TyR
soundnessConvā-U {lā} {lā} ā¢Unitā ā¢Unitā (Unit-refl {l} _ _) =
refl ā¢Unitā
, U-injectivity
(U lā ā”⨠inversion-Unit-U ā¢Unitā .projā ā©ā¢
U l ā”Ė⨠inversion-Unit-U ā¢Unitā .projā ā©ā¢ā
U lā ā)
where
open TyR
soundnessConvā-U {lā} {lā} ā¢āā ā¢āā (ā-refl _) =
refl ā¢āā
, U-injectivity
(U lā ā”⨠inversion-ā ā¢āā ā©ā¢
U 0 ā”Ė⨠inversion-ā ā¢āā ā©ā¢ā
U lā ā)
where
open TyR
soundnessConvā-U
{lā} {lā} ā¢IdAtātā ā¢IdBuāuā (Id-cong Aā”B tāā”uā tāā”uā) =
let lā , ā¢A , ā¢tā , ā¢tā , Uā”Uā = inversion-Id-U ā¢IdAtātā
lā , ā¢B , ā¢uā , ā¢uā , Uā”Uā = inversion-Id-U ā¢IdBuāuā
Aā”B , lāā”lā = soundnessConvā-U ā¢A ā¢B Aā”B
in
conv
(Id-cong Aā”B (soundnessConvāTerm tāā”uā)
(soundnessConvāTerm tāā”uā))
(sym Uā”Uā)
, U-injectivity
(U lā ā”⨠Uā”Uā ā©ā¢
U lā ā”⨠PE.cong U lāā”lā ā©ā¢ā”
U lā ā”Ė⨠Uā”Uā ā©ā¢ā
U lā ā)
where
open TyR
soundnessConvā-U :
Π⢠A ā· U lā ā Π⢠B ā· U lā ā Π⢠A [convā] B ā
Π⢠A ā” B ā· U lā Ć lā PE.ā” lā
soundnessConvā-U {A} {lā} {B} {lā} ā¢A ā¢B ([ā] Aā² Bā² AāAā² BāBā² Aā²ā”Bā²) =
let Aā³ , Aā³-type , Aā*Aā³ = red-U ā¢A
Bā³ , Bā³-type , Bā*Bā³ = red-U ā¢B
_ , _ , ā¢Aā³ = wf-ā¢ā”ā· (subset*Term Aā*Aā³)
_ , _ , ā¢Bā³ = wf-ā¢ā”ā· (subset*Term Bā*Bā³)
Aā²ā”Aā³ = whrDet* AāAā² (univ* Aā*Aā³ , typeWhnf Aā³-type)
Bā²ā”Bā³ = whrDet* BāBā² (univ* Bā*Bā³ , typeWhnf Bā³-type)
Aā²ā”Bā² , lāā”lā =
soundnessConvā-U (PE.subst (_ ā¢_ā· _) (PE.sym Aā²ā”Aā³) ā¢Aā³)
(PE.subst (_ ā¢_ā· _) (PE.sym Bā²ā”Bā³) ā¢Bā³) Aā²ā”Bā²
in
(A ā*⨠Aā*Aā³ ā©ā¢
Aā³ ā”Ė⨠Aā²ā”Aā³ ā©ā¢ā”
Aā² ā· U lā ā”⨠Aā²ā”Bā² ā©ā¢ā·
⨠PE.cong U lāā”lā ā©ā”ā”
Bā² ā· U lā ā”⨠Bā²ā”Bā³ ā©ā¢ā·ā”
Bā³ ā*⨠Bā*Bā³ ā©ā¢ā
B ā)
, lāā”lā
where
open TmR