open import Definition.Typed.Restrictions
open import Graded.Modality
module Definition.Typed.Consequences.Equality
{a} {M : Set a}
{𝕄 : Modality M}
(R : Type-restrictions 𝕄)
where
open Type-restrictions R
open import Definition.Untyped M
open import Definition.Untyped.Neutral M type-variant
open import Definition.Typed R
open import Definition.Typed.Properties R
open import Definition.Typed.EqRelInstance R
open import Definition.Typed.Inversion R
open import Definition.Typed.Syntactic R
open import Definition.LogicalRelation R
open import Definition.LogicalRelation.Hidden R
open import Definition.LogicalRelation.Fundamental.Reducibility R
open import Definition.LogicalRelation.Substitution.Introductions R
open import Tools.Fin
open import Tools.Function
open import Tools.Nat using (1+)
open import Tools.Product as Σ
import Tools.PropositionalEquality as PE
open import Tools.Relation
private
variable
Γ : Con Term _
A B C t u : Term _
b : BinderMode
p q : M
s : Strength
l : Universe-level
opaque
U≡A :
⦃ ok : No-equality-reflection or-empty Γ ⦄ →
Γ ⊢ U l ≡ A → Whnf A → A PE.≡ U l
U≡A {Γ} {l} {A} U≡A A-whnf = $⟨ U≡A ⟩
Γ ⊢ U l ≡ A →⟨ reducible-⊩≡ ⟩
(∃ λ l′ → Γ ⊩⟨ l′ ⟩ U l ≡ A) →⟨ proj₂ ∘→ ⊩U≡⇔ .proj₁ ∘→ proj₂ ⟩
Γ ⊢ A ⇒* U l →⟨ flip whnfRed* A-whnf ⟩
A PE.≡ U l □
opaque
whnf≢U :
Equality-reflection →
Unitʷ-allowed →
∃₂ λ (Γ : Con Term 1) (A : Term 1) →
Γ ⊢ U l ≡ A × Whnf A × A PE.≢ U l
whnf≢U {l} ok₁ ok₂ =
ε ∙ Id (U (1+ l)) (U l) (Unitʷ (1+ l)) ,
Unitʷ (1+ l) ,
univ
(equality-reflection′ ok₁ $
var₀ (Idⱼ′ (Uⱼ ε) (Unitⱼ ε ok₂))) ,
Unitₙ ,
(λ ())
opaque
ℕ≡A :
⦃ ok : No-equality-reflection or-empty Γ ⦄ →
Γ ⊢ ℕ ≡ A → Whnf A → A PE.≡ ℕ
ℕ≡A {Γ} {A} ℕ≡A A-whnf =
$⟨ ℕ≡A ⟩
Γ ⊢ ℕ ≡ A →⟨ ⊩ℕ≡⇔ .proj₁ ∘→ proj₂ ∘→ reducible-⊩≡ ⟩
Γ ⊩ℕ ℕ ≡ A ≡⟨ PE.refl ⟩→
Γ ⊢ A ⇒* ℕ →⟨ flip whnfRed* A-whnf ⟩
A PE.≡ ℕ □
opaque
whnf≢ℕ :
Equality-reflection →
∃₂ λ (Γ : Con Term 1) (A : Term 1) →
Γ ⊢ ℕ ≡ A × Whnf A × A PE.≢ ℕ
whnf≢ℕ ok =
ε ∙ Id (U 0) ℕ Empty ,
Empty ,
univ
(equality-reflection′ ok $
var₀ (Idⱼ′ (ℕⱼ ε) (Emptyⱼ ε))) ,
Emptyₙ ,
(λ ())
opaque
Empty≡A :
⦃ ok : No-equality-reflection or-empty Γ ⦄ →
Γ ⊢ Empty ≡ A → Whnf A → A PE.≡ Empty
Empty≡A {Γ} {A} Empty≡A A-whnf =
$⟨ Empty≡A ⟩
Γ ⊢ Empty ≡ A →⟨ ⊩Empty≡⇔ .proj₁ ∘→ proj₂ ∘→ reducible-⊩≡ ⟩
Γ ⊩Empty Empty ≡ A ≡⟨ PE.refl ⟩→
Γ ⊢ A ⇒* Empty →⟨ flip whnfRed* A-whnf ⟩
A PE.≡ Empty □
opaque
whnf≢Empty :
Equality-reflection →
∃₂ λ (Γ : Con Term 1) (A : Term 1) →
Γ ⊢ Empty ≡ A × Whnf A × A PE.≢ Empty
whnf≢Empty ok =
ε ∙ Id (U 0) Empty ℕ ,
ℕ ,
univ
(equality-reflection′ ok $
var₀ (Idⱼ′ (Emptyⱼ ε) (ℕⱼ ε))) ,
ℕₙ ,
(λ ())
opaque
Unit≡A :
⦃ ok : No-equality-reflection or-empty Γ ⦄ →
Γ ⊢ Unit s l ≡ A → Whnf A → A PE.≡ Unit s l
Unit≡A {Γ} {s} {l} {A} Unit≡A A-whnf =
$⟨ Unit≡A ⟩
Γ ⊢ Unit s l ≡ A →⟨ reducible-⊩≡ ⟩
(∃ λ l′ → Γ ⊩⟨ l′ ⟩ Unit s l ≡ A) →⟨ proj₂ ∘→ proj₂ ∘→ proj₂ ∘→ ⊩Unit≡⇔ .proj₁ ∘→ proj₂ ⟩
Γ ⊢ A ⇒* Unit s l →⟨ flip whnfRed* A-whnf ⟩
A PE.≡ Unit s l □
opaque
whnf≢Unit :
Equality-reflection →
Unit-allowed s →
∃₂ λ (Γ : Con Term 1) (A : Term 1) →
Γ ⊢ Unit s l ≡ A × Whnf A ×
¬ ∃₂ λ s l → A PE.≡ Unit s l
whnf≢Unit {s} {l} ok₁ ok₂ =
ε ∙ Id (U l) (Unit s l) (Id (Unit s l) (star s l) (star s l)) ,
Id (Unit s l) (star s l) (star s l) ,
univ
(equality-reflection′ ok₁ $ var₀ $
Idⱼ′ (Unitⱼ ε ok₂) $ Idⱼ (Unitⱼ ε ok₂) (starⱼ ε ok₂) (starⱼ ε ok₂)) ,
Idₙ ,
(λ ())
opaque
ne≡A :
⦃ ok : No-equality-reflection or-empty Γ ⦄ →
Neutral B → Γ ⊢ B ≡ A → Whnf A → Neutral A
ne≡A {Γ} {B} {A} B-ne B≡A A-whnf = $⟨ B≡A ⟩
Γ ⊢ B ≡ A →⟨ reducible-⊩≡ ⟩
(∃ λ l → Γ ⊩⟨ l ⟩ B ≡ A) →⟨ Σ.map idᶠ (Σ.map idᶠ proj₁) ∘→ proj₂ ∘→ ⊩ne≡⇔ B-ne .proj₁ ∘→ proj₂ ⟩
(∃ λ C → Neutral C × Γ ⊢ A ⇒* C) →⟨ (λ (_ , C-ne , A⇒*C) →
PE.subst Neutral (PE.sym $ whnfRed* A⇒*C A-whnf) C-ne) ⟩
Neutral A □
opaque
whnf≢ne :
Equality-reflection →
∃₃ λ (Γ : Con Term 2) (A B : Term 2) →
Γ ⊢ A ≡ B × Neutral A × Whnf B × A PE.≢ B
whnf≢ne ok =
ε ∙ U 0 ∙ Id (U 0) (var x0) Empty ,
var x1 ,
Empty ,
univ
(equality-reflection′ ok $
var₀ (Idⱼ′ (var₀ (Uⱼ ε)) (Emptyⱼ (∙ Uⱼ ε)))) ,
var _ ,
Emptyₙ ,
(λ ())
opaque
ΠΣ≡Whnf :
⦃ ok : No-equality-reflection or-empty Γ ⦄ →
Γ ⊢ ΠΣ⟨ b ⟩ p , q ▷ A ▹ B ≡ C → Whnf C →
∃₂ λ A′ B′ → C PE.≡ ΠΣ⟨ b ⟩ p , q ▷ A′ ▹ B′
ΠΣ≡Whnf {Γ} {b} {p} {q} {A} {B} {C} ΠΣ≡C C-whnf = $⟨ ΠΣ≡C ⟩
Γ ⊢ ΠΣ⟨ b ⟩ p , q ▷ A ▹ B ≡ C →⟨ reducible-⊩≡ ⟩
(∃ λ l → Γ ⊩⟨ l ⟩ ΠΣ⟨ b ⟩ p , q ▷ A ▹ B ≡ C) →⟨ Σ.map idᶠ (Σ.map idᶠ proj₁) ∘→ proj₂ ∘→ proj₂ ∘→ ⊩ΠΣ≡⇔ .proj₁ ∘→ proj₂ ⟩
(∃₂ λ A′ B′ → Γ ⊢ C ⇒* ΠΣ⟨ b ⟩ p , q ▷ A′ ▹ B′) →⟨ Σ.map idᶠ $ Σ.map idᶠ (flip whnfRed* C-whnf) ⟩
(∃₂ λ A′ B′ → C PE.≡ ΠΣ⟨ b ⟩ p , q ▷ A′ ▹ B′) □
opaque
whnf≢ΠΣ :
Equality-reflection →
ΠΣ-allowed b p q →
∃₄ λ (Γ : Con Term 1) A B C →
Γ ⊢ ΠΣ⟨ b ⟩ p , q ▷ A ▹ B ≡ C × Whnf C ×
¬ ∃₅ λ b p q A B → C PE.≡ ΠΣ⟨ b ⟩ p , q ▷ A ▹ B
whnf≢ΠΣ {b} {p} {q} ok₁ ok₂ =
ε ∙ Id (U 0) (ΠΣ⟨ b ⟩ p , q ▷ ℕ ▹ ℕ) ℕ ,
ℕ , ℕ , ℕ ,
univ
(equality-reflection′ ok₁ $
var₀ (Idⱼ′ (ΠΣⱼ (ℕⱼ ε) (ℕⱼ (∙ ℕⱼ ε)) ok₂) (ℕⱼ ε))) ,
ℕₙ ,
(λ ())
opaque
Π≡A :
⦃ ok : No-equality-reflection or-empty Γ ⦄ →
Γ ⊢ Π p , q ▷ B ▹ C ≡ A → Whnf A →
∃₂ λ B′ C′ → A PE.≡ Π p , q ▷ B′ ▹ C′
Π≡A = ΠΣ≡Whnf
opaque
Σ≡A :
⦃ ok : No-equality-reflection or-empty Γ ⦄ →
Γ ⊢ Σ⟨ s ⟩ p , q ▷ B ▹ C ≡ A → Whnf A →
∃₂ λ B′ C′ → A PE.≡ Σ⟨ s ⟩ p , q ▷ B′ ▹ C′
Σ≡A = ΠΣ≡Whnf
opaque
Id≡Whnf :
⦃ ok : No-equality-reflection or-empty Γ ⦄ →
Γ ⊢ Id A t u ≡ B → Whnf B →
∃₃ λ A′ t′ u′ → B PE.≡ Id A′ t′ u′
Id≡Whnf {Γ} {A} {t} {u} {B} Id≡B B-whnf =
$⟨ Id≡B ⟩
Γ ⊢ Id A t u ≡ B →⟨ reducible-⊩≡ ⟩
(∃ λ l → Γ ⊩⟨ l ⟩ Id A t u ≡ B) →⟨ Σ.map idᶠ (Σ.map idᶠ (Σ.map idᶠ proj₁)) ∘→ proj₂ ∘→ ⊩Id≡⇔ .proj₁ ∘→ proj₂ ⟩
(∃₃ λ A′ t′ u′ → Γ ⊢ B ⇒* Id A′ t′ u′) →⟨ Σ.map idᶠ $ Σ.map idᶠ $ Σ.map idᶠ (flip whnfRed* B-whnf) ⟩
(∃₃ λ A′ t′ u′ → B PE.≡ Id A′ t′ u′) □
opaque
whnf≢Id :
Equality-reflection →
∃₅ λ (Γ : Con Term 1) A t u B →
Γ ⊢ Id A t u ≡ B × Whnf B ×
¬ ∃₃ λ A t u → B PE.≡ Id A t u
whnf≢Id ok =
ε ∙ Id (U 0) (Id ℕ zero zero) ℕ ,
ℕ , zero , zero , ℕ ,
univ
(equality-reflection′ ok $
var₀ (Idⱼ′ (Idⱼ (ℕⱼ ε) (zeroⱼ ε) (zeroⱼ ε)) (ℕⱼ ε))) ,
ℕₙ ,
(λ ())
opaque
rfl-norm :
⦃ ok : No-equality-reflection or-empty Γ ⦄ →
Γ ⊢ t ≡ rfl ∷ A → Γ ⊢ t ⇒* rfl ∷ A
rfl-norm t≡rfl =
case inversion-rfl (syntacticEqTerm t≡rfl .proj₂ .proj₂) of λ
(_ , _ , _ , _ , A≡Id) →
case ⊩≡∷Id⇔ .proj₁ $ proj₂ $ reducible-⊩≡∷ $
conv t≡rfl A≡Id of λ
(t′ , _ , t⇒*u , rfl⇒*v , _ , _ , u∼v) →
case whnfRed*Term rfl⇒*v rflₙ of λ {
PE.refl →
case u∼v of λ where
(rfl₌ _) →
conv* t⇒*u (sym A≡Id)
(ne _ _ () _) }
opaque
rfl-not-norm :
Equality-reflection →
∃₃ λ (Γ : Con Term 2) A t →
Γ ⊢ t ≡ rfl ∷ A × ¬ ∃₂ λ Δ B → Δ ⊢ t ⇒* rfl ∷ B
rfl-not-norm ok =
let ⊢Id = Idⱼ′ (zeroⱼ ε) (zeroⱼ ε) in
ε ∙ Id ℕ zero zero ∙ Id (Id ℕ zero zero) (var x0) rfl ,
Id ℕ zero zero , var x1 ,
(equality-reflection′ ok $
var₀ (Idⱼ′ (var₀ ⊢Id) (rflⱼ (zeroⱼ (∙ ⊢Id))))) ,
(λ { (_ , _ , x1⇒ ⇨ _) → neRedTerm x1⇒ (var _) })
opaque
whnf≡rfl :
⦃ ok : No-equality-reflection or-empty Γ ⦄ →
Γ ⊢ t ≡ rfl ∷ A → Whnf t → t PE.≡ rfl
whnf≡rfl = whnfRed*Term ∘→ rfl-norm
opaque
whnf≢rfl :
Equality-reflection →
∃₃ λ (Γ : Con Term 2) A t →
Γ ⊢ t ≡ rfl ∷ A × Whnf t × t PE.≢ rfl
whnf≢rfl ok =
let ⊢Id = Idⱼ′ (zeroⱼ ε) (zeroⱼ ε) in
ε ∙ Id ℕ zero zero ∙ Id (Id ℕ zero zero) (var x0) rfl ,
Id ℕ zero zero , var x1 ,
(equality-reflection′ ok $
var₀ (Idⱼ′ (var₀ ⊢Id) (rflⱼ (zeroⱼ (∙ ⊢Id))))) ,
ne (var _) ,
(λ ())