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.Atomic M type-variant
open import Definition.Untyped.Sup R
open import Definition.Untyped.Whnf M type-variant
open import Definition.Typed R
open import Definition.Typed.EqRelInstance R using (eqRelInstance)
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.Conversion.Level 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.Bool
open import Tools.Function
open import Tools.List hiding (_ā·_)
open import Tools.Nat as N using (Nat)
open import Tools.Product
import Tools.PropositionalEquality as PE
private
variable
Ī : Cons _ _
A B lā lā : Term _
d : Bool
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~ā (defn-refl ā¢Ī± αā¦ā αā”β) =
PE.subst (Ī» β ā _ ⢠_ ā” defn β ā· _) αā”β (refl ā¢Ī±)
soundness~ā (lower-cong x) = lower-cong (soundness~ā 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 lāā”lā Aāā”Aā tāā”tā uāā”uā vā~vā ā”Id ok) =
[]-cong-cong (soundnessConvāLevel lāā”lā) (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)
soundness~ā· : ā {k l A} ā Π⢠k ~ l ā· A ā Π⢠k ā” l ā· A
soundness~ā· (ā Aā”B k~l) = conv (soundness~ā k~l) (sym Aā”B)
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ā (Level-refl ok ā¢Ī) = refl (LevelⱼⲠok ā¢Ī)
soundnessConvā (U-cong lāā”lā) =
U-cong-ā¢ā” (soundnessConvāLevel lāā”lā)
soundnessConvā (Lift-cong lāā”lā Fā”H) =
Lift-cong (soundnessConvāLevel lāā”lā) (soundnessConvā Fā”H)
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āLevel : Π⢠lā [convā] lā ā·Level ā Π⢠lā ā” lā ā·Level
soundnessConvāLevel (literal! not-ok ā¢Ī l-lit) =
literal not-ok ā¢Ī l-lit
soundnessConvāLevel (term ok lāā”lā) =
term ok (soundnessConvāTerm lāā”lā)
soundnessConvāTerm : ā {a b A} ā Π⢠a [convā] b ā· A ā Π⢠a ā” b ā· A
soundnessConvāTerm (Level-ins x) = soundnessConvāLevel x
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 (neā» 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 (neā» 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 (Lift-Ī· x xā xā xā xā) =
Lift-Ī·ā² x xā (soundnessConvāTerm xā)
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] _ _ Ī·) =
Ī·-unit [a] [b] Ī·
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ā» (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ā ā” lā ā·Level
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 (neā» A-ne) ā¢Aā² ā¢A
Uā”Uā = neTypeEq (neā» 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ā} ā¢Levelā ā¢Levelā (Level-refl _ _) =
refl ā¢Levelā
, U-injectivity
(U lā ā”⨠inversion-Level ā¢Levelā .projā ā©ā¢
U zeroįµ ā”Ė⨠inversion-Level ā¢Levelā .projā ā©ā¢ā
U lā ā)
where
open TyR
soundnessConvā-U
{lā} {lā} ā¢Uā ā¢Uā (U-cong {lā = lā} {lā = lā} lāā”lā) =
let lāā”lā = soundnessConvāLevel lāā”lā
Uā”Uā = inversion-U ā¢Uā
Uā”Uā = inversion-U ā¢Uā
in
conv (U-cong-ā¢ā”ā· lāā”lā) (sym Uā”Uā)
, U-injectivity
(U lā ā”⨠inversion-U ā¢Uā ā©ā¢
U (sucįµ lā) ā”⨠U-cong-ā¢ā” (sucįµ-cong-ā¢ā”ā·L lāā”lā) ā©ā¢
U (sucįµ lā) ā”Ė⨠inversion-U ā¢Uā ā©ā¢ā
U lā ā)
where
open TyR
soundnessConvā-U {lā} {lā} ā¢Liftā ā¢Liftā (Lift-cong {lā = lā} {lā = lā} lāā”lā Fā”H) =
let kā , _ , ā¢F , Uāā” = inversion-Liftā· ā¢Liftā
kā , _ , ā¢H , Uāā” = inversion-Liftā· ā¢Liftā
lāā”lā = soundnessConvāLevel lāā”lā
Fā”H , kāā”kā = soundnessConvā-U ā¢F ā¢H Fā”H
in
conv (Lift-congā² lāā”lā Fā”H) (sym Uāā”)
, U-injectivity
(U lā ā”⨠Uāā” ā©ā¢
U (kā supįµā lā) ā”⨠U-cong-ā¢ā” (supįµā-cong kāā”kā lāā”lā) ā©ā¢
U (kā supįµā lā) ā”Ė⨠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ā , _ =
soundnessConvā-U ā¢Aā
(stabilityTerm (refl-ā (sym (univ Aāā”Bā))) ā¢Bā) Aāā”Bā
in
conv (ΠΣ-cong ā¢lā Aāā”Bā Aāā”Bā ok) (sym Uā”Uā)
, U-injectivity
(U lā ā”⨠Uā”Uā ā©ā¢
U lā ā”⨠U-cong-ā¢ā” lāā”lā ā©ā¢
U 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 zeroįµ ā”Ė⨠inversion-Empty ā¢Emptyā ā©ā¢ā
U lā ā)
where
open TyR
soundnessConvā-U {lā} {lā} ā¢Unitā ā¢Unitā (Unit-refl ā¢Ī ok) =
let Uā”Uā , _ = inversion-Unit-U ā¢Unitā
Uā”Uā , _ = inversion-Unit-U ā¢Unitā
in
refl (conv (Unitā±¼ ā¢Ī ok) (sym Uā”Uā))
, U-injectivity
(U lā ā”⨠Uā”Uā ā©ā¢
U zeroįµ ā”Ė⨠Uā”Uā ā©ā¢ā
U lā ā)
where
open TyR
soundnessConvā-U {lā} {lā} ā¢āā ā¢āā (ā-refl _) =
refl ā¢āā
, U-injectivity
(U lā ā”⨠inversion-ā ā¢āā ā©ā¢
U zeroįµ ā”Ė⨠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ā ā”⨠U-cong-ā¢ā” 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ā ā” lā ā·Level
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ā² ā©ā¢ā·
⨠U-cong-ā¢ā” lāā”lā ā©ā”
Bā² ā· U lā ā”⨠Bā²ā”Bā³ ā©ā¢ā·ā”
Bā³ ā*⨠Bā*Bā³ ā©ā¢ā
B ā)
, lāā”lā
where
open TmR
soundnessConvāLevel : ā {a b} ā Π⢠a [convā] b ā·Level ā Π⢠a ā” b ā· Level
soundnessConvāLevel ([ā]Ė” aįµ bįµ aā” bā” aā”b) =
let aā” = soundnessāįµ aā”
bā” = soundnessāįµ bā”
ā¢Level , _ , _ = syntacticEqTerm aā”
ā¢Ī = wf ā¢Level
ok = inversion-Level-⢠ā¢Level
in trans aā”
(trans (soundness-ā”įµ ok ā¢Ī aįµ bįµ aā”b)
(symā² bā”))
wfāįµ : ā {t v} ā Π⢠t āįµ v ā Π⢠t ā· Level
wfāįµ ([ā]įµ (d , _) tāv) = redFirst*Term d
wfāįµ : ā {t v} ā Π⢠t āįµ v ā Π⢠t ā· Level
wfāįµ (zeroįµā ok ā¢Ī) = zeroįµā±¼ ok ā¢Ī
wfāįµ (sucįµā x xā) = sucįµā±¼ (wfāįµ xā)
wfāįµ (neā x) = wf~įµ x
wf~įµ : ā {t v} ā Π⢠t ~įµ v ā Π⢠t ā· Level
wf~įµ (supįµĖ”ā x xā xā) = supįµā±¼ (wf~įµ xā) (wfāįµ xā)
wf~įµ (supįµŹ³ā x xā xā) = supįµā±¼ (sucįµā±¼ (wfāįµ xā)) (wf~įµ xā)
wf~įµ (neā [t] x) = syntacticEqTerm (soundness~ā [t]) .projā .projā
ā¢LevelAtom :
Level-allowed ā ⢠Πā (l : LevelAtom Ī) ā
Π⢠LevelAtomāTerm l ā· Level
ā¢LevelAtom ok ā¢Ī zeroįµ = zeroįµā±¼ ok ā¢Ī
ā¢LevelAtom _ ā¢Ī (ne tā”t) =
let _ , ā¢t , _ = syntacticEqTerm (soundness~ā tā”t)
in ā¢t
ā¢Levelāŗ :
Level-allowed ā ⢠Πā (l : Levelāŗ Ī) ā
Π⢠LevelāŗāTerm l ā· Level
ā¢Levelāŗ ok ā¢Ī (0 , l) = ā¢LevelAtom ok ā¢Ī l
ā¢Levelāŗ ok ā¢Ī (N.1+ n , l) = sucįµā±¼ (ā¢Levelāŗ ok ā¢Ī (n , l))
ā¢Levelįµ :
Level-allowed ā ⢠Πā (l : Levelįµ Ī) ā Π⢠LevelįµāTerm l ā· Level
ā¢Levelįµ ok ā¢Ī L.[] = zeroįµā±¼ ok ā¢Ī
ā¢Levelįµ ok ā¢Ī (x L.ā· l) = supįµā±¼ (ā¢Levelāŗ ok ā¢Ī x) (ā¢Levelįµ ok ā¢Ī l)
ā¢sucāŗ :
Level-allowed ā ⢠Πā (x : Levelāŗ Ī) ā
Π⢠LevelāŗāTerm (sucāŗ x) ā· Level
ā¢sucāŗ ok ā¢Ī (n , a) =
sucįµā±¼ (ā¢ā·Levelāā¢ā·Level ok (ā¢sucįµįµ (term-ā¢ā· (ā¢LevelAtom ok ā¢Ī a))))
ā¢map-sucāŗ :
Level-allowed ā ⢠Πā (l : Levelįµ Ī) ā
Π⢠LevelįµāTerm (map-sucāŗ l) ā· Level
ā¢map-sucāŗ ok ā¢Ī L.[] = zeroįµā±¼ ok ā¢Ī
ā¢map-sucāŗ ok ā¢Ī (x L.ā· l) = supįµā±¼ (ā¢sucāŗ ok ā¢Ī x) (ā¢map-sucāŗ ok ā¢Ī l)
LevelįµāTerm-suc :
Level-allowed ā ⢠Πā (l : Levelįµ Ī) ā
Π⢠sucįµ (LevelįµāTerm l) ā” LevelįµāTerm (sucįµ l) ā· Level
LevelįµāTerm-suc ok ā¢Ī L.[] = symā² (supįµ-zeroʳⱼ (sucįµā±¼ (zeroįµā±¼ ok ā¢Ī)))
LevelįµāTerm-suc ok ā¢Ī (x L.ā· l) =
trans (symā² (supįµ-sucįµ (ā¢Levelāŗ ok ā¢Ī x) (ā¢Levelįµ ok ā¢Ī l)))
(trans
(supįµ-cong (refl (sucįµā±¼ (ā¢Levelāŗ ok ā¢Ī x)))
(LevelįµāTerm-suc ok ā¢Ī l))
(supįµ-comm-assoc (sucįµā±¼ (ā¢Levelāŗ ok ā¢Ī x))
(sucįµā±¼ (zeroįµā±¼ ok ā¢Ī)) (ā¢map-sucāŗ ok ā¢Ī l)))
LevelįµāTerm-sup :
Level-allowed ā ⢠Πā (t u : Levelįµ Ī) ā
Π⢠LevelįµāTerm t supįµ LevelįµāTerm u ā” LevelįµāTerm (supįµ t u) ā·
Level
LevelįµāTerm-sup ok ā¢Ī L.[] x = supįµ-zeroĖ” (ā¢Levelįµ ok ā¢Ī x)
LevelįµāTerm-sup ok ā¢Ī (x L.ā· t) u =
trans
(supįµ-assoc (ā¢Levelāŗ ok ā¢Ī x) (ā¢Levelįµ ok ā¢Ī t) (ā¢Levelįµ ok ā¢Ī u))
(supįµ-cong (refl (ā¢Levelāŗ ok ā¢Ī x)) (LevelįµāTerm-sup ok ā¢Ī t u))
LevelįµāTerm-sup-map-sucāŗ :
Level-allowed ā ⢠Πā (t u : Levelįµ Ī) ā
Π⢠LevelįµāTerm (map-sucāŗ t) supįµ LevelįµāTerm u ā”
LevelįµāTerm (supįµ (map-sucāŗ t) u) ā· Level
LevelįµāTerm-sup-map-sucāŗ ok ā¢Ī L.[] u =
supįµ-zeroĖ” (ā¢Levelįµ ok ā¢Ī u)
LevelįµāTerm-sup-map-sucāŗ ok ā¢Ī (x L.ā· t) u =
trans
(supįµ-assoc (ā¢sucāŗ ok ā¢Ī x) (ā¢map-sucāŗ ok ā¢Ī t) (ā¢Levelįµ ok ā¢Ī u))
(supįµ-cong (refl (ā¢sucāŗ ok ā¢Ī x))
(LevelįµāTerm-sup-map-sucāŗ ok ā¢Ī t u))
LevelįµāTerm-sup-sucįµ :
Level-allowed ā ⢠Πā (t u : Levelįµ Ī) ā
Π⢠LevelįµāTerm (sucįµ t) supįµ LevelįµāTerm u ā”
LevelįµāTerm (supįµ (sucįµ t) u) ā· Level
LevelįµāTerm-sup-sucįµ ok ā¢Ī t u =
trans
(supįµ-assoc (sucįµā±¼ (zeroįµā±¼ ok ā¢Ī)) (ā¢map-sucāŗ ok ā¢Ī t)
(ā¢Levelįµ ok ā¢Ī u))
(supįµ-cong (refl (sucįµā±¼ (zeroįµā±¼ ok ā¢Ī)))
(LevelįµāTerm-sup-map-sucāŗ ok ā¢Ī t u))
soundnessāįµ : ā {t} {v : Levelįµ Ī} ā Π⢠t āįµ v ā Π⢠t ā” LevelįµāTerm v ā· Level
soundnessāįµ ([ā]įµ (d , _) tāv) = trans (subset*Term d) (soundnessāįµ tāv)
soundnessāįµ : ā {t} {v : Levelįµ Ī} ā Π⢠t āįµ v ā Π⢠t ā” LevelįµāTerm v ā· Level
soundnessāįµ (zeroįµā ok ā¢Ī) = refl (zeroįµā±¼ ok ā¢Ī)
soundnessāįµ (sucįµā {vā²} PE.refl tā”v) =
let ā¢tā”v = soundnessāįµ tā”v
ok = inversion-Level-⢠(wf-ā¢ā”ā· ā¢tā”v .projā)
in
trans (sucįµ-cong ā¢tā”v) (LevelįµāTerm-suc ok (wfTerm (wfāįµ tā”v)) vā²)
soundnessāįµ (neā x) = soundness~įµ x
soundness~įµ : ā {t} {v : Levelįµ Ī} ā Π⢠t ~įµ v ā Π⢠t ā” LevelįµāTerm v ā· Level
soundness~įµ (supįµĖ”ā {vā²} {vā³} y t~ uā) =
let uā = soundnessāįµ uā
ok = inversion-Level-⢠(wf-ā¢ā”ā· uā .projā)
in
trans (supįµ-cong (soundness~įµ t~) uā)
(PE.subst (_ ⢠_ ā”_ā· _) (PE.cong LevelįµāTerm (PE.sym y))
(LevelįµāTerm-sup ok (wfTerm (wf~įµ t~)) vā² vā³))
soundness~įµ (supįµŹ³ā {vā²} {vā³} PE.refl tā u~) =
let ā¢Ī = wfTerm (wfāįµ tā)
tā = soundnessāįµ tā
ok = inversion-Level-⢠(wf-ā¢ā”ā· tā .projā)
in
trans (supįµ-cong (sucįµ-cong tā) (soundness~įµ u~))
(trans
(supįµ-cong (LevelįµāTerm-suc ok ā¢Ī vā²)
(refl (ā¢Levelįµ ok ā¢Ī vā³)))
(LevelįµāTerm-sup-sucįµ ok ā¢Ī vā² vā³))
soundness~įµ (neā [tā²] PE.refl) =
let ā¢Level , ā¢tā² , _ = syntacticEqTerm (soundness~ā [tā²])
in symā² (supįµ-zeroʳⱼ ā¢tā²)
soundness-ā¤įµ
: Level-allowed
ā ⢠Ī
ā ā (t u : LevelAtom Ī)
ā ā¤įµ d t u
ā Π⢠LevelAtomāTerm t ⤠LevelAtomāTerm u ā·Level
soundness-ā¤įµ ok ā¢Ī t u zeroįµā¤ =
supįµ-zeroĖ” (ā¢LevelAtom ok ā¢Ī u)
soundness-ā¤įµ _ ā¢Ī t u (ne⤠(neā” x)) =
supįµ-subįµ (ā¢ā¤-refl (soundness~ā x))
soundness-ā¤įµ _ ā¢Ī t u (ne⤠(neā”' x)) =
supįµ-subįµ (ā¢ā¤-refl (symā² (soundness~ā x)))
soundness-ā¤āŗ
: Level-allowed
ā ⢠Ī
ā ā (t u : Levelāŗ Ī)
ā ā¤āŗ d t u
ā Π⢠LevelāŗāTerm t ⤠LevelāŗāTerm u ā·Level
soundness-ā¤āŗ ok ā¢Ī (n , t) (m , u) (nā¤m , tā¤u) =
ā¤-sucįµįµ nā¤m (soundness-ā¤įµ ok ā¢Ī _ _ tā¤u)
soundness-ā¤āŗįµ
: Level-allowed
ā ⢠Ī
ā ā (t : Levelāŗ Ī) (u : Levelįµ Ī)
ā ā¤āŗįµ d t u
ā Π⢠LevelāŗāTerm t ⤠LevelįµāTerm u ā·Level
soundness-ā¤āŗįµ ok ā¢Ī t (u L.ā· us) (Any.here px) =
let ā¢t = ā¢Levelāŗ ok ā¢Ī t
ā¢u = ā¢Levelāŗ ok ā¢Ī u
ā¢us = ā¢Levelįµ ok ā¢Ī us
ā¢Level = syntacticTerm ā¢t
in
trans (symā² (supįµ-assoc ā¢t ā¢u ā¢us))
(supįµ-cong (soundness-ā¤āŗ ok ā¢Ī _ _ px) (refl ā¢us))
soundness-ā¤āŗįµ ok ā¢Ī t (u L.ā· us) (Any.there x) =
let ā¢t = ā¢Levelāŗ ok ā¢Ī t
ā¢u = ā¢Levelāŗ ok ā¢Ī u
ā¢us = ā¢Levelįµ ok ā¢Ī us
in
trans (supįµ-comm-assoc ā¢t ā¢u ā¢us)
(supįµ-cong (refl ā¢u) (soundness-ā¤āŗįµ ok ā¢Ī _ _ x))
soundness-ā¤āŗįµ _ _ _ L.[] ()
soundness-ā¤įµ
: Level-allowed
ā ⢠Ī
ā ā (t u : Levelįµ Ī)
ā ā¤įµ d t u
ā Π⢠LevelįµāTerm t ⤠LevelįµāTerm u ā·Level
soundness-ā¤įµ ok ā¢Ī t u All.[] = supįµ-zeroĖ” (ā¢Levelįµ ok ā¢Ī u)
soundness-ā¤įµ ok ā¢Ī (t L.ā· ts) u (px All.ā· tā¤u) =
let ā¢t = ā¢Levelāŗ ok ā¢Ī t
ā¢ts = ā¢Levelįµ ok ā¢Ī ts
ā¢u = ā¢Levelįµ ok ā¢Ī u
in
trans (supįµ-assoc ā¢t ā¢ts ā¢u)
(trans (supįµ-cong (refl ā¢t) (soundness-ā¤įµ ok ā¢Ī ts u tā¤u))
(soundness-ā¤āŗįµ ok ā¢Ī t u px))
soundness-ā”įµ
: Level-allowed
ā ⢠Ī
ā ā (t u : Levelįµ Ī)
ā t ā”įµ u
ā Π⢠LevelįµāTerm t ā” LevelįµāTerm u ā· Level
soundness-ā”įµ ok ā¢Ī t u (tā¤u , uā¤t) =
trans (symā² (soundness-ā¤įµ ok ā¢Ī u t uā¤t))
(trans (supįµ-comm (ā¢Levelįµ ok ā¢Ī u) (ā¢Levelįµ ok ā¢Ī t))
(soundness-ā¤įµ ok ā¢Ī t u tā¤u))