open import Definition.Typed.Restrictions
open import Graded.Modality
module Definition.Conversion.Stability
{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
import Definition.Typed.Weakening R as W
open import Definition.Conversion R
open import Definition.Conversion.Soundness R
open import Definition.Typed.Consequences.Syntactic R
open import Definition.Typed.Consequences.Stability R
open import Tools.Function
open import Tools.Nat
open import Tools.Product
private
variable
n : Nat
Î Î : Con Term n
mutual
stability~â : â {k l A}
â ⢠Π⥠Î
â Π⢠k ~ l â A
â Π⢠k ~ l â A
stability~â ÎâĄÎ (var-refl x xâĄy) =
var-refl (stabilityTerm ÎâĄÎ x) xâĄy
stability~â ÎâĄÎ (app-cong k~l x) =
app-cong (stability~â ÎâĄÎ k~l) (stabilityConvâTerm ÎâĄÎ x)
stability~â ÎâĄÎ (fst-cong p~r) =
fst-cong (stability~â ÎâĄÎ p~r)
stability~â ÎâĄÎ (snd-cong p~r) =
snd-cong (stability~â ÎâĄÎ p~r)
stability~â ÎâĄÎ (natrec-cong xâ xâ xâ k~l) =
let â˘Î , _ , _ = contextConvSubst ÎâĄÎ
â˘F = projâ (syntacticEq (soundnessConvâ xâ))
in natrec-cong (stabilityConvâ (ÎâĄÎ â (refl (ââąź â˘Î))) xâ)
(stabilityConvâTerm ÎâĄÎ xâ)
((stabilityConvâTerm (ÎâĄÎ â refl (ââąź â˘Î) â refl â˘F) xâ))
(stability~â ÎâĄÎ k~l)
stability~â ÎâĄÎ (prodrec-cong x xâ xâ) =
let â˘ÎŁ , _ = syntacticEqTerm (soundness~â xâ)
â˘F , â˘G = syntacticÎŁ â˘ÎŁ
in prodrec-cong (stabilityConvâ (ÎâĄÎ â refl â˘ÎŁ) x)
(stability~â ÎâĄÎ xâ)
(stabilityConvâTerm (ÎâĄÎ â refl â˘F â refl â˘G) xâ)
stability~â ÎâĄÎ (emptyrec-cong xâ k~l) =
emptyrec-cong (stabilityConvâ ÎâĄÎ xâ)
(stability~â ÎâĄÎ k~l)
stability~â ÎâĄÎ (unitrec-cong x xâ xâ no-Ρ) =
let kâĄl = soundness~â xâ
â˘Unit = projâ (syntacticEqTerm kâĄl)
in unitrec-cong (stabilityConvâ (ÎâĄÎ â refl â˘Unit) x)
(stability~â ÎâĄÎ xâ) (stabilityConvâTerm ÎâĄÎ xâ) no-Ρ
stability~â ÎâĄÎ (J-cong AââĄAâ tââĄtâ BââĄBâ uââĄuâ vââĄvâ wâ~wâ âĄId) =
case syntacticEq (soundnessConvâ AââĄAâ) .projâ of Îť {
â˘Aâ â
case syntacticEqTerm (soundnessConvâTerm tââĄtâ) .projâ .projâ of Îť {
â˘tâ â
J-cong (stabilityConvâ ÎâĄÎ AââĄAâ) (stabilityConvâTerm ÎâĄÎ tââĄtâ)
(stabilityConvâ
(ÎâĄÎ â refl â˘Aâ â refl (Idâąź (W.wkTermâ â˘Aâ â˘tâ) (varâ â˘Aâ)))
BââĄBâ)
(stabilityConvâTerm ÎâĄÎ uââĄuâ) (stabilityConvâTerm ÎâĄÎ vââĄvâ)
(stability~â ÎâĄÎ wâ~wâ) (stabilityEq ÎâĄÎ âĄId) }}
stability~â ÎâĄÎ (K-cong AââĄAâ tââĄtâ BââĄBâ uââĄuâ vâ~vâ âĄId ok) =
case syntacticEqTerm (soundnessConvâTerm tââĄtâ) .projâ .projâ of Îť {
â˘tâ â
K-cong (stabilityConvâ ÎâĄÎ AââĄAâ) (stabilityConvâTerm ÎâĄÎ tââĄtâ)
(stabilityConvâ (ÎâĄÎ â refl (Idâąź â˘tâ â˘tâ)) BââĄBâ)
(stabilityConvâTerm ÎâĄÎ uââĄuâ) (stability~â ÎâĄÎ vâ~vâ)
(stabilityEq ÎâĄÎ âĄId) ok }
stability~â ÎâĄÎ ([]-cong-cong AââĄAâ tââĄtâ uââĄuâ vâ~vâ âĄId ok) =
[]-cong-cong (stabilityConvâ ÎâĄÎ AââĄAâ)
(stabilityConvâTerm ÎâĄÎ tââĄtâ) (stabilityConvâTerm ÎâĄÎ uââĄuâ)
(stability~â ÎâĄÎ vâ~vâ) (stabilityEq ÎâĄÎ âĄId) ok
stability~â : â {k l A}
â ⢠Π⥠Î
â Π⢠k ~ l â A
â Π⢠k ~ l â A
stability~â ÎâĄÎ ([~] A (D , whnfA) k~l) =
[~] A (stabilityRed* ÎâĄÎ D , whnfA) (stability~â ÎâĄÎ k~l)
stabilityConvâ : â {A B}
â ⢠Π⥠Î
â Π⢠A [convâ] B
â Π⢠A [convâ] B
stabilityConvâ ÎâĄÎ ([â] AⲠBⲠD DⲠAâ˛<>Bâ˛) =
[â] AⲠBⲠ(stabilityRedâ ÎâĄÎ D) (stabilityRedâ ÎâĄÎ Dâ˛)
(stabilityConvâ ÎâĄÎ Aâ˛<>Bâ˛)
stabilityConvâ : â {A B}
â ⢠Π⥠Î
â Π⢠A [convâ] B
â Π⢠A [convâ] B
stabilityConvâ ÎâĄÎ (U-refl x) =
let _ , â˘Î , _ = contextConvSubst ÎâĄÎ
in U-refl â˘Î
stabilityConvâ ÎâĄÎ (â-refl x) =
let _ , â˘Î , _ = contextConvSubst ÎâĄÎ
in â-refl â˘Î
stabilityConvâ ÎâĄÎ (Empty-refl x) =
let _ , â˘Î , _ = contextConvSubst ÎâĄÎ
in Empty-refl â˘Î
stabilityConvâ ÎâĄÎ (Unit-refl x ok) =
let _ , â˘Î , _ = contextConvSubst ÎâĄÎ
in Unit-refl â˘Î ok
stabilityConvâ ÎâĄÎ (ne x) =
ne (stability~â ÎâĄÎ x)
stabilityConvâ ÎâĄÎ (Î ÎŁ-cong F A<>B A<>Bâ ok) =
Î ÎŁ-cong (stability ÎâĄÎ F) (stabilityConvâ ÎâĄÎ A<>B)
(stabilityConvâ (ÎâĄÎ â refl F) A<>Bâ) ok
stabilityConvâ ÎâĄÎ (Id-cong AââĄAâ tââĄtâ uââĄuâ) =
Id-cong (stabilityConvâ ÎâĄÎ AââĄAâ) (stabilityConvâTerm ÎâĄÎ tââĄtâ)
(stabilityConvâTerm ÎâĄÎ uââĄuâ)
stabilityConvâTerm : â {t u A}
â ⢠Π⥠Î
â Π⢠t [convâ] u ⡠A
â Π⢠t [convâ] u ⡠A
stabilityConvâTerm ÎâĄÎ ([â]â B tⲠuⲠD d dⲠt<>u) =
[â]â B tⲠuⲠ(stabilityRedâ ÎâĄÎ D) (stabilityRedâTerm ÎâĄÎ d)
(stabilityRedâTerm ÎâĄÎ dâ˛)
(stabilityConvâTerm ÎâĄÎ t<>u)
stabilityConvâTerm : â {t u A}
â ⢠Π⥠Î
â Π⢠t [convâ] u ⡠A
â Π⢠t [convâ] u ⡠A
stabilityConvâTerm ÎâĄÎ (â-ins x) =
â-ins (stability~â ÎâĄÎ x)
stabilityConvâTerm ÎâĄÎ (Empty-ins x) =
Empty-ins (stability~â ÎâĄÎ x)
stabilityConvâTerm ÎâĄÎ (Unit-ins x) =
Unit-ins (stability~â ÎâĄÎ x)
stabilityConvâTerm ÎâĄÎ (Σʡ-ins x xâ xâ) =
Σʡ-ins (stabilityTerm ÎâĄÎ x) (stabilityTerm ÎâĄÎ xâ) (stability~â ÎâĄÎ xâ)
stabilityConvâTerm ÎâĄÎ (ne-ins t u neN x) =
ne-ins (stabilityTerm ÎâĄÎ t) (stabilityTerm ÎâĄÎ u) neN (stability~â ÎâĄÎ x)
stabilityConvâTerm ÎâĄÎ (univ x xâ xâ) =
univ (stabilityTerm ÎâĄÎ x) (stabilityTerm ÎâĄÎ xâ) (stabilityConvâ ÎâĄÎ xâ)
stabilityConvâTerm ÎâĄÎ (zero-refl x) =
let _ , â˘Î , _ = contextConvSubst ÎâĄÎ
in zero-refl â˘Î
stabilityConvâTerm ÎâĄÎ (starʡ-refl _ ok no-Ρ) =
let _ , â˘Î , _ = contextConvSubst ÎâĄÎ
in starʡ-refl â˘Î ok no-Ρ
stabilityConvâTerm ÎâĄÎ (suc-cong t<>u) = suc-cong (stabilityConvâTerm ÎâĄÎ t<>u)
stabilityConvâTerm ÎâĄÎ (prod-cong x xâ xâ xâ ok) =
prod-cong (stability ÎâĄÎ x) (stability (ÎâĄÎ â refl x) xâ)
(stabilityConvâTerm ÎâĄÎ xâ) (stabilityConvâTerm ÎâĄÎ xâ) ok
stabilityConvâTerm ÎâĄÎ (Ρ-eq x xâ y yâ t<>u) =
let â˘F , â˘G = syntacticÎ (syntacticTerm x)
in Ρ-eq (stabilityTerm ÎâĄÎ x) (stabilityTerm ÎâĄÎ xâ)
y yâ (stabilityConvâTerm (ÎâĄÎ â (refl â˘F)) t<>u)
stabilityConvâTerm ÎâĄÎ (ÎŁ-Ρ â˘p â˘r pProd rProd fstConv sndConv) =
ÎŁ-Ρ (stabilityTerm ÎâĄÎ â˘p) (stabilityTerm ÎâĄÎ â˘r)
pProd rProd
(stabilityConvâTerm ÎâĄÎ fstConv) (stabilityConvâTerm ÎâĄÎ sndConv)
stabilityConvâTerm ÎâĄÎ (Ρ-unit [t] [u] tUnit uUnit ok) =
let [t] = stabilityTerm ÎâĄÎ [t]
[u] = stabilityTerm ÎâĄÎ [u]
in Ρ-unit [t] [u] tUnit uUnit ok
stabilityConvâTerm ÎâĄÎ (Id-ins â˘vâ vâ~vâ) =
Id-ins (stabilityTerm ÎâĄÎ â˘vâ) (stability~â ÎâĄÎ vâ~vâ)
stabilityConvâTerm ÎâĄÎ (rfl-refl tâĄu) =
rfl-refl (stabilityEqTerm ÎâĄÎ tâĄu)