open import Definition.Typed.Restrictions
open import Graded.Modality
module Definition.Conversion.Soundness
{a} {M : Set a}
{š : Modality M}
(R : Type-restrictions š)
where
open import Definition.Untyped M
open import Definition.Typed R
open import Definition.Typed.Properties R
open import Definition.Conversion R
open import Definition.Conversion.Whnf R
open import Definition.Typed.Consequences.DerivedRules R
open import Definition.Typed.Consequences.InverseUniv R
open import Definition.Typed.Consequences.Inversion R
open import Definition.Typed.Consequences.Syntactic 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
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ā”)
ā¢F , ā¢G = syntacticĪ£ ā¢Ī£FG
in fst-cong ā¢F ā¢G pā”
soundness~ā (snd-cong x) =
let pā” = soundness~ā x
ā¢Ī£FG = projā (syntacticEqTerm pā”)
ā¢F , ā¢G = syntacticĪ£ ā¢Ī£FG
in snd-cong ā¢F ā¢G pā”
soundness~ā (natrec-cong xā xā xā k~l) =
let Fā”G = soundnessConvā xā
ā¢F = projā (syntacticEq Fā”G)
in natrec-cong ā¢F 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ā
ā¢F , ā¢G , ok = inversion-Ī Ī£ (projā (syntacticEqTerm gā”h))
in prodrec-cong ā¢F ā¢G 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 (syntacticEq Aāā”Aā .projā) 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) =
case soundnessConvāTerm tāā”tā of Ī» {
tāā”tā ā
K-cong (soundnessConvā Aāā”Aā) (syntacticEqTerm tāā”tā .projā .projā)
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 F c cā ok) =
Ī Ī£-cong F (soundnessConvā c) (soundnessConvā cā) 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 x) = soundness~ā x
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 x xā xā) = inverseUnivEq x (soundnessConvā 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ā xā ok) =
prod-cong x xā (soundnessConvāTerm xā) (soundnessConvāTerm xā) ok
soundnessConvāTerm (Ī·-eq x xā y yā c) =
let ā¢Ī FG = syntacticTerm x
ā¢F , _ = syntacticĪ ā¢Ī FG
in Ī·-eq ā¢F x xā (soundnessConvāTerm c)
soundnessConvāTerm (Ī£-Ī· ā¢p ā¢r pProd rProd fstConv sndConv) =
let ā¢Ī£FG = syntacticTerm ā¢p
ā¢F , ā¢G = syntacticĪ£ ā¢Ī£FG
fstā” = soundnessConvāTerm fstConv
sndā” = soundnessConvāTerm sndConv
in Ī£-Ī· ā¢F ā¢G ā¢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)