Martin Escardo, 14 Feb 2024.
Generalization of UF.SIP to characterize equality of Σ-types,
suggested by Ian Ray. In UF.SIP, the index type of the Σ-type is a
universe. But the results hold for any index type whatsoever, if they
are slightly modified to replace some equivalences by identities. In
particular we don't use univalence (or function or propositional
extensionality) here, which the file UF.SIP does.
we consider Σ-types of the form Σ x ꞉ X , S x. We think of s : S x as
structure on the point x : X, so that S x is the type of all
structures on x, and Σ x ꞉ X , S x is the type of structured points.
Conventions.
* x, y range over X.
* σ, τ range over Σ S.
* s, t range over S x.
\begin{code}
{-# OPTIONS --safe --without-K #-}
module UF.SigmaIdentity where
open import MLTT.Spartan
open import UF.Base
open import UF.Embeddings
open import UF.Equiv
open import UF.EquivalenceExamples
open import UF.Retracts
open import UF.Subsingletons
open import UF.Yoneda
module Σ-identity where
\end{code}
Underlying point and structure of a structured point.
\begin{code}
module _ {X : 𝓤 ̇ } {S : X → 𝓥 ̇ } where
⟨_⟩ : Σ S → X
⟨_⟩ = pr₁
structure : (σ : Σ S) → S ⟨ σ ⟩
structure = pr₂
\end{code}
The canonical map from an identification of structures on the same
point to a generalized identification ι with reflexivity data ρ of
structured points with the same underlying point:
\begin{code}
canonical-map : (ι : (σ τ : Σ S) → ⟨ σ ⟩ = ⟨ τ ⟩ → 𝓦 ̇ )
(ρ : (σ : Σ S) → ι σ σ refl)
{x : X}
(s t : S x)
→ s = t → ι (x , s) (x , t) refl
canonical-map ι ρ {x} s s refl = ρ (x , s)
\end{code}
The type of Sigma notions of identity, ranged over by δ = (ι , ρ , θ).
\begin{code}
SNI : {X : 𝓤 ̇ } → (X → 𝓥 ̇ ) → (𝓦 : Universe) → 𝓤 ⊔ 𝓥 ⊔ (𝓦 ⁺) ̇
SNI {𝓤} {𝓥} {X} S 𝓦 =
Σ ι ꞉ ((σ τ : Σ S) → (⟨ σ ⟩ = ⟨ τ ⟩ → 𝓦 ̇ ))
, Σ ρ ꞉ ((σ : Σ S) → ι σ σ refl)
, ({x : X} (s t : S x) → is-equiv (canonical-map ι ρ s t))
module _ {X : 𝓤 ̇ } {S : X → 𝓥 ̇ } where
structure-preserving : SNI S 𝓦
→ (σ τ : Σ S) → ⟨ σ ⟩ = ⟨ τ ⟩ → 𝓦 ̇
structure-preserving (ι , ρ , θ) = ι
_≃[_]_ : Σ S → SNI S 𝓦 → Σ S → 𝓤 ⊔ 𝓦 ̇
σ ≃[ δ ] τ = Σ p ꞉ (⟨ σ ⟩ = ⟨ τ ⟩) , structure-preserving δ σ τ p
structure-preservation-lemma :
(δ : SNI S 𝓦)
(σ τ : Σ S)
(p : ⟨ σ ⟩ = ⟨ τ ⟩)
→ (transport S p (structure σ) = structure τ) ≃ structure-preserving δ σ τ p
structure-preservation-lemma (ι , ρ , θ) (x , s) (x , t) (refl {x}) = γ
where
γ : (s = t) ≃ ι (x , s) (x , t) refl
γ = (canonical-map ι ρ s t , θ s t)
module _ (δ@(ι , ρ , θ) : SNI S 𝓦) where
characterization-of-= : (σ τ : Σ S) → (σ = τ) ≃ (σ ≃[ δ ] τ)
characterization-of-= σ τ =
(σ = τ) ≃⟨ i ⟩
(Σ p ꞉ ⟨ σ ⟩ = ⟨ τ ⟩ , transport S p (structure σ) = structure τ) ≃⟨ ii ⟩
(Σ p ꞉ ⟨ σ ⟩ = ⟨ τ ⟩ , structure-preserving δ σ τ p) ≃⟨ iii ⟩
(σ ≃[ δ ] τ) ■
where
i = Σ-=-≃
ii = Σ-cong (structure-preservation-lemma δ σ τ)
iii = ≃-refl _
=-to-≃[] : (σ τ : Σ S) → (σ = τ) → (σ ≃[ δ ] τ)
=-to-≃[] σ σ refl = refl , ρ σ
characterization-of-characterization-of-= :
(σ τ : Σ S) → ⌜ characterization-of-= σ τ ⌝ ∼ =-to-≃[] σ τ
characterization-of-characterization-of-= σ σ refl = refl
=-to-≃[]-is-equiv : (σ τ : Σ S) → is-equiv (=-to-≃[] σ τ)
=-to-≃[]-is-equiv σ τ = equiv-closed-under-∼'
(⌜⌝-is-equiv (characterization-of-= σ τ))
(characterization-of-characterization-of-= σ τ)
module _ (ι : (σ τ : Σ S) → ⟨ σ ⟩ = ⟨ τ ⟩ → 𝓦 ̇ )
(ρ : (σ : Σ S) → ι σ σ refl)
{x : X}
where
private
c = canonical-map ι ρ
canonical-map-charac :
(s t : S x)
(p : s = t)
→ c s t p = transport (λ - → ι (x , s) (x , -) refl) p (ρ (x , s))
canonical-map-charac s t p =
(yoneda-lemma s (λ t → ι (x , s) (x , t) refl) (c s) t p)⁻¹
when-canonical-map-is-equiv
: ((s t : S x) → is-equiv (c s t))
↔ ((s : S x) → ∃! t ꞉ S x , ι (x , s) (x , t) refl)
when-canonical-map-is-equiv = (λ e s → Yoneda-Theorem-back s (c s) (e s)) ,
(λ φ s → Yoneda-Theorem-forth s (c s) (φ s))
\end{code}
The canonical map is an equivalence if (and only) if we have some
equivalence.
\begin{code}
canonical-map-equiv-criterion :
((s t : S x) → (s = t) ≃ ι (x , s) (x , t) refl)
→ (s t : S x) → is-equiv (c s t)
canonical-map-equiv-criterion φ s = fiberwise-equiv-criterion'
(λ t → ι (x , s) (x , t) refl)
s (φ s) (c s)
\end{code}
But a retraction suffices for the canonical map to be an equivalence.
\begin{code}
canonical-map-equiv-criterion' :
((s t : S x) → ι (x , s) (x , t) refl ◁ (s = t))
→ (s t : S x) → is-equiv (c s t)
canonical-map-equiv-criterion' φ s = fiberwise-equiv-criterion
(λ t → ι (x , s) (x , t) refl)
s (φ s) (c s)
\end{code}
TODO. The type SNI X 𝓥 should be contractible, with the
following center of contraction, using univalence. Notice that we are
currently not using univalence (or even function or propositional
extensionality) in this file.
\begin{code}
canonical-SNI : {X : 𝓤 ̇ } (S : X → 𝓥 ̇ ) → SNI S 𝓥
canonical-SNI {𝓤} {𝓥} {X} S = ι , ρ , canonical-map-is-equiv
where
ι : (σ τ : Σ S) → (⟨ σ ⟩ = ⟨ τ ⟩ → 𝓥 ̇ )
ι (x , s) (y , t) p = transport S p s = t
ρ : (σ : Σ S) → ι σ σ refl
ρ (x , s) = refl
canonical-map-is-equiv : {x : X} (s t : S x)
→ is-equiv (canonical-map ι ρ s t)
canonical-map-is-equiv {x} s t = (canonical-map⁻¹ , η) ,
(canonical-map⁻¹ , ε)
where
canonical-map⁻¹ : ι (x , s) (x , t) refl → s = t
canonical-map⁻¹ refl = refl
η : canonical-map ι ρ s t ∘ canonical-map⁻¹ ∼ id
η refl = refl
ε : canonical-map⁻¹ ∘ canonical-map ι ρ s t ∼ id
ε refl = refl
module Σ-identity-with-axioms where
open Σ-identity
module _ {X : 𝓤 ̇ }
{S : X → 𝓥 ̇ }
(axioms : (x : X) → S x → 𝓦 ̇ )
where
[_] : (Σ x ꞉ X , Σ s ꞉ S x , axioms x s) → Σ S
[ x , s , _ ] = (x , s)
⟪_⟫ : (Σ x ꞉ X , Σ s ꞉ S x , axioms x s) → X
⟪ X , _ , _ ⟫ = X
module _ (axioms-are-prop : (x : X) (s : S x) → is-prop (axioms x s)) where
add-axioms : SNI S 𝓣
→ SNI (λ x → Σ s ꞉ S x , axioms x s) 𝓣
add-axioms {𝓣} (ι , ρ , θ) = ι' , ρ' , θ'
where
S' : X → 𝓥 ⊔ 𝓦 ̇
S' x = Σ s ꞉ S x , axioms x s
ι' : (σ τ : Σ S') → ⟨ σ ⟩ = ⟨ τ ⟩ → 𝓣 ̇
ι' σ τ = ι [ σ ] [ τ ]
ρ' : (σ : Σ S') → ι' σ σ refl
ρ' σ = ρ [ σ ]
θ' : {x : X} (s' t' : S' x) → is-equiv (canonical-map ι' ρ' s' t')
θ' {x} (s , a) (t , b) = γ
where
π : S' x → S x
π (s , _) = s
π-is-embedding : is-embedding π
π-is-embedding = pr₁-is-embedding (axioms-are-prop x)
k : {s' t' : S' x} → is-equiv (ap π {s'} {t'})
k {s'} {t'} = embedding-gives-embedding' π π-is-embedding s' t'
l : canonical-map ι' ρ' (s , a) (t , b)
∼ canonical-map ι ρ s t ∘ ap π {s , a} {t , b}
l (refl {s , a}) = 𝓻𝓮𝒻𝓵 (ρ (x , s))
e : is-equiv (canonical-map ι ρ s t ∘ ap π {s , a} {t , b})
e = ∘-is-equiv k (θ s t)
γ : is-equiv (canonical-map ι' ρ' (s , a) (t , b))
γ = equiv-closed-under-∼ _ _ e l
\end{code}
As expected, the axioms don't contribute to the characterization of
equality.
\begin{code}
characterization-of-=-with-axioms : (δ : SNI S 𝓣)
→ (σ τ : Σ x ꞉ X , Σ s ꞉ S x , axioms x s)
→ (σ = τ) ≃ ([ σ ] ≃[ δ ] [ τ ])
characterization-of-=-with-axioms δ = characterization-of-= (add-axioms δ)
\end{code}
We now put together two structures on the same type of points.
\begin{code}
module Σ-identity-join where
technical-lemma :
{X : 𝓤 ̇ } {σ : X → X → 𝓥 ̇ }
{Y : 𝓦 ̇ } {τ : Y → Y → 𝓣 ̇ }
(f : (x₀ x₁ : X) → x₀ = x₁ → σ x₀ x₁)
(g : (y₀ y₁ : Y) → y₀ = y₁ → τ y₀ y₁)
→ ((x₀ x₁ : X) → is-equiv (f x₀ x₁))
→ ((y₀ y₁ : Y) → is-equiv (g y₀ y₁))
→ ((x₀ , y₀) (x₁ , y₁) : X × Y)
→ is-equiv (λ (p : (x₀ , y₀) = (x₁ , y₁)) → f x₀ x₁ (ap pr₁ p) ,
g y₀ y₁ (ap pr₂ p))
technical-lemma {𝓤} {𝓥} {𝓦} {𝓣} {X} {σ} {Y} {τ} f g i j (x₀ , y₀) = γ
where
module _ ((x₁ , y₁) : X × Y) where
r : (x₀ , y₀) = (x₁ , y₁) → σ x₀ x₁ × τ y₀ y₁
r p = f x₀ x₁ (ap pr₁ p) , g y₀ y₁ (ap pr₂ p)
f' : (a : σ x₀ x₁) → x₀ = x₁
f' = inverse (f x₀ x₁) (i x₀ x₁)
g' : (b : τ y₀ y₁) → y₀ = y₁
g' = inverse (g y₀ y₁) (j y₀ y₁)
s : σ x₀ x₁ × τ y₀ y₁ → (x₀ , y₀) = (x₁ , y₁)
s (a , b) = to-×-= (f' a) (g' b)
η : (c : σ x₀ x₁ × τ y₀ y₁) → r (s c) = c
η (a , b) =
r (s (a , b)) =⟨ refl ⟩
r (to-×-= (f' a) (g' b)) =⟨ refl ⟩
(f x₀ x₁ (ap pr₁ (to-×-= (f' a) (g' b))) ,
g y₀ y₁ (ap pr₂ (to-×-= (f' a) (g' b)))) =⟨ ii ⟩
(f x₀ x₁ (f' a) , g y₀ y₁ (g' b)) =⟨ iii ⟩
a , b ∎
where
ii = ap₂ (λ p q → f x₀ x₁ p , g y₀ y₁ q)
(ap-pr₁-to-×-= (f' a) (g' b))
(ap-pr₂-to-×-= (f' a) (g' b))
iii = to-×-= (inverses-are-sections (f x₀ x₁) (i x₀ x₁) a)
(inverses-are-sections (g y₀ y₁) (j y₀ y₁) b)
γ : (z : X × Y) → is-equiv (r z)
γ = nats-with-sections-are-equivs (x₀ , y₀) r (λ z → (s z , η z))
variable
𝓥₀ 𝓥₁ 𝓦₀ 𝓦₁ : Universe
open Σ-identity
module _ {X : 𝓤 ̇ }
{S₀ : X → 𝓥₀ ̇ }
{S₁ : X → 𝓥₁ ̇ }
where
⟪_⟫ : (Σ x ꞉ X , S₀ x × S₁ x) → X
⟪ x , s₀ , s₁ ⟫ = x
[_]₀ : (Σ x ꞉ X , S₀ x × S₁ x) → Σ S₀
[ x , s₀ , s₁ ]₀ = (x , s₀)
[_]₁ : (Σ x ꞉ X , S₀ x × S₁ x) → Σ S₁
[ x , s₀ , s₁ ]₁ = (x , s₁)
join : SNI S₀ 𝓦₀
→ SNI S₁ 𝓦₁
→ SNI (λ x → S₀ x × S₁ x) (𝓦₀ ⊔ 𝓦₁)
join {𝓦₀} {𝓦₁} (ι₀ , ρ₀ , θ₀) (ι₁ , ρ₁ , θ₁) = ι , ρ , θ
where
S : X → 𝓥₀ ⊔ 𝓥₁ ̇
S x = S₀ x × S₁ x
ι : (σ τ : Σ S) → ⟨ σ ⟩ = ⟨ τ ⟩ → 𝓦₀ ⊔ 𝓦₁ ̇
ι σ τ e = ι₀ [ σ ]₀ [ τ ]₀ e × ι₁ [ σ ]₁ [ τ ]₁ e
ρ : (σ : Σ S) → ι σ σ refl
ρ σ = (ρ₀ [ σ ]₀ , ρ₁ [ σ ]₁)
θ : {x : X} (s t : S x) → is-equiv (canonical-map ι ρ s t)
θ {x} s@(s₀ , s₁) t@(t₀ , t₁) = γ
where
c : (p : s₀ , s₁ = t₀ , t₁) → ι₀ (x , s₀) (x , t₀) refl
× ι₁ (x , s₁) (x , t₁) refl
c p = (canonical-map ι₀ ρ₀ s₀ t₀ (ap pr₁ p) ,
canonical-map ι₁ ρ₁ s₁ t₁ (ap pr₂ p))
i : is-equiv c
i = technical-lemma
(canonical-map ι₀ ρ₀)
(canonical-map ι₁ ρ₁)
θ₀ θ₁ s t
e : canonical-map ι ρ s t ∼ c
e (refl {s}) = 𝓻𝓮𝒻𝓵 (ρ₀ (x , s₀) , ρ₁ (x , s₁))
γ : is-equiv (canonical-map ι ρ s t)
γ = equiv-closed-under-∼ _ _ i e
_≃⟦_,_⟧_ : (Σ x ꞉ X , S₀ x × S₁ x)
→ SNI S₀ 𝓦₀
→ SNI S₁ 𝓦₁
→ (Σ x ꞉ X , S₀ x × S₁ x)
→ 𝓤 ⊔ 𝓦₀ ⊔ 𝓦₁ ̇
σ ≃⟦ δ₀ , δ₁ ⟧ τ = Σ p ꞉ (⟪ σ ⟫ = ⟪ τ ⟫)
, structure-preserving δ₀ [ σ ]₀ [ τ ]₀ p
× structure-preserving δ₁ [ σ ]₁ [ τ ]₁ p
characterization-of-join-= : (δ₀ : SNI S₀ 𝓦₀)
(δ₁ : SNI S₁ 𝓦₁)
(σ τ : Σ x ꞉ X , S₀ x × S₁ x)
→ (σ = τ) ≃ (σ ≃⟦ δ₀ , δ₁ ⟧ τ)
characterization-of-join-= δ₀ δ₁ = characterization-of-= (join δ₀ δ₁)
\end{code}