--- title: Lemmas on the duality of compact opens of spectral locales author: Ayberk Tosun date-completed: 2024-06-09 --- In this module, we prove two important lemmas about the distributive lattice of compact opens of spectral locales: 1. Every _large and locally small_ spectral locale `X` is homeomorphic to the spectrum of its _small_ distributive lattice `𝒦(X)` of compact opens. - This is given in the proof called `X-is-homeomorphic-to-spec-𝒦⁻X`. 2. Every _small_ distributive lattice `L` is isomorphic to the distributive lattice of compact opens of its _large and locally small_ spectrum locale. - This is given in the proof called `L-is-isomorphic-to-𝒦⁻-spec-L`. The type equivalence is given in the proof `spec-dlat-equivalence`. \begin{code} {-# OPTIONS --safe --without-K --lossy-unification #-} open import MLTT.List hiding ([_]) open import MLTT.Spartan hiding (J; rhs) open import UF.Base open import UF.Embeddings open import UF.FunExt open import UF.PropTrunc open import UF.Size open import UF.Subsingletons open import UF.UA-FunExt open import UF.Univalence module Locales.Spectrality.LatticeOfCompactOpens-Duality (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.AdjointFunctorTheoremForFrames pt fe open import Locales.Compactness.Definition pt fe open import Locales.ContinuousMap.Definition pt fe open import Locales.ContinuousMap.FrameHomomorphism-Definition pt fe open import Locales.ContinuousMap.FrameIsomorphism-Definition pt fe open import Locales.ContinuousMap.Homeomorphism-Definition pt fe open import Locales.ContinuousMap.Homeomorphism-Properties ua pt sr open import Locales.DirectedFamily-Poset pt fe open import Locales.DistributiveLattice.Definition fe pt open import Locales.DistributiveLattice.Homomorphism fe pt open import Locales.DistributiveLattice.Ideal pt fe pe open import Locales.DistributiveLattice.Ideal-Properties pt fe pe open import Locales.DistributiveLattice.Isomorphism fe pt open import Locales.DistributiveLattice.Resizing ua pt sr open import Locales.DistributiveLattice.Spectrum fe pe pt open import Locales.DistributiveLattice.Spectrum-Properties fe pe pt sr open import Locales.Frame pt fe open import Locales.GaloisConnection pt fe open import Locales.SmallBasis pt fe sr open import Locales.Spectrality.LatticeOfCompactOpens ua pt sr open import Locales.Spectrality.SpectralLocale pt fe open import Slice.Family open import UF.Classifiers open import UF.Equiv hiding (_■) open import UF.Logic open import UF.Powerset-MultiUniverse hiding (𝕋) open import UF.SubtypeClassifier open AllCombinators pt fe hiding (_∨_) open Locale open PropositionalTruncation pt hiding (_∨_) \end{code} We fix a large and locally small locale `X`, assumed to be spectral with a small type of compact opens. \begin{code} module 𝒦-Duality₁ (X : Locale (𝓤 ⁺) 𝓤 𝓤) (σ₀ : is-spectral-with-small-basis ua X holds) where open 𝒦-Lattice X σ₀ using (𝟏ₖ; 𝟎ₖ; 𝒦⦅X⦆-is-small; 𝒦⦅X⦆; σ; ιₖ-preserves-∨; ιₖ-preserves-∧) renaming (𝒦⁻ to 𝒦⁻X) public \end{code} We define some shorthand notation for convenience. We denote by `e` the equivalence between `𝒦 X`, the type of compact opens of `X`, and its small copy `𝒦⁻X`. \begin{code} e : 𝒦⁻X ≃ 𝒦 X e = resizing-condition 𝒦⦅X⦆-is-small open DistributiveLatticeResizing 𝒦⦅X⦆ 𝒦⁻X (≃-sym e) renaming (Lᶜ to 𝒦-X⁻) public open DefnOfFrameOfIdeal 𝒦-X⁻ \end{code} We denote by `spec-𝒦⁻X` the spectrum of `𝒦⁻X`. \begin{code} spec-𝒦⁻X : Locale (𝓤 ⁺) 𝓤 𝓤 spec-𝒦⁻X = DefnOfFrameOfIdeal.spectrum 𝒦-X⁻ \end{code} The map `ι` below is the inclusion of `𝒦⁻X` into `𝒪(X)`. \begin{code} ι : ∣ 𝒦-X⁻ ∣ᵈ → ⟨ 𝒪 X ⟩ ι K = pr₁ (r K) ι-gives-compact-opens : (K : 𝒦⁻X) → is-compact-open X (ι K) holds ι-gives-compact-opens K = pr₂ (r K) \end{code} This map is quite obviously a frame homomorphism, but writing this fact down involves some bureaucracy which we handle below. \begin{code} open Ideal hiding (I; I-is-downward-closed) open DistributiveLattice 𝒦-X⁻ using () renaming (𝟎 to 𝟎⁻; 𝟏 to 𝟏⁻; _∨_ to _∨⁻_; _∧_ to _∧⁻_) open DistributiveLattice 𝒦⦅X⦆ using (𝟎; 𝟏; _∨_) renaming (_∧_ to _∧L_) ι-preserves-𝟎 : ι 𝟎⁻ = 𝟎[ 𝒪 X ] ι-preserves-𝟎 = ap pr₁ (inverses-are-sections' e 𝟎) ι-preserves-𝟏 : ι 𝟏⁻ = 𝟏[ 𝒪 X ] ι-preserves-𝟏 = ap pr₁ (inverses-are-sections' e 𝟏) open PosetReasoning (poset-of (𝒪 X)) open OperationsOnCompactOpens X σ ι-preserves-∨ : (K₁ K₂ : 𝒦⁻X) → ι (K₁ ∨⁻ K₂) = ι K₁ ∨[ 𝒪 X ] ι K₂ ι-preserves-∨ K₁ K₂ = ιₖ (r (K₁ ∨⁻ K₂)) =⟨ Ⅰ ⟩ ιₖ (r K₁ ∨ r K₂) =⟨ Ⅱ ⟩ pr₁ (r K₁) ∨[ 𝒪 X ] pr₁ (r K₂) =⟨ refl ⟩ ι K₁ ∨[ 𝒪 X ] ι K₂ ∎ where Ⅰ = ap pr₁ (r-preserves-∨ K₁ K₂) Ⅱ = ιₖ-preserves-∨ (r K₁) (r K₂) ι-preserves-∧ : (K₁ K₂ : 𝒦⁻X) → ι (K₁ ∧⁻ K₂) = ι K₁ ∧[ 𝒪 X ] ι K₂ ι-preserves-∧ K₁ K₂ = ι (K₁ ∧⁻ K₂) =⟨ refl ⟩ pr₁ (r (K₁ ∧⁻ K₂)) =⟨ Ⅰ ⟩ pr₁ (r K₁ ∧L r K₂) =⟨ Ⅱ ⟩ ι K₁ ∧[ 𝒪 X ] ι K₂ ∎ where Ⅰ = ap pr₁ (r-preserves-∧ K₁ K₂) Ⅱ = ιₖ-preserves-∧ (r K₁) (r K₂) ι-is-monotone : (K₁ K₂ : 𝒦⁻X) → (K₁ ≤ᵈ[ 𝒦-X⁻ ] K₂ ⇒ ι K₁ ≤[ poset-of (𝒪 X) ] ι K₂) holds ι-is-monotone K₁ K₂ p = connecting-lemma₃ (𝒪 X) † where † : ι K₂ = ι K₁ ∨[ 𝒪 X ] ι K₂ † = ι K₂ =⟨ Ⅰ ⟩ ι (K₁ ∨⁻ K₂) =⟨ Ⅱ ⟩ ι K₁ ∨[ 𝒪 X ] ι K₂ ∎ where Ⅰ = ap ι (orderᵈ-implies-orderᵈ-∨ 𝒦-X⁻ p ⁻¹) Ⅱ = ι-preserves-∨ K₁ K₂ ιₘ : poset-ofᵈ 𝒦-X⁻ ─m→ poset-of (𝒪 X) ιₘ = ι , λ (K₁ , K₂) → ι-is-monotone K₁ K₂ \end{code} Furthermore, we write down the fact that `ι` is an order embedding. \begin{code} ι-is-order-embedding : (K₁ K₂ : 𝒦⁻X) → (ι K₁ ≤[ poset-of (𝒪 X) ] ι K₂) holds → (K₁ ≤ᵈ[ 𝒦-X⁻ ] K₂) holds ι-is-order-embedding K₁ K₂ p = s (r K₁ ∧L r K₂) =⟨ Ⅰ ⟩ s (r K₁) =⟨ Ⅱ ⟩ K₁ ∎ where ※ : pr₁ (r K₁) ∧[ 𝒪 X ] pr₁ (r K₂) = ι K₁ ※ = connecting-lemma₁ (𝒪 X) p ⁻¹ Ⅰ = ap s (to-𝒦-= X _ (pr₂ (r K₁)) ※) Ⅱ = inverses-are-retractions' e K₁ \end{code} Using the map `ι`, we define the map `ϕ₀` below. This is essentially the principal ideal map, but goes through the small type `𝒦⁻X` of compact opens. \begin{code} ϕ₀ : ⟨ 𝒪 X ⟩ → 𝓟 𝒦⁻X ϕ₀ U = λ c → ι c ≤[ poset-of (𝒪 X) ] U \end{code} We now prove that this map always gives ideals. \begin{code} ϕ₀-contains-𝟎 : (U : ⟨ 𝒪 X ⟩) → 𝟎⁻ ∈ ϕ₀ U ϕ₀-contains-𝟎 U = ι 𝟎⁻ =⟨ Ⅰ ⟩ₚ 𝟎[ 𝒪 X ] ≤⟨ Ⅱ ⟩ U ■ where Ⅰ = ι-preserves-𝟎 Ⅱ = 𝟎-is-bottom (𝒪 X) U ϕ₀-is-downward-closed : (U : ⟨ 𝒪 X ⟩) → is-downward-closed 𝒦-X⁻ (ϕ₀ U) holds ϕ₀-is-downward-closed U K₁ K₂ p μ = ιₖ (r K₁) ≤⟨ Ⅰ ⟩ ιₖ (r K₂) ≤⟨ Ⅱ ⟩ U ■ where Ⅰ = ι-is-monotone K₁ K₂ p Ⅱ = μ ϕ₀-is-closed-under-∨ : (U : ⟨ 𝒪 X ⟩) → is-closed-under-binary-joins 𝒦-X⁻ (ϕ₀ U) holds ϕ₀-is-closed-under-∨ U K₁ K₂ μ₁ μ₂ = ι (K₁ ∨⁻ K₂) =⟨ Ⅰ ⟩ₚ ι K₁ ∨[ 𝒪 X ] ι K₂ ≤⟨ Ⅱ ⟩ U ■ where Ⅰ = ι-preserves-∨ K₁ K₂ Ⅱ = ∨[ 𝒪 X ]-least μ₁ μ₂ \end{code} We denote by `ϕ` the version of `ϕ₀` packaged up with the proof that it always gives ideals. \begin{code} ϕ : ⟨ 𝒪 X ⟩ → Ideal 𝒦-X⁻ ϕ U = record { I = ϕ₀ U ; I-is-inhabited = ∣ 𝟎⁻ , ϕ₀-contains-𝟎 U ∣ ; I-is-downward-closed = ϕ₀-is-downward-closed U ; I-is-closed-under-∨ = ϕ₀-is-closed-under-∨ U } \end{code} We follow Johnstone’s proof from Stone Spaces (II.3.2) [1] where he uses the symbol `ϕ` for this function. We now show that the map `ϕ` preserves finite meets. \begin{code} abstract ϕ-preserves-top : ϕ 𝟏[ 𝒪 X ] = 𝟏[ 𝒪 spec-𝒦⁻X ] ϕ-preserves-top = only-𝟏-is-above-𝟏 (𝒪 spec-𝒦⁻X) (ϕ 𝟏[ 𝒪 X ]) † where † : (𝟏[ 𝒪 spec-𝒦⁻X ] ⊆ᵢ ϕ 𝟏[ 𝒪 X ]) holds † K _ = 𝟏-is-top (𝒪 X) (ι K) open IdealNotation 𝒦-X⁻ ϕ-preserves-∧ : (U V : ⟨ 𝒪 X ⟩) → ϕ (U ∧[ 𝒪 X ] V) = ϕ U ∧ᵢ ϕ V ϕ-preserves-∧ U V = ≤-is-antisymmetric poset-of-ideals † ‡ where † : ϕ (U ∧[ 𝒪 X ] V) ⊆ᵢ (ϕ U ∧ᵢ ϕ V) holds † K p = p₁ , p₂ where p₁ : K ∈ⁱ ϕ U p₁ = ι K ≤⟨ p ⟩ U ∧[ 𝒪 X ] V ≤⟨ ∧[ 𝒪 X ]-lower₁ U V ⟩ U ■ p₂ : K ∈ⁱ ϕ V p₂ = ι K ≤⟨ p ⟩ U ∧[ 𝒪 X ] V ≤⟨ ∧[ 𝒪 X ]-lower₂ U V ⟩ V ■ ‡ : (ϕ U ∧ᵢ ϕ V) ⊆ᵢ ϕ (U ∧[ 𝒪 X ] V) holds ‡ K (p₁ , p₂) = ∧[ 𝒪 X ]-greatest U V (ι K) p₁ p₂ ϕ-is-monotone : is-monotonic (poset-of (𝒪 X)) poset-of-ideals ϕ holds ϕ-is-monotone (U , V) p = connecting-lemma₂ frame-of-ideals † where q : U = U ∧[ 𝒪 X ] V q = connecting-lemma₁ (𝒪 X) p † : ϕ U = ϕ U ∧ᵢ ϕ V † = ϕ U =⟨ Ⅰ ⟩ ϕ (U ∧[ 𝒪 X ] V) =⟨ Ⅱ ⟩ ϕ U ∧ᵢ ϕ V ∎ where Ⅰ = ap ϕ q Ⅱ = ϕ-preserves-∧ U V open FrameHomomorphisms \end{code} We denote by `ϕₘ` the version of `ϕ` packaged up with the proof that is a monotone map. \begin{code} ϕₘ : poset-of (𝒪 X) ─m→ poset-of-ideals ϕₘ = ϕ , ϕ-is-monotone \end{code} This map also preserves joins, but because we derive this from the fact that it is an equivalence, we will delay its proof for a bit. We now construct the opposite direction of the equivalence formed by `ϕ`. This is simply the map that sends an ideal to its join `I ↦ ⋁ I`. But because ideals are defined using powersets, we use `𝕋` to work with the total space of the ideal before taking its join. We call this map simply `join`. \begin{code} open classifier-single-universe 𝓤 open Directed-Families-On-Posets (poset-ofᵈ 𝒦-X⁻) (poset-of (𝒪 X)) open IdealProperties 𝒦-X⁻ 𝒦-below : Ideal 𝒦-X⁻ → Fam 𝓤 ⟨ 𝒪 X ⟩ 𝒦-below ℐ = ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ ℐ) ⁆ 𝒦-below-is-directed : (ℐ : Ideal 𝒦-X⁻) → is-directed (𝒪 X) ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ ℐ) ⁆ holds 𝒦-below-is-directed ℐ = monotone-image-on-directed-set-is-directed ιₘ (𝕋 𝒦⁻X (_∈ⁱ ℐ)) (ideals-are-directed ℐ) where open Ideal ℐ renaming (I-contains-𝟎 to I-contains-𝟎⁻) join : Ideal 𝒦-X⁻ → ⟨ 𝒪 X ⟩ join ℐ = ⋁[ 𝒪 X ] (𝒦-below ℐ) \end{code} The map `join` preserves the top element. \begin{code} join-preserves-top : join 𝟏ᵢ = 𝟏[ 𝒪 X ] join-preserves-top = only-𝟏-is-above-𝟏 (𝒪 X) (join 𝟏ᵢ) † where ‡ : (ι (s 𝟏ₖ) ≤[ poset-of (𝒪 X)] join 𝟏ᵢ) holds ‡ = ⋁[ 𝒪 X ]-upper ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ 𝟏ᵢ) ⁆ (s 𝟏ₖ , 𝟏ᵈ-is-top 𝒦-X⁻ (s 𝟏ₖ)) † : (𝟏[ 𝒪 X ] ≤[ poset-of (𝒪 X) ] join 𝟏ᵢ) holds † = transport (λ - → (- ≤[ poset-of (𝒪 X) ] join 𝟏ᵢ) holds) ι-preserves-𝟏 ‡ \end{code} The map `join` preserves binary meets. \begin{code} join-preserves-binary-meets : (ℐ 𝒥 : Ideal 𝒦-X⁻) → join (ℐ ∧ᵢ 𝒥) = join ℐ ∧[ 𝒪 X ] join 𝒥 join-preserves-binary-meets ℐ 𝒥 = join (ℐ ∧ᵢ 𝒥) =⟨ refl ⟩ ⋁[ 𝒪 X ] ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ ℐ ∧ᵢ 𝒥) ⁆ =⟨ Ⅰ ⟩ ⋁⟨ ((i , _) , (j , _)) ∶ (_ × _) ⟩ ι i ∧[ 𝒪 X ] ι j =⟨ Ⅱ ⟩ (⋁[ 𝒪 X ] ⁅ ι K ∣ K ε 𝕋 𝒦⁻X I ⁆) ∧[ 𝒪 X ] (⋁[ 𝒪 X ] ⁅ ι K ∣ K ε 𝕋 𝒦⁻X J ⁆) =⟨ refl ⟩ join ℐ ∧[ 𝒪 X ] join 𝒥 ∎ where I = _∈ⁱ ℐ J = _∈ⁱ 𝒥 open JoinNotation (join-of (𝒪 X)) open Joins (λ x y → x ≤[ poset-of (𝒪 X) ] y) † : ((⋁[ 𝒪 X ] ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ ℐ ∧ᵢ 𝒥) ⁆) ≤[ poset-of (𝒪 X) ] (⋁⟨ ((i , _) , (j , _)) ∶ _ ⟩ ι i ∧[ 𝒪 X ] ι j)) holds † = cofinal-implies-join-covered (𝒪 X) _ _ †₀ where †₀ : cofinal-in (𝒪 X) _ _ holds †₀ (K , μ₁ , μ₂) = ∣ ((K , μ₁) , (K , μ₂)) , ※ ∣ where ※ : (ι K ≤[ poset-of (𝒪 X) ] (ι K ∧[ 𝒪 X ] ι K)) holds ※ = reflexivity+ (poset-of (𝒪 X)) (∧[ 𝒪 X ]-is-idempotent (ι K)) ‡ : ((⋁⟨ ((i , _) , (j , _)) ∶ _ ⟩ ι i ∧[ 𝒪 X ] ι j) ≤[ poset-of (𝒪 X) ] (⋁[ 𝒪 X ] ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ ℐ ∧ᵢ 𝒥) ⁆)) holds ‡ = cofinal-implies-join-covered (𝒪 X) _ _ ‡₀ where ‡₀ : cofinal-in (𝒪 X) _ _ holds ‡₀ ((K₁ , μ₁) , (K₂ , μ₂)) = ∣ (K₁ ∧⁻ K₂ , γ , β) , ϑ ∣ where open Ideal ℐ using () renaming (I-is-downward-closed to ℐ-is-downward-closed) open Ideal 𝒥 using () renaming (I-is-downward-closed to 𝒥-is-downward-closed) γ : (K₁ ∧⁻ K₂) ∈ⁱ ℐ γ = ℐ-is-downward-closed (K₁ ∧⁻ K₂) K₁ (∧-is-a-lower-bound₁ 𝒦-X⁻ K₁ K₂) μ₁ β : (K₁ ∧⁻ K₂) ∈ⁱ 𝒥 β = 𝒥-is-downward-closed (K₁ ∧⁻ K₂) K₂ (∧-is-a-lower-bound₂ 𝒦-X⁻ K₁ K₂) μ₂ ϑ : ((ι K₁ ∧[ 𝒪 X ] ι K₂) ≤[ poset-of (𝒪 X) ] ι (K₁ ∧⁻ K₂)) holds ϑ = ι K₁ ∧[ 𝒪 X ] ι K₂ =⟨ ι-preserves-∧ K₁ K₂ ⁻¹ ⟩ₚ ι (K₁ ∧⁻ K₂) ■ Ⅰ = ≤-is-antisymmetric (poset-of (𝒪 X)) † ‡ Ⅱ = distributivity+ (𝒪 X) ⁅ ι K ∣ K ε 𝕋 𝒦⁻X I ⁆ ⁅ ι K ∣ K ε 𝕋 𝒦⁻X J ⁆ ⁻¹ \end{code} We now show that the map `ϕ` is the left inverse of the map `join` as promised. \begin{code} ϕ-cancels-join : (ℐ : Ideal 𝒦-X⁻) → ϕ (join ℐ) = ℐ ϕ-cancels-join ℐ = ideal-extensionality 𝒦-X⁻ (ϕ (join ℐ)) ℐ † ‡ where open Ideal ℐ using () renaming (I-is-downward-closed to ℐ-is-downward-closed) † : (ϕ (join ℐ) ⊆ᵢ ℐ) holds † K μ = ∥∥-rec (holds-is-prop (K ∈ᵢ ℐ)) ‡ (ι-gives-compact-opens K ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ ℐ) ⁆ (𝒦-below-is-directed ℐ) μ) where ‡ : Σ (K′ , _) ꞉ index ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ ℐ) ⁆ , (ι K ≤[ poset-of (𝒪 X) ] ι K′) holds → K ∈ⁱ ℐ ‡ ((K′ , φ) , p) = ℐ-is-downward-closed K K′ (ι-is-order-embedding K K′ p) φ ‡ : (ℐ ⊆ᵢ ϕ (join ℐ)) holds ‡ K μ = ⋁[ 𝒪 X ]-upper ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ ℐ) ⁆ (K , μ) \end{code} Furthermore, it is also the right inverse, the proof of which is given below and is called `join-cancels-ϕ`. \begin{code} σᴰ : spectralᴰ X σᴰ = spectral-and-small-𝒦-implies-spectralᴰ X (pr₁ σ₀) (pr₂ σ₀) basis-X : basisᴰ (𝒪 X) basis-X = spectral-and-small-𝒦-gives-basis X (pr₁ σ₀) (pr₂ σ₀) basis↑-X : directed-basisᴰ (𝒪 X) basis↑-X = spectral-and-small-𝒦-gives-directed-basis X (pr₁ σ₀) (pr₂ σ₀) ℬ↑-X : Fam 𝓤 ⟨ 𝒪 X ⟩ ℬ↑-X = pr₁ basis↑-X join-cancels-ϕ : (U : ⟨ 𝒪 X ⟩) → join (ϕ U) = U join-cancels-ϕ U = transport (λ - → join (ϕ -) = -) (c ⁻¹) † where J : Fam 𝓤 (index (basisₛ X σᴰ)) J = cover-indexₛ X σᴰ U S : Fam 𝓤 ⟨ 𝒪 X ⟩ S = covering-familyₛ X σᴰ U c : U = ⋁[ 𝒪 X ] S c = basisₛ-covers-do-cover-eq X σᴰ U ψ : (i : index S) → (S [ i ] ≤[ poset-of (𝒪 X) ] U) holds ψ = pr₁ (basisₛ-covers-do-cover X σᴰ U) β : cofinal-in (𝒪 X) S ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ (ϕ U)) ⁆ holds β i = ∣ (s (S [ i ] , κ) , p) , † ∣ where open Ideal (ϕ U) using (I-is-downward-closed) κ : is-compact-open X (S [ i ]) holds κ = basisₛ-consists-of-compact-opens X σᴰ (J [ i ]) p : (pr₁ (r (s (S [ i ] , κ))) ≤[ poset-of (𝒪 X) ] U) holds p = pr₁ (r (s (S [ i ] , κ))) =⟨ Ⅰ ⟩ₚ S [ i ] ≤⟨ ψ i ⟩ U ■ where Ⅰ = ap pr₁ (inverses-are-sections' e (S [ i ] , κ)) Ⅱ = ψ i † : (S [ i ] ≤[ poset-of (𝒪 X) ] pr₁ (r (s (S [ i ] , κ)))) holds † = reflexivity+ (poset-of (𝒪 X)) (ap pr₁ (inverses-are-sections' e (S [ i ] , κ) ⁻¹ ) ) γ : cofinal-in (𝒪 X) ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ (ϕ U)) ⁆ S holds γ (K , p) = ∣ ((K , p) ∷ []) , † ∣ where † : (ι K ≤[ poset-of (𝒪 X) ] S [ (K , p ∷ []) ]) holds † = reflexivity+ (poset-of (𝒪 X)) (𝟎-left-unit-of-∨ (𝒪 X) (ι K) ⁻¹) Ⅱ = bicofinal-implies-same-join (𝒪 X) S _ β γ ⁻¹ ♣ : (join (ϕ (⋁[ 𝒪 X ] S)) ≤[ poset-of (𝒪 X) ] (⋁[ 𝒪 X ] ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ (ϕ U)) ⁆)) holds ♣ = cofinal-implies-join-covered (𝒪 X) _ _ ϵ where ϵ : cofinal-in (𝒪 X) (𝒦-below (ϕ (join-of (𝒪 X) S))) ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ (ϕ U)) ⁆ holds ϵ (K , q) = ∣ (K , (transport (λ - → K ∈ⁱ ϕ -) (c ⁻¹) q)) , ≤-is-reflexive (poset-of (𝒪 X)) (ι K) ∣ ♠ : ((⋁[ 𝒪 X ] ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ (ϕ U)) ⁆) ≤[ poset-of (𝒪 X) ] join (ϕ (⋁[ 𝒪 X ] S))) holds ♠ = cofinal-implies-join-covered (𝒪 X) _ _ δ where δ : cofinal-in (𝒪 X) ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ (ϕ U)) ⁆ (𝒦-below (ϕ (⋁[ 𝒪 X ] S))) holds δ (K , q) = ∣ (K , transport (λ - → K ∈ⁱ ϕ -) c q) , ≤-is-reflexive (poset-of (𝒪 X)) (ι K) ∣ Ⅰ = ≤-is-antisymmetric (poset-of (𝒪 X)) ♣ ♠ † : join (ϕ (⋁[ 𝒪 X ] S)) = ⋁[ 𝒪 X ] S † = join (ϕ (⋁[ 𝒪 X ] S)) =⟨ Ⅰ ⟩ ⋁[ 𝒪 X ] ⁅ ι K ∣ K ε 𝕋 𝒦⁻X (_∈ⁱ (ϕ U)) ⁆ =⟨ Ⅱ ⟩ ⋁[ 𝒪 X ] S ∎ \end{code} The map `join` is monotone. \begin{code} join-is-monotone : is-monotonic poset-of-ideals (poset-of (𝒪 X)) join holds join-is-monotone (U , V) p = connecting-lemma₂ (𝒪 X) † where Ⅰ = ap join (connecting-lemma₁ frame-of-ideals p) Ⅱ = join-preserves-binary-meets U V abstract † : join U = join U ∧[ 𝒪 X ] join V † = join U =⟨ Ⅰ ⟩ join (U ∧ᵢ V) =⟨ Ⅱ ⟩ join U ∧[ 𝒪 X ] join V ∎ joinₘ : poset-of-ideals ─m→ poset-of (𝒪 X) joinₘ = join , join-is-monotone \end{code} We now prove that the maps `ϕ` and `join` preserve joins using the posetal Adjoint Functor Theorem for frames. \begin{code} open AdjointFunctorTheorem X-has-basis : has-basis (𝒪 X) holds X-has-basis = ∣ spectralᴰ-implies-basisᴰ X σᴰ ∣ spec-𝒦⁻X-has-basis : has-basis (𝒪 spec-𝒦⁻X) holds spec-𝒦⁻X-has-basis = ∣ Spectrality.ℬ-spec 𝒦-X⁻ , Spectrality.ℬ-spec-is-basis 𝒦-X⁻ ∣ ϕ-is-left-adjoint-of-join : let open GaloisConnectionBetween (poset-of (𝒪 X)) poset-of-ideals in (ϕₘ ⊣ joinₘ) holds ϕ-is-left-adjoint-of-join = monotone-equivalences-are-adjoints spec-𝒦⁻X X X-has-basis joinₘ ϕₘ join-cancels-ϕ ϕ-cancels-join ϕ-is-right-adjoint-to-join : let open GaloisConnectionBetween poset-of-ideals (poset-of (𝒪 X)) in (joinₘ ⊣ ϕₘ) holds ϕ-is-right-adjoint-to-join = monotone-equivalences-are-adjoints X spec-𝒦⁻X spec-𝒦⁻X-has-basis ϕₘ joinₘ ϕ-cancels-join join-cancels-ϕ ϕ-preserves-joins : (S : Fam 𝓤 ⟨ 𝒪 X ⟩) → ϕ (⋁[ 𝒪 X ] S) = ⋁ᵢ ⁅ ϕ U ∣ U ε S ⁆ ϕ-preserves-joins = aft-forward spec-𝒦⁻X X X-has-basis ϕₘ (joinₘ , ϕ-is-left-adjoint-of-join) join-preserves-joins : (S : Fam 𝓤 (Ideal 𝒦-X⁻)) → join (⋁ᵢ S) = ⋁[ 𝒪 X ] ⁅ join I ∣ I ε S ⁆ join-preserves-joins = aft-forward X spec-𝒦⁻X spec-𝒦⁻X-has-basis joinₘ (ϕₘ , ϕ-is-right-adjoint-to-join) \end{code} We can now package things up into the following proof that `ϕ` and `join` are frame homomorphisms. \begin{code} ϕ-is-a-frame-homomorphism : is-a-frame-homomorphism (𝒪 X) (𝒪 spec-𝒦⁻X) ϕ holds ϕ-is-a-frame-homomorphism = ϕ-preserves-top , ϕ-preserves-∧ , † where open Joins (λ x y → x ≤[ poset-of (𝒪 spec-𝒦⁻X) ] y) † : preserves-joins (𝒪 X) (𝒪 spec-𝒦⁻X) ϕ holds † S = transport (λ - → (- is-lub-of ⁅ ϕ I ∣ I ε S ⁆) holds) (ϕ-preserves-joins S ⁻¹) (⋁[ 𝒪 spec-𝒦⁻X ]-upper _ , ⋁[ 𝒪 spec-𝒦⁻X ]-least _) join-is-a-frame-homomorphism : is-a-frame-homomorphism (𝒪 spec-𝒦⁻X) (𝒪 X) join holds join-is-a-frame-homomorphism = join-preserves-top , join-preserves-binary-meets , † where open Joins (λ x y → x ≤[ poset-of (𝒪 X) ] y) † : preserves-joins (𝒪 spec-𝒦⁻X) (𝒪 X) join holds † S = transport (λ - → (- is-lub-of ⁅ join I ∣ I ε S ⁆) holds) (join-preserves-joins S ⁻¹) (⋁[ 𝒪 X ]-upper _ , ⋁[ 𝒪 X ]-least _) \end{code} The type `𝒪 X` is equivalent to the type `Ideal 𝒦-X⁻`. \begin{code} open FrameIsomorphisms 𝒪X-is-equivalent-to-ideals-of-𝒦⁻X : ⟨ 𝒪 X ⟩ ≃ Ideal 𝒦-X⁻ 𝒪X-is-equivalent-to-ideals-of-𝒦⁻X = ϕ , (join , †) , (join , ‡) where † : (ϕ ∘ join) ∼ id † = ϕ-cancels-join ‡ : (join ∘ ϕ) ∼ id ‡ = join-cancels-ϕ \end{code} Moreover, this equivalence is homeomorphic. \begin{code} X-is-homeomorphic-to-spec-𝒦⁻X : spec-𝒦⁻X ≅c≅ X X-is-homeomorphic-to-spec-𝒦⁻X = isomorphism₀-to-isomorphismᵣ (𝒪 X) (𝒪 spec-𝒦⁻X) 𝒾 where 𝒾 : Isomorphism₀ (𝒪 X) (𝒪 spec-𝒦⁻X) 𝒾 = 𝒪X-is-equivalent-to-ideals-of-𝒦⁻X , ϕ-is-a-frame-homomorphism , join-is-a-frame-homomorphism \end{code} From all this, we can now conclude that `is-spectral-with-small-basis` implies the definition of spectrality that says “homeomorphic to the spectrum of a distributive lattice”. We use the name `is-spectral·` for this latter notion of being homeomorphic to the spectrum of some distributive lattice. \begin{code} open DefnOfFrameOfIdeal renaming (spectrum to spec) is-spectral· : Locale (𝓤 ⁺) 𝓤 𝓤 → Ω (𝓤 ⁺) is-spectral· {𝓤} X = Ǝ L ꞉ DistributiveLattice 𝓤 , X ≅c≅ spec L spectral-implies-spectral· : (X : Locale (𝓤 ⁺) 𝓤 𝓤) → (is-spectral-with-small-basis ua X ⇒ is-spectral· X) holds spectral-implies-spectral· X σ = ∣ 𝒦-X⁻ , ≅c-sym spec-𝒦⁻X X X-is-homeomorphic-to-spec-𝒦⁻X ∣ where open 𝒦-Duality₁ X σ \end{code} \section{From L to 𝒦(Spec(L))} In this section, we show that every distributive lattice `L` is isomorphic to the small distributive lattice of compact opens of its spectrum. The proof, given below, is called `L-is-isomorphic-to-𝒦⁻-spec-L`. We work in a module parameterized by a small distributive 𝓤-lattice `L`. \begin{code} module 𝒦-Duality₂ (L : DistributiveLattice 𝓤) where \end{code} We denote by `spec-L` the spectrum of the lattice `L`, which is a large, locally small, and small cocomplete locale. \begin{code} open DefnOfFrameOfIdeal spec-L : Locale (𝓤 ⁺) 𝓤 𝓤 spec-L = spectrum L \end{code} We also define an abbreviation for the proof that `spectrum L` is a spectral locale (with a small basis). \begin{code} spec-L-is-ssb : is-spectral-with-small-basis ua spec-L holds spec-L-is-ssb = Spectrality.spec-L-is-spectral L , Spectrality.spec-L-has-small-𝒦 L open IdealProperties open Spectrality L open PrincipalIdeals L open 𝒦-Duality₁ spec-L spec-L-is-ssb \end{code} We denote by `𝒦⁻-spec-L` the small distributive lattice of compact opens of `spec-L`. \begin{code} 𝒦⁻-spec-L : DistributiveLattice 𝓤 𝒦⁻-spec-L = 𝒦-X⁻ \end{code} We now start working towards the construction of an isomorphism of distributive lattices: ```text L ≅ 𝒦⁻(spec(L)) ``` The isomorphism that we construct consists of the maps: 1. `to-𝒦-spec-L : ∣ L ∣ᵈ → ∣ 𝒦⁻-spec-L ∣ᵈ`, and 2. `back-to-L : ∣ 𝒦⁻-spec-L ∣ᵈ → ∣ L ∣ᵈ`. We first construct the map `to-𝒦-spec-L`. We follow our usual convention of denoting by the subscript `₀` the preliminary version of the construction in consideration, which is then paired up with the proof that it satisfies some property. \begin{code} to-𝒦-spec-L₀ : ∣ L ∣ᵈ → ∣ 𝒦⁻-spec-L ∣ᵈ to-𝒦-spec-L₀ = s ∘ ↓ₖ_ \end{code} The map `to-𝒦-spec-L₀` preserves binary meets. \begin{code} open DistributiveLattice open OperationsOnCompactOpens spec-L spec-L-is-spectral to-𝒦-spec-L-preserves-∧ : preserves-∧ L 𝒦⁻-spec-L to-𝒦-spec-L₀ holds to-𝒦-spec-L-preserves-∧ x y = s (↓ₖ (x ∧L y)) =⟨ Ⅰ ⟩ s ((↓ₖ x) ∧ₖ (↓ₖ y)) =⟨ Ⅱ ⟩ to-𝒦-spec-L₀ x ∧· to-𝒦-spec-L₀ y ∎ where open DistributiveLattice L renaming (_∧_ to _∧L_) open DistributiveLattice 𝒦⁻-spec-L renaming (_∧_ to _∧·_) † : ↓ₖ (x ∧L y) = (↓ₖ x) ∧ₖ (↓ₖ y) † = to-𝒦-= spec-L (principal-ideal-is-compact (x ∧L y)) (binary-coherence spec-L spec-L-is-spectral (↓ x) (↓ y) (principal-ideal-is-compact x) (principal-ideal-is-compact y)) (principal-ideal-preserves-meets x y) Ⅰ = ap s † Ⅱ = s-preserves-∧ (↓ₖ x) (↓ₖ y) \end{code} \section{From 𝒦(Spec(L)) to L} We now start working on the map `back-to-L` that takes us from the small distributive lattice of compact opens of `spec-L` back to `L`. We first prove that the principal ideal map is an embedding and is hence left-cancellable. \begin{code} ↓-is-embedding : is-embedding principal-ideal ↓-is-embedding I (x , p) (y , q) = to-subtype-= (λ _ → carrier-of-[ poset-of-ideals L ]-is-set ) (≤-is-antisymmetric (poset-ofᵈ L) † ‡) where φ : ↓ x = ↓ y φ = ↓ x =⟨ p ⟩ I =⟨ q ⁻¹ ⟩ ↓ y ∎ β : (↓ x ≤[ poset-of-ideals L ] ↓ y) holds β = reflexivity+ (poset-of-ideals L) φ γ : (↓ y ≤[ poset-of-ideals L ] ↓ x) holds γ = reflexivity+ (poset-of-ideals L) (φ ⁻¹) † : rel-syntax (poset-ofᵈ L) x y holds † = β x (≤-is-reflexive (poset-ofᵈ L) x) ‡ : rel-syntax (poset-ofᵈ L) y x holds ‡ = γ y (≤-is-reflexive (poset-ofᵈ L) y) equality-of-principal-ideals-gives-equality : left-cancellable principal-ideal equality-of-principal-ideals-gives-equality = embeddings-are-lc principal-ideal ↓-is-embedding \end{code} We define the following map `r₀` which gives the ideal corresponding to an element in the small distributive lattice of compact opens. This is simply the composition ```text r ιₖ 𝒦⁻-spec-L ------> 𝒦-spec-L ------> 𝒪 spec(L) ``` where `ιₖ` is the inclusion of the compact opens into the frame of ideals, and `r` is one direction of the equivalence between `𝒦-spec-L` and its small copy. \begin{code} r₀ : ∣ 𝒦⁻-spec-L ∣ᵈ → ⟨ 𝒪 spec-L ⟩ r₀ = ιₖ ∘ r r₀-gives-compact-opens : (K : ∣ 𝒦⁻-spec-L ∣ᵈ) → is-compact-open spec-L (r₀ K) holds r₀-gives-compact-opens = ι-gives-compact-opens \end{code} We now define the underlying function of the distributive lattice homomorphism `back-to-L`, which we denote `back-to-L₀`: \begin{code} back-to-L₀ : ∣ 𝒦⁻-spec-L ∣ᵈ → ∣ L ∣ᵈ back-to-L₀ K = pr₁ t where κ : is-compact-open spec-L (r₀ K) holds κ = r₀-gives-compact-opens K γ : ∃ x ꞉ ∣ L ∣ᵈ , ↓ x = r₀ K γ = compact-opens-are-basic spec-L (ℬ-spec , ℬ-spec-is-directed-basis) (r₀ K) κ † : is-prop (Σ y ꞉ ∣ L ∣ᵈ , ↓ y = r₀ K) † = ↓-is-embedding (r₀ K) t : Σ x ꞉ ∣ L ∣ᵈ , ↓ x = r₀ K t = exit-∥∥ † γ \end{code} The map `back-to-L₀` is a section of `to-𝒦-spec-L₀`. \begin{code} to-𝒦-spec-L-cancels-back-to-L : (K : ∣ 𝒦⁻-spec-L ∣ᵈ) → to-𝒦-spec-L₀ (back-to-L₀ K) = K to-𝒦-spec-L-cancels-back-to-L K = s (↓ₖ back-to-L₀ K) =⟨ Ⅰ ⟩ s (r K) =⟨ Ⅱ ⟩ K ∎ where κ : is-compact-open spec-L (r₀ K) holds κ = r₀-gives-compact-opens K γ : ∃ x ꞉ ∣ L ∣ᵈ , ↓ x = r₀ K γ = compact-opens-are-basic spec-L (ℬ-spec , ℬ-spec-is-directed-basis) (r₀ K) κ † : is-prop (Σ y ꞉ ∣ L ∣ᵈ , ↓ y = r₀ K) † = ↓-is-embedding (r₀ K) t : Σ x ꞉ ∣ L ∣ᵈ , ↓ x = r₀ K t = exit-∥∥ † γ q : r₀ K = ↓ (back-to-L₀ K) q = pr₂ t ⁻¹ p : r K = ↓ₖ (back-to-L₀ K) p = to-𝒦-= spec-L (r₀-gives-compact-opens K) (principal-ideal-is-compact (back-to-L₀ K)) q Ⅱ = inverses-are-retractions' e K Ⅰ = ap s p ⁻¹ \end{code} The map `back-to-L₀` preserves binary meets. \begin{code} back-to-L₀-preserves-∧ : preserves-∧ 𝒦⁻-spec-L L back-to-L₀ holds back-to-L₀-preserves-∧ K₁ K₂ = † where open DistributiveLattice L renaming (_∧_ to _∧L_) open DistributiveLattice 𝒦⁻-spec-L renaming (_∧_ to _∧·_) ‡ : s (↓ₖ (back-to-L₀ (K₁ ∧· K₂))) = s (↓ₖ (back-to-L₀ K₁ ∧L back-to-L₀ K₂)) ‡ = s (↓ₖ (back-to-L₀ (K₁ ∧· K₂))) =⟨ Ⅰ ⟩ K₁ ∧· K₂ =⟨ Ⅱ ⟩ K₁ ∧· s (↓ₖ (back-to-L₀ K₂)) =⟨ Ⅲ ⟩ s (↓ₖ (back-to-L₀ K₁)) ∧· s (↓ₖ (back-to-L₀ K₂)) =⟨ Ⅳ ⟩ s ((↓ₖ (back-to-L₀ K₁)) ∧ₖ (↓ₖ (back-to-L₀ K₂))) =⟨ Ⅴ ⟩ s (↓ₖ (back-to-L₀ K₁ ∧L back-to-L₀ K₂)) ∎ where Ⅰ = to-𝒦-spec-L-cancels-back-to-L (K₁ ∧· K₂) Ⅱ = ap (λ - → K₁ ∧· -) (to-𝒦-spec-L-cancels-back-to-L K₂ ⁻¹) Ⅲ = ap (λ - → - ∧· s (↓ₖ (back-to-L₀ K₂))) (to-𝒦-spec-L-cancels-back-to-L K₁ ⁻¹) † = to-𝒦-= spec-L (pr₂ ((↓ₖ (back-to-L₀ K₁)) ∧ₖ (↓ₖ (back-to-L₀ K₂)))) (principal-ideal-is-compact (back-to-L₀ K₁ ∧L back-to-L₀ K₂)) (principal-ideal-preserves-meets (back-to-L₀ K₁) (back-to-L₀ K₂) ⁻¹ ) Ⅴ = ap s † Ⅳ = s-preserves-∧ (↓ₖ (back-to-L₀ K₁)) (↓ₖ (back-to-L₀ K₂)) ⁻¹ γ : ↓ₖ back-to-L₀ (K₁ ∧· K₂) = ↓ₖ (back-to-L₀ K₁ ∧L back-to-L₀ K₂) γ = equivs-are-lc s (⌜⌝-is-equiv (≃-sym e)) ‡ β : ↓ back-to-L₀ (K₁ ∧· K₂) = ↓ (back-to-L₀ K₁ ∧L back-to-L₀ K₂) β = pr₁ (from-Σ-= γ) † : back-to-L₀ (K₁ ∧· K₂) = back-to-L₀ K₁ ∧L back-to-L₀ K₂ † = pr₁ (from-Σ-= (↓-is-embedding (↓ back-to-L₀ (K₁ ∧· K₂)) (back-to-L₀ (K₁ ∧· K₂) , refl) (back-to-L₀ K₁ ∧L back-to-L₀ K₂ , (β ⁻¹)))) back-to-L₀-is-monotone : is-monotonic (poset-ofᵈ 𝒦⁻-spec-L) (poset-ofᵈ L) back-to-L₀ holds back-to-L₀-is-monotone = meet-preserving-implies-monotone 𝒦⁻-spec-L L back-to-L₀ back-to-L₀-preserves-∧ \end{code} The map `back-to-L₀` is a retraction of the map `to-𝒦-spec-L₀`. \begin{code} back-to-L-cancels-to-𝒦-spec-L : back-to-L₀ ∘ to-𝒦-spec-L₀ ∼ id back-to-L-cancels-to-𝒦-spec-L x = equality-of-principal-ideals-gives-equality † where ♠ : s (↓ₖ back-to-L₀ (s (↓ₖ x))) = s (↓ₖ x) ♠ = to-𝒦-spec-L-cancels-back-to-L (s (↓ₖ x)) ‡ : ↓ₖ back-to-L₀ (s (↓ₖ x)) = ↓ₖ x ‡ = equivs-are-lc s (⌜⌝-is-equiv (≃-sym e)) ♠ † : ↓ back-to-L₀ (s (↓ₖ x)) = ↓ x † = pr₁ (from-Σ-= ‡) \end{code} We conclude that the underlying types of `L` and `𝒦⁻(spec-L)` are equivalent. \begin{code} L-equivalent-to-𝒦⁻-spec-L : ∣ L ∣ᵈ ≃ ∣ 𝒦⁻-spec-L ∣ᵈ L-equivalent-to-𝒦⁻-spec-L = to-𝒦-spec-L₀ , qinvs-are-equivs to-𝒦-spec-L₀ † where Ⅰ : back-to-L₀ ∘ to-𝒦-spec-L₀ ∼ id Ⅰ = back-to-L-cancels-to-𝒦-spec-L Ⅱ : to-𝒦-spec-L₀ ∘ back-to-L₀ ∼ id Ⅱ = to-𝒦-spec-L-cancels-back-to-L † : qinv to-𝒦-spec-L₀ † = back-to-L₀ , Ⅰ , Ⅱ \end{code} The equivalence `to-𝒦-spec-L` is homomorphic. \begin{code} open HomomorphicEquivalences L 𝒦⁻-spec-L to-𝒦-spec-L-is-a-homomorphic-equivalence : is-homomorphic L-equivalent-to-𝒦⁻-spec-L holds to-𝒦-spec-L-is-a-homomorphic-equivalence = † , ‡ where † : is-monotonic (poset-ofᵈ L) (poset-ofᵈ 𝒦⁻-spec-L) to-𝒦-spec-L₀ holds † = meet-preserving-implies-monotone L 𝒦⁻-spec-L to-𝒦-spec-L₀ to-𝒦-spec-L-preserves-∧ ‡ : is-monotonic (poset-ofᵈ 𝒦⁻-spec-L) (poset-ofᵈ L) back-to-L₀ holds ‡ = back-to-L₀-is-monotone \end{code} We package everything up into a proof that `L` is isomorphic to the distributive lattice `𝒦⁻-spec-L`. \begin{code} open DistributiveLatticeIsomorphisms L 𝒦⁻-spec-L L-is-isomorphic-to-𝒦⁻-spec-L : L ≅d≅ 𝒦⁻-spec-L L-is-isomorphic-to-𝒦⁻-spec-L = to-isomorphismᵈᵣ (L-equivalent-to-𝒦⁻-spec-L , to-𝒦-spec-L-is-a-homomorphic-equivalence) \end{code} \section{References} [1] Johnstone, Peter T., Stone Spaces. Cambridge University Press, Cambridge, 1982