-------------------------------------------------------------------------------- title: SIP for frames author: Ayberk Tosun date-started: 2024-04-14 date-completed: 2024-04-18 -------------------------------------------------------------------------------- Originally proved on 2020-02-03 by Ayberk Tosun (j.w.w. Thierry Coquand) in `ayberkt/formal-topology-in-UF` which is the Agda formalization accompanying Ayberk Tosun's MSc thesis. Ported to TypeTopology on 2024-04-17. \begin{code}[hide] {-# OPTIONS --safe --without-K --lossy-unification #-} open import MLTT.Spartan hiding (𝟚; ₀; ₁) open import UF.FunExt open import UF.PropTrunc open import UF.Size open import UF.UA-FunExt open import UF.Univalence open import UF.Subsingletons module Locales.SIP.FrameSIP (ua : Univalence) (pt : propositional-truncations-exist) (sr : Set-Replacement pt) where private fe : Fun-Ext fe {𝓤} {𝓥} = univalence-gives-funext' 𝓤 𝓥 (ua 𝓤) (ua (𝓤 ⊔ 𝓥)) pe : Prop-Ext pe {𝓤} = univalence-gives-propext (ua 𝓤) open import Locales.ContinuousMap.FrameHomomorphism-Definition pt fe open import Locales.ContinuousMap.FrameHomomorphism-Properties pt fe open import Locales.ContinuousMap.FrameIsomorphism-Definition pt fe open import Locales.Frame pt fe open import Slice.Family open import UF.Base open import UF.Equiv open import UF.Logic open import UF.SIP open import UF.SubtypeClassifier open AllCombinators pt fe open FrameHomomorphismProperties open FrameHomomorphisms open sip hiding (⟨_⟩) \end{code} We work in a module parameterized by two frame structures that we call `str₁` and `str₂`. \begin{code} module SIP-For-Frames {A : 𝓤 ⁺ ̇} (str₁ str₂ : frame-structure 𝓤 𝓤 A) where open FrameIsomorphisms \end{code} We denote by `F` and `G` the frames `(A , str₁)` and `(B , str₂)`. \begin{code} F : Frame (𝓤 ⁺) 𝓤 𝓤 F = A , str₁ G : Frame (𝓤 ⁺) 𝓤 𝓤 G = A , str₂ \end{code} We define a bunch of other abbreviations that we will use throughout this module. \begin{code} frame-data-of-F : frame-data 𝓤 𝓤 A frame-data-of-F = pr₁ str₁ frame-data-of-G : frame-data 𝓤 𝓤 A frame-data-of-G = pr₁ str₂ _≤₁_ : ⟨ F ⟩ → ⟨ F ⟩ → Ω 𝓤 _≤₁_ = λ x y → x ≤[ poset-of F ] y _≤₂_ : ⟨ G ⟩ → ⟨ G ⟩ → Ω 𝓤 _≤₂_ = λ x y → x ≤[ poset-of G ] y 𝟏₁ : ⟨ F ⟩ 𝟏₁ = 𝟏[ F ] 𝟏₂ : ⟨ G ⟩ 𝟏₂ = 𝟏[ G ] _∧₁_ : ⟨ F ⟩ → ⟨ F ⟩ → ⟨ F ⟩ _∧₁_ = λ x y → x ∧[ F ] y _∧₂_ : ⟨ G ⟩ → ⟨ G ⟩ → ⟨ G ⟩ _∧₂_ = λ x y → x ∧[ G ] y ⋁₁_ : Fam 𝓤 ⟨ F ⟩ → ⟨ F ⟩ ⋁₁_ = join-of F ⋁₂_ : Fam 𝓤 ⟨ G ⟩ → ⟨ G ⟩ ⋁₂_ = join-of G \end{code} We now prove some lemmas showing that, if the identity equivalence between frames `F` and `G` is homomorphic, then the frame structures must be equal. \begin{code} abstract homomorphic-identity-equivalence-gives-order-agreement : is-homomorphic F G (≃-refl A) holds → _≤₁_ = _≤₂_ homomorphic-identity-equivalence-gives-order-agreement h = dfunext fe λ x → dfunext fe λ y → † x y where iso : Isomorphismᵣ F G iso = isomorphism₀-to-isomorphismᵣ F G (≃-refl A , h) open Isomorphismᵣ iso † : (x y : A) → x ≤₁ y = x ≤₂ y † x y = ⇔-gives-= pe (x ≤₁ y) (x ≤₂ y) ‡ where ‡ : (x ≤₁ y) ⇔ (x ≤₂ y) = ⊤ ‡ = holds-gives-equal-⊤ pe fe (x ≤₁ y ⇔ x ≤₂ y) (β , γ) where β : (x ≤₁ y ⇒ x ≤₂ y) holds β = frame-morphisms-are-monotonic F G id s-is-homomorphism (x , y) γ : (x ≤₂ y ⇒ x ≤₁ y) holds γ = frame-morphisms-are-monotonic G F id r-is-homomorphism (x , y) homomorphic-identity-equivalence-gives-top-agreement : is-homomorphic F G (≃-refl A) holds → 𝟏[ F ] = 𝟏[ G ] homomorphic-identity-equivalence-gives-top-agreement η = id-preserves-top where iso : Isomorphismᵣ F G iso = isomorphism₀-to-isomorphismᵣ F G (≃-refl A , η) open Isomorphismᵣ iso using (𝓈; 𝓇) φ : F ─f·→ G φ = frame-homomorphism-to-frame-homomorphismᵣ F G 𝓈 open _─f·→_ φ using () renaming (h-preserves-top to id-preserves-top) homomorphic-identity-equivalence-gives-meet-agreement : is-homomorphic F G (≃-refl A) holds → meet-of F = meet-of G homomorphic-identity-equivalence-gives-meet-agreement h = dfunext fe λ x → dfunext fe λ y → id-preserves-meets x y where iso : Isomorphismᵣ F G iso = isomorphism₀-to-isomorphismᵣ F G (≃-refl A , h) open Isomorphismᵣ iso using (𝓈; 𝓇) φ : F ─f·→ G φ = frame-homomorphism-to-frame-homomorphismᵣ F G 𝓈 open _─f·→_ φ using () renaming (h-preserves-meets to id-preserves-meets) homomorphic-identity-equivalence-gives-join-agreement : is-homomorphic F G (≃-refl A) holds → join-of F = join-of G homomorphic-identity-equivalence-gives-join-agreement h = dfunext fe (frame-homomorphisms-preserve-all-joins′ F G (id , s-is-homomorphism)) where iso : Isomorphismᵣ F G iso = isomorphism₀-to-isomorphismᵣ F G (≃-refl A , h) open Isomorphismᵣ iso using (𝓈; 𝓇; s-is-homomorphism) φ : F ─f·→ G φ = frame-homomorphism-to-frame-homomorphismᵣ F G 𝓈 open _─f·→_ φ using () renaming (h-preserves-joins to id-preserves-joins) homomorphic-identity-equivalence-gives-frame-data-agreement : is-homomorphic F G (≃-refl A) holds → frame-data-of-F = frame-data-of-G homomorphic-identity-equivalence-gives-frame-data-agreement η = transport (λ - → _≤₁_ , 𝟏₁ , _∧₁_ , ⋁₁_ = - , 𝟏₂ , _∧₂_ , ⋁₂_) (homomorphic-identity-equivalence-gives-order-agreement η) (to-Σ-=' β) where δ : ⋁₁_ = ⋁₂_ δ = homomorphic-identity-equivalence-gives-join-agreement η γ : _∧₁_ , ⋁₁_ = _∧₂_ , ⋁₂_ γ = transport (λ - → _∧₁_ , ⋁₁_ = - , ⋁₂_) (homomorphic-identity-equivalence-gives-meet-agreement η) (to-Σ-=' δ) β : 𝟏₁ , _∧₁_ , ⋁₁_ = 𝟏₂ , _∧₂_ , ⋁₂_ β = transport (λ - → 𝟏₁ , _∧₁_ , ⋁₁_ = - , _∧₂_ , ⋁₂_) (homomorphic-identity-equivalence-gives-top-agreement η) (to-Σ-=' γ) \end{code} We use the lemmas that we proved above to conclude that the identity equivalence on `A` being homomorphic gives the equality of `str₁` and `str₂`. \begin{code} abstract homomorphic-equivalence-gives-structural-equality : is-homomorphic F G (≃-refl A) holds → str₁ = str₂ homomorphic-equivalence-gives-structural-equality = to-subtype-= satisfying-frame-laws-is-prop ∘ homomorphic-identity-equivalence-gives-frame-data-agreement open FrameIsomorphisms \end{code} The fact that `frame-structure` is a standard notion of structure is then an easy corollary. \begin{code} frame-sns-data : SNS (frame-structure 𝓤 𝓤) (𝓤 ⁺) frame-sns-data {𝓤} = ι , ρ , θ where ι : (F′ G′ : Frame (𝓤 ⁺) 𝓤 𝓤) → sip.⟨ F′ ⟩ ≃ sip.⟨ G′ ⟩ → 𝓤 ⁺ ̇ ι F′ G′ e = is-homomorphic F′ G′ e holds ρ : (L : Frame (𝓤 ⁺) 𝓤 𝓤) → ι L L (≃-refl sip.⟨ L ⟩) ρ L = 𝔦𝔡-is-frame-homomorphism L , 𝔦𝔡-is-frame-homomorphism L θ : {X : 𝓤 ⁺ ̇} (str₁ str₂ : frame-structure 𝓤 𝓤 X) → is-equiv (canonical-map ι ρ str₁ str₂) θ {X = X} str₁ str₂ = (homomorphic-equivalence-gives-structural-equality , †) , (homomorphic-equivalence-gives-structural-equality , ‡) where open SIP-For-Frames str₁ str₂ † : (h : is-homomorphic F G (≃-refl X) holds) → let p = homomorphic-equivalence-gives-structural-equality h in canonical-map ι ρ str₁ str₂ p = h † h = holds-is-prop (is-homomorphic F G (≃-refl X)) (canonical-map ι ρ str₁ str₂ (homomorphic-equivalence-gives-structural-equality h)) h ‡ : (p : str₁ = str₂) → homomorphic-equivalence-gives-structural-equality (canonical-map ι ρ str₁ str₂ p) = p ‡ p = frame-structure-is-set X 𝓤 𝓤 pe (homomorphic-equivalence-gives-structural-equality (canonical-map ι ρ str₁ str₂ p)) p \end{code} Finally, we get that the identity type between frames `F` and `G` is equivalent to the type of equivalences between them. \begin{code} characterization-of-frame-= : (F G : Frame (𝓤 ⁺) 𝓤 𝓤) → (F = G) ≃ (F ≃[ frame-sns-data ] G) characterization-of-frame-= {𝓤} F G = characterization-of-= (ua (𝓤 ⁺)) frame-sns-data F G \end{code} The notion of equivalence induced by `frame-sns-data` is logically equivalent to the notion of isomorphism of frames from module `FrameIsomorphism-Definition`. \begin{code} sns-equivalence-to-frame-isomorphism : (F G : Frame (𝓤 ⁺) 𝓤 𝓤) → F ≃[ frame-sns-data ] G → F ≅f≅ G sns-equivalence-to-frame-isomorphism F G (f , e , φ) = isomorphism₀-to-isomorphismᵣ F G ((f , e) , φ) isomorphism-to-sns-equivalence : (F G : Frame (𝓤 ⁺) 𝓤 𝓤) → F ≅f≅ G → F ≃[ frame-sns-data ] G isomorphism-to-sns-equivalence F G iso = ⌜ e ⌝ , ⌜⌝-is-equiv e , † where iso₀ : Isomorphism₀ F G iso₀ = isomorphismᵣ-to-isomorphism₀ F G iso e : ⟨ F ⟩ ≃ ⟨ G ⟩ e = pr₁ iso₀ † : homomorphic frame-sns-data F G e † = pr₂ iso₀ \end{code} Combining `isomorphism-to-sns-equivalence` with `characterization-of-frame-=`, we get that two isomorphic frames are equal. \begin{code} isomorphic-frames-are-equal : (F G : Frame (𝓤 ⁺) 𝓤 𝓤) → F ≅f≅ G → F = G isomorphic-frames-are-equal {𝓤} F G iso = h (isomorphism-to-sns-equivalence F G iso) where e : (F = G) ≃ (F ≃[ frame-sns-data ] G) e = characterization-of-frame-= F G h : F ≃[ frame-sns-data ] G → F = G h = inverse ⌜ e ⌝ (⌜⌝-is-equiv e) \end{code}