Ayberk Tosun, 21 August 2023
These used to live in the `CompactRegular` module which is now deprecated and
will be broken down into smaller modules.
\begin{code}[hide]
{-# OPTIONS --safe --without-K --lossy-unification #-}
open import UF.PropTrunc
open import UF.FunExt
open import UF.Subsingletons
open import UF.Logic
open import MLTT.Spartan
open import UF.Size
open import UF.Base
open import UF.EquivalenceExamples using (Σ-assoc)
module Locales.SmallBasis (pt : propositional-truncations-exist)
(fe : Fun-Ext)
(sr : Set-Replacement pt) where
open import Locales.Frame pt fe hiding (has-directed-basis₀)
open import Locales.Compactness.Definition pt fe
open import Locales.Spectrality.SpectralLocale pt fe
open import Slice.Family
open import UF.SubtypeClassifier
open import UF.ImageAndSurjection pt
open import UF.Equiv renaming (_■ to _𝒬ℰ𝒟)
open import MLTT.List using (List; map; _<$>_; []; _∷_)
open import UF.Univalence using (Univalence)
open import Locales.Spectrality.Properties pt fe
open PropositionalTruncation pt
open AllCombinators pt fe
open Locale
\end{code}
We start by defining the structure of having a basis. The superscript _ᴰ is our
notational convention for marking that we are working with the structural
version of a notion.
\begin{code}
basis-forᴰ : (F : Frame 𝓤 𝓥 𝓦) → Fam 𝓦 ⟨ F ⟩ → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⁺ ̇
basis-forᴰ {𝓦 = 𝓦} F (I , β) =
(U : ⟨ F ⟩) → Σ J ꞉ Fam 𝓦 I , (U is-lub-of ⁅ β j ∣ j ε J ⁆) holds
where
open Joins (λ x y → x ≤[ poset-of F ] y)
basisᴰ : (F : Frame 𝓤 𝓥 𝓦) → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⁺ ̇
basisᴰ {𝓤} {𝓥} {𝓦} F = Σ ℬ ꞉ Fam 𝓦 ⟨ F ⟩ , basis-forᴰ F ℬ
\end{code}
We will often have to talk about "directed bases": bases in which the covering
families are directed.
\begin{code}
directed-basis-forᴰ : (F : Frame 𝓤 𝓥 𝓦) → Fam 𝓦 ⟨ F ⟩ → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⁺ ̇
directed-basis-forᴰ {𝓤} {𝓥} {𝓦} F ℬ@(I , β) =
(U : ⟨ F ⟩) →
Σ J ꞉ Fam 𝓦 I ,
(U is-lub-of ⁅ β j ∣ j ε J ⁆ ∧ is-directed F ⁅ β j ∣ j ε J ⁆) holds
where
open Joins (λ x y → x ≤[ poset-of F ] y)
directed-basisᴰ : (F : Frame 𝓤 𝓥 𝓦) → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⁺ ̇
directed-basisᴰ {𝓤} {𝓥} {𝓦} F =
Σ ℬ ꞉ Fam 𝓦 ⟨ F ⟩ , directed-basis-forᴰ F ℬ
directed-basis-is-basis : (F : Frame 𝓤 𝓥 𝓦) (ℬ : Fam 𝓦 ⟨ F ⟩)
→ directed-basis-forᴰ F ℬ
→ basis-forᴰ F ℬ
directed-basis-is-basis {_} {_} {𝓦} F ℬ β U = † (β U)
where
open Joins (λ x y → x ≤[ poset-of F ] y)
† : Σ J ꞉ Fam 𝓦 (index ℬ) ,
(U is-lub-of ⁅ ℬ [ j ] ∣ j ε J ⁆ ∧ is-directed F ⁅ ℬ [ j ] ∣ j ε J ⁆)
holds
→ Σ J ꞉ Fam 𝓦 (index ℬ) , (U is-lub-of ⁅ ℬ [ j ] ∣ j ε J ⁆) holds
† (J , c , _)= J , c
\end{code}
In `spectralₛᴰ`, we give the old definition of a spectral locale that bakes in
the small basis assumption. We use the `ₛ` subscript to differentiate it from
the new one.
\begin{code}
contains-top : (F : Frame 𝓤 𝓥 𝓦) → Fam 𝓦 ⟨ F ⟩ → Ω (𝓤 ⊔ 𝓥 ⊔ 𝓦)
contains-top F U = Ǝ t ꞉ index U , is-top F (U [ t ]) holds
closed-under-binary-meets : (F : Frame 𝓤 𝓥 𝓦) → Fam 𝓦 ⟨ F ⟩ → Ω (𝓤 ⊔ 𝓥 ⊔ 𝓦)
closed-under-binary-meets F 𝒮 =
Ɐ i ꞉ index 𝒮 , Ɐ j ꞉ index 𝒮 ,
Ǝ k ꞉ index 𝒮 , ((𝒮 [ k ]) is-glb-of (𝒮 [ i ] , 𝒮 [ j ])) holds
where
open Meets (λ x y → x ≤[ poset-of F ] y)
closed-under-finite-meets : (F : Frame 𝓤 𝓥 𝓦) → Fam 𝓦 ⟨ F ⟩ → Ω (𝓤 ⊔ 𝓥 ⊔ 𝓦)
closed-under-finite-meets F S = contains-top F S ∧ closed-under-binary-meets F S
spectralₛᴰ : Locale 𝓤 𝓥 𝓦 → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⁺ ̇
spectralₛᴰ {_} {_} {𝓦} X =
Σ ℬ ꞉ Fam 𝓦 ⟨ 𝒪 X ⟩ ,
is-directed-basis (𝒪 X) ℬ
× consists-of-compact-opens X ℬ holds
× closed-under-finite-meets (𝒪 X) ℬ holds
\end{code}
The previous definition of spectrality was the truncation of `spectralₛᴰ`:
\begin{code}
is-spectralₛ : Locale 𝓤 𝓥 𝓦 → Ω (𝓤 ⊔ 𝓥 ⊔ 𝓦 ⁺)
is-spectralₛ X = ∥ spectralₛᴰ X ∥Ω
\end{code}
Compact opens are basic:
\begin{code}
is-basic : (X : Locale 𝓤 𝓥 𝓦) → ⟨ 𝒪 X ⟩ → directed-basisᴰ (𝒪 X) → Ω (𝓤 ⊔ 𝓦)
is-basic X U (ℬ , β) = U ∈image (ℬ [_]) , ∃-is-prop
compact-opens-are-basic : (X : Locale 𝓤 𝓥 𝓦)
→ (b : directed-basisᴰ (𝒪 X))
→ (K : ⟨ 𝒪 X ⟩)
→ is-compact-open X K holds
→ is-basic X K b holds
compact-opens-are-basic {_} {_} {𝓦} X (ℬ , β) K κ = ‡ (β K)
where
open Joins (λ x y → x ≤[ poset-of (𝒪 X) ] y)
‡ : (Σ 𝒥 ꞉ Fam 𝓦 (index ℬ) , (K is-lub-of ⁅ ℬ [ j ] ∣ j ε 𝒥 ⁆ ∧ is-directed (𝒪 X) ⁅ ℬ [ j ] ∣ j ε 𝒥 ⁆) holds)
→ is-basic X K (ℬ , β) holds
‡ (𝒥 , c , d) =
∥∥-rec (holds-is-prop (is-basic X K (ℬ , β))) † (κ ⁅ ℬ [ j ] ∣ j ε 𝒥 ⁆ d q)
where
q : (K ≤[ poset-of (𝒪 X) ] (⋁[ 𝒪 X ] ⁅ ℬ [ j ] ∣ j ε 𝒥 ⁆)) holds
q = reflexivity+ (poset-of (𝒪 X)) (⋁[ 𝒪 X ]-unique ⁅ ℬ [ j ] ∣ j ε 𝒥 ⁆ K c)
† : Σ j ꞉ index 𝒥 , (K ≤[ poset-of (𝒪 X) ] ℬ [ 𝒥 [ j ] ]) holds
→ is-basic X K (ℬ , β) holds
† (j , φ) = ∣ 𝒥 [ j ] , ≤-is-antisymmetric (poset-of (𝒪 X)) ψ φ ∣
where
open PosetReasoning (poset-of (𝒪 X))
Ⅰ = ⋁[ 𝒪 X ]-upper ⁅ ℬ [ j ] ∣ j ε 𝒥 ⁆ j
Ⅱ = reflexivity+ (poset-of (𝒪 X)) ((⋁[ 𝒪 X ]-unique ⁅ ℬ [ j ] ∣ j ε 𝒥 ⁆ K c) ⁻¹)
ψ : (ℬ [ 𝒥 [ j ] ] ≤[ poset-of (𝒪 X) ] K) holds
ψ = ℬ [ 𝒥 [ j ] ] ≤⟨ Ⅰ ⟩ ⋁[ 𝒪 X ] ⁅ ℬ [ j ] ∣ j ε 𝒥 ⁆ ≤⟨ Ⅱ ⟩ K ■
\end{code}
One of the things that we show in this module is that this truncation was
unnecessary as the basis is unique in the presence of a small basis.
We now define the following crucial predicate expressing what it means for the
type of compact opens of a locale to be small:
\begin{code}
has-small-𝒦 : Locale 𝓤 𝓥 𝓦 → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⁺ ̇
has-small-𝒦 {_} {_} {𝓦} X = 𝒦 X is 𝓦 small
\end{code}
\begin{code}
basis-is-unique : (X : Locale 𝓤 𝓥 𝓦)
→ ((ℬ , _) : directed-basisᴰ (𝒪 X))
→ consists-of-compact-opens X ℬ holds
→ image (ℬ-compact X [_]) ≃ image (ℬ [_])
basis-is-unique X (ℬ , b) κ =
r , (s , s-is-section-of-r) , s , r-is-retract-of-s
where
r : image (ℬ-compact X [_]) → image (ℬ [_])
r (K , p) = K , K-is-basic
where
K-is-compact : is-compact-open X K holds
K-is-compact = ∥∥-rec (holds-is-prop (is-compact-open X K)) † p
where
† : Σ (λ x → ℬ-compact X [ x ] = K) → is-compact-open X K holds
† ((K′ , κ′) , q) = transport (λ - → is-compact-open X - holds) q κ′
K-is-basic : K ∈image (ℬ [_])
K-is-basic =
∥∥-rec ∃-is-prop † (compact-opens-are-basic X (ℬ , b) K K-is-compact)
where
† : Σ i ꞉ index ℬ , ℬ [ i ] = K → ∃ j ꞉ index ℬ , ℬ [ j ] = K
† (i , p) = ∣ i , p ∣
s : image (ℬ [_]) → image (ℬ-compact X [_])
s (K , p) = K , ∥∥-rec ∃-is-prop † p
where
† : Σ i ꞉ index ℬ , ℬ [ i ] = K → ∃ (K′ , _) ꞉ index (ℬ-compact X) , K′ = K
† (i , q) = ∣ (ℬ [ i ] , κ i) , q ∣
s-is-section-of-r : r ∘ s ∼ id
s-is-section-of-r (U , p) = to-subtype-= (λ _ → ∃-is-prop) refl
r-is-retract-of-s : s ∘ r ∼ id
r-is-retract-of-s (K , p) = to-subtype-= (λ _ → ∃-is-prop) refl
\end{code}
Having a directed basis is a proposition under certain favourable conditions.
\begin{code}
basic-iso-to-𝒦 : (X : Locale 𝓤 𝓥 𝓦)
→ ((ℬ , b) : directed-basisᴰ (𝒪 X))
→ consists-of-compact-opens X ℬ holds
→ image (ℬ [_]) ≃ 𝒦 X
basic-iso-to-𝒦 X (ℬ , β) κ =
image (ℬ [_]) ≃⟨ Ⅰ ⟩
image (ℬ-compact X [_]) ≃⟨ Ⅱ ⟩
𝒦 X 𝒬ℰ𝒟
where
Ⅰ : image (ℬ [_]) ≃ image (ℬ-compact X [_])
Ⅰ = ≃-sym (basis-is-unique X (ℬ , β) κ)
Ⅱ : image (ℬ-compact X [_]) ≃ 𝒦 X
Ⅱ = s , (r , ψ) , (r , ϑ)
where
s : image (ℬ-compact X [_]) → 𝒦 X
s (K , c) = K , ∥∥-rec (holds-is-prop (is-compact-open X K)) † c
where
† : Σ i ꞉ index (ℬ-compact X) , ℬ-compact X [ i ] = K
→ is-compact-open X K holds
† ((K′ , φ) , p) = transport (λ - → is-compact-open X - holds) p φ
r : 𝒦 X → image (ℬ-compact X [_])
r (K , p) = K , ∣ (K , p) , refl ∣
ψ : s ∘ r ∼ id
ψ (K , p) = to-subtype-= (holds-is-prop ∘ is-compact-open X) refl
ϑ : (r ∘ s) ∼ id
ϑ (K , p) = to-subtype-= (λ _ → ∃-is-prop) refl
\end{code}
\begin{code}
local-smallness : (X : Locale 𝓤 𝓦 𝓦)
→ ⟨ 𝒪 X ⟩ is-locally 𝓦 small
local-smallness {𝓤} {𝓦} X = †
where
_≡ₓ_ : ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩ → Ω 𝓦
U ≡ₓ V = (U ≤[ poset-of (𝒪 X) ] V) ∧ (V ≤[ poset-of (𝒪 X) ] U)
† : ⟨ 𝒪 X ⟩ is-locally 𝓦 small
† U V = (U ≡ₓ V) holds , e
where
e : (U ≡ₓ V) holds ≃ (U = V)
e = logically-equivalent-props-are-equivalent
(holds-is-prop (U ≡ₓ V))
carrier-of-[ poset-of (𝒪 X) ]-is-set
(λ (p , q) → ≤-is-antisymmetric (poset-of (𝒪 X)) p q)
λ p → (reflexivity+ (poset-of (𝒪 X)) p) , reflexivity+ (poset-of (𝒪 X)) (p ⁻¹)
\end{code}
\begin{code}
basic-is-small : (X : Locale 𝓤 𝓥 𝓦)
→ ((ℬ , b) : directed-basisᴰ (𝒪 X))
→ ⟨ 𝒪 X ⟩ is-locally 𝓦 small
→ (image (ℬ [_])) is 𝓦 small
basic-is-small X (ℬ , b) ψ =
sr (ℬ [_]) (index ℬ , ≃-refl (index ℬ)) ψ carrier-of-[ poset-of (𝒪 X) ]-is-set
\end{code}
\begin{code}
𝒦-is-small : (X : Locale 𝓤 𝓥 𝓦)
→ ((ℬ , b) : directed-basisᴰ (𝒪 X))
→ consists-of-compact-opens X ℬ holds
→ ⟨ 𝒪 X ⟩ is-locally 𝓦 small
→ (𝒦 X) is 𝓦 small
𝒦-is-small {𝓤} {𝓥} {𝓦} X (ℬ , b) κ ψ = B₀ , e
where
σ : image (ℬ [_]) is 𝓦 small
σ = basic-is-small X (ℬ , b) ψ
B₀ : 𝓦 ̇
B₀ = pr₁ σ
Ⅰ = pr₂ σ
Ⅱ = basic-iso-to-𝒦 X (ℬ , b) κ
e : B₀ ≃ 𝒦 X
e = B₀ ≃⟨ Ⅰ ⟩ image (ℬ [_]) ≃⟨ Ⅱ ⟩ 𝒦 X 𝒬ℰ𝒟
\end{code}
\begin{code}
spectral-and-small-𝒦-gives-basis : (X : Locale 𝓤 𝓦 𝓦)
→ is-spectral X holds
→ 𝒦 X is 𝓦 small
→ basisᴰ (𝒪 X)
spectral-and-small-𝒦-gives-basis {𝓤} {𝓦} X 𝕤 (𝒦₀ , e) = (𝒦₀ , α) , β
where
open Joins (λ x y → x ≤[ poset-of (𝒪 X) ] y)
open PosetReasoning (poset-of (𝒪 X))
sec : 𝒦₀ → 𝒦 X
sec = pr₁ e
ret : 𝒦 X → 𝒦₀
ret = pr₁ (pr₁ (pr₂ e))
α : 𝒦₀ → ⟨ 𝒪 X ⟩
α = pr₁ ∘ sec
β : basis-forᴰ (𝒪 X) (𝒦₀ , α)
β U = 𝒥 , † , ‡
where
𝒥 : Fam 𝓦 𝒦₀
𝒥 = (Σ k ꞉ 𝒦₀ , (α k ≤[ poset-of (𝒪 X) ] U) holds) , pr₁
† : (U is-an-upper-bound-of ⁅ α j ∣ j ε 𝒥 ⁆) holds
† = pr₂
‡ : ((u , _) : upper-bound ⁅ α j ∣ j ε 𝒥 ⁆) → (U ≤[ poset-of (𝒪 X) ] u) holds
‡ (V , ψ) = spectral-yoneda X 𝕤 U V λ { (K , p) → ♣ K p}
where
♣ : (K : ⟨ 𝒪 X ⟩)
→ (is-compact-open X K ⇒ K ≤[ poset-of (𝒪 X) ] U ⇒ K ≤[ poset-of (𝒪 X) ] V) holds
♣ K κ p = K ≤⟨ c₀ ⟩ ⋁[ 𝒪 X ] ⁅ α j ∣ j ε 𝒥 ⁆ ≤⟨ ⋁[ 𝒪 X ]-least ⁅ α j ∣ j ε 𝒥 ⁆ (V , (λ i → ψ i)) ⟩ V ■
where
iₖ : 𝒦₀
iₖ = ret (K , κ)
tmp : sec (ret (K , κ)) = (K , κ)
tmp = pr₂ (pr₁ (pr₂ e)) (K , κ)
ϑ : (α iₖ ≤[ poset-of (𝒪 X) ] U) holds
ϑ = α iₖ =⟨ refl ⟩ₚ
pr₁ (sec (ret (K , κ))) =⟨ ap pr₁ tmp ⟩ₚ
K ≤⟨ p ⟩
U ■
c₀ : (K ≤[ poset-of (𝒪 X) ] (⋁[ 𝒪 X ] ⁅ α j ∣ j ε 𝒥 ⁆)) holds
c₀ = K =⟨ pr₁ (from-Σ-= tmp) ⁻¹ ⟩ₚ
pr₁ (sec (ret (K , κ))) =⟨ refl ⟩ₚ
α iₖ ≤⟨ ⋁[ 𝒪 X ]-upper ⁅ α j ∣ j ε 𝒥 ⁆ (iₖ , ϑ) ⟩
⋁[ 𝒪 X ] (fmap-syntax (λ j → α j) 𝒥) ■
\end{code}
\begin{code}
spectral-and-small-𝒦-gives-directed-basis : (X : Locale 𝓤 𝓦 𝓦)
→ is-spectral X holds
→ 𝒦 X is 𝓦 small
→ directed-basisᴰ (𝒪 X)
spectral-and-small-𝒦-gives-directed-basis {_} {𝓦} X σ 𝕤 =
ℬ↑ , ℬ↑-is-directed-basis-for-X
where
basis-X : basisᴰ (𝒪 X)
basis-X = spectral-and-small-𝒦-gives-basis X σ 𝕤
ℬ : Fam 𝓦 ⟨ 𝒪 X ⟩
ℬ = pr₁ basis-X
β : basis-forᴰ (𝒪 X) ℬ
β = pr₂ basis-X
ℬ↑ : Fam 𝓦 ⟨ 𝒪 X ⟩
ℬ↑ = directify (𝒪 X) ℬ
β↑ : basis-forᴰ (𝒪 X) ℬ↑
β↑ = directified-basis-is-basis (𝒪 X) ℬ β
ℬ↑-is-directed-basis-for-X : directed-basis-forᴰ (𝒪 X) ℬ↑
ℬ↑-is-directed-basis-for-X U = pr₁ Σ-assoc (β↑ U , d)
where
𝒥 : Fam 𝓦 (index ℬ↑)
𝒥 = pr₁ (β↑ U)
d : is-directed (𝒪 X) ⁅ ℬ↑ [ j ] ∣ j ε 𝒥 ⁆ holds
d = covers-of-directified-basis-are-directed (𝒪 X) ℬ β U
\end{code}
\begin{code}
spectralᴰ : Locale 𝓤 𝓥 𝓦 → (𝓤 ⊔ 𝓥 ⊔ 𝓦 ⁺) ̇
spectralᴰ {𝓤 = 𝓤} {𝓥} {𝓦} X =
Σ ℬ ꞉ Fam 𝓦 ⟨ 𝒪 X ⟩ , directed-basis-forᴰ (𝒪 X) ℬ
× consists-of-compact-opens X ℬ holds
× closed-under-finite-meets (𝒪 X) ℬ holds
basisₛ : (X : Locale 𝓤 𝓥 𝓦) → spectralᴰ X → Fam 𝓦 ⟨ 𝒪 X ⟩
basisₛ {𝓤} {𝓥} {𝓦} X = pr₁
basisₛ-is-basis : (X : Locale 𝓤 𝓥 𝓦) (σᴰ : spectralᴰ X)
→ basis-forᴰ (𝒪 X) (basisₛ X σᴰ)
basisₛ-is-basis X σᴰ = directed-basis-is-basis (𝒪 X) (basisₛ X σᴰ) (pr₁ (pr₂ σᴰ))
cover-indexₛ : (X : Locale 𝓤 𝓥 𝓦) (σᴰ : spectralᴰ X)
→ let
ℬ = basisₛ X σᴰ
in
⟨ 𝒪 X ⟩ → Fam 𝓦 (index ℬ)
cover-indexₛ X σᴰ U = pr₁ (basisₛ-is-basis X σᴰ U)
covering-familyₛ : (X : Locale 𝓤 𝓥 𝓦) (σᴰ : spectralᴰ X)
→ let
ℬ = basisₛ X σᴰ
in
⟨ 𝒪 X ⟩ → Fam 𝓦 ⟨ 𝒪 X ⟩
covering-familyₛ X σᴰ U = ⁅ basisₛ X σᴰ [ j ] ∣ j ε cover-indexₛ X σᴰ U ⁆
basisₛ-covers-are-directed : (X : Locale 𝓤 𝓥 𝓦) (σᴰ : spectralᴰ X) (U : ⟨ 𝒪 X ⟩)
→ let
ℬ = basisₛ X σᴰ
𝒥 = cover-indexₛ X σᴰ U
in
is-directed (𝒪 X) ⁅ ℬ [ j ] ∣ j ε 𝒥 ⁆ holds
basisₛ-covers-are-directed X σᴰ U = pr₂ (pr₂ (pr₁ (pr₂ σᴰ) U))
basisₛ-covers-do-cover : (X : Locale 𝓤 𝓥 𝓦) (σᴰ : spectralᴰ X) (U : ⟨ 𝒪 X ⟩)
→ let
ℬ = basisₛ X σᴰ
𝒥 = cover-indexₛ X σᴰ U
open Joins (λ U V → U ≤[ poset-of (𝒪 X) ] V)
in
(U is-lub-of ⁅ ℬ [ j ] ∣ j ε 𝒥 ⁆) holds
basisₛ-covers-do-cover X σᴰ U = pr₁ (pr₂ (pr₁ (pr₂ σᴰ) U))
basisₛ-covers-do-cover-eq : (X : Locale 𝓤 𝓥 𝓦) (σᴰ : spectralᴰ X) (U : ⟨ 𝒪 X ⟩)
→ let
ℬ = basisₛ X σᴰ
𝒥 = cover-indexₛ X σᴰ U
open Joins (λ U V → U ≤[ poset-of (𝒪 X) ] V)
in
U = ⋁[ 𝒪 X ] ⁅ ℬ [ j ] ∣ j ε 𝒥 ⁆
basisₛ-covers-do-cover-eq X σᴰ U =
⋁[ 𝒪 X ]-unique ⁅ ℬ [ j ] ∣ j ε 𝒥 ⁆ U c
where
open Joins (λ U V → U ≤[ poset-of (𝒪 X) ] V)
ℬ = basisₛ X σᴰ
𝒥 = cover-indexₛ X σᴰ U
c : (U is-lub-of ⁅ ℬ [ j ] ∣ j ε 𝒥 ⁆) holds
c = basisₛ-covers-do-cover X σᴰ U
basisₛ-is-directed-basis : (X : Locale 𝓤 𝓥 𝓦) (σᴰ : spectralᴰ X)
→ directed-basis-forᴰ (𝒪 X) (basisₛ X σᴰ)
basisₛ-is-directed-basis X σᴰ U = cover-indexₛ X σᴰ U
, basisₛ-covers-do-cover X σᴰ U
, (basisₛ-covers-are-directed X σᴰ U)
where
ℬ = basisₛ X σᴰ
basisₛ-contains-top : (X : Locale 𝓤 𝓥 𝓦) (σᴰ : spectralᴰ X)
→ contains-top (𝒪 X) (basisₛ X σᴰ) holds
basisₛ-contains-top X σᴰ = pr₁ (pr₂ (pr₂ (pr₂ σᴰ)))
basisₛ-consists-of-compact-opens : (X : Locale 𝓤 𝓥 𝓦) (σᴰ : spectralᴰ X)
→ consists-of-compact-opens X (basisₛ X σᴰ) holds
basisₛ-consists-of-compact-opens X σᴰ = pr₁ (pr₂ (pr₂ σᴰ))
basisₛ-closed-under-∧ : (X : Locale 𝓤 𝓥 𝓦) (σᴰ : spectralᴰ X)
→ closed-under-binary-meets (𝒪 X) (basisₛ X σᴰ) holds
basisₛ-closed-under-∧ X σᴰ = pr₂ (pr₂ (pr₂ (pr₂ σᴰ)))
spectralᴰ-implies-basisᴰ : (X : Locale 𝓤 𝓥 𝓦) → spectralᴰ X → basisᴰ (𝒪 X)
spectralᴰ-implies-basisᴰ X σᴰ = basisₛ X σᴰ , basisₛ-is-basis X σᴰ
spectralᴰ-implies-directed-basisᴰ : (X : Locale 𝓤 𝓥 𝓦)
→ spectralᴰ X → directed-basisᴰ (𝒪 X)
spectralᴰ-implies-directed-basisᴰ X σᴰ =
basisₛ X σᴰ , basisₛ-is-directed-basis X σᴰ
\end{code}
Spectrality structure gives `is-spectral`.
\begin{code}
spectralᴰ-gives-spectrality : (X : Locale 𝓤 𝓥 𝓦)
→ spectralᴰ X
→ is-spectral X holds
spectralᴰ-gives-spectrality X σᴰ = ⦅𝟏⦆ , ⦅𝟐⦆
where
ℬ = basisₛ X σᴰ
β↑ = basisₛ-is-directed-basis X σᴰ
† : (Σ iₜ ꞉ index ℬ , is-top (𝒪 X) (ℬ [ iₜ ]) holds) → is-compact X holds
† (iₜ , φ) =
transport
(λ - → is-compact-open X - holds)
(𝟏-is-unique (𝒪 X) (ℬ [ iₜ ]) φ)
(basisₛ-consists-of-compact-opens X σᴰ iₜ)
κ : is-compact X holds
κ = ∥∥-rec (holds-is-prop (is-compact X)) † (basisₛ-contains-top X σᴰ)
𝕔 : compacts-of-[ X ]-are-closed-under-binary-meets holds
𝕔 K₁ K₂ κ₁ κ₂ = ∥∥-rec₂
(holds-is-prop (is-compact-open X (K₁ ∧[ 𝒪 X ] K₂)))
‡
K₁-is-basic
K₂-is-basic
where
K₁-is-basic : is-basic X K₁ (ℬ , β↑) holds
K₁-is-basic = compact-opens-are-basic X (ℬ , β↑) K₁ κ₁
K₂-is-basic : is-basic X K₂ (ℬ , β↑) holds
K₂-is-basic = compact-opens-are-basic X (ℬ , β↑) K₂ κ₂
‡ : Σ i₁ ꞉ index ℬ , ℬ [ i₁ ] = K₁
→ Σ i₂ ꞉ index ℬ , ℬ [ i₂ ] = K₂
→ is-compact-open X (K₁ ∧[ 𝒪 X ] K₂) holds
‡ (i₁ , p₁) (i₂ , p₂) =
transport (λ - → is-compact-open X - holds) (p ⁻¹) ♣
where
p : K₁ ∧[ 𝒪 X ] K₂ = ℬ [ i₁ ] ∧[ 𝒪 X ] ℬ [ i₂ ]
p = K₁ ∧[ 𝒪 X ] K₂ =⟨ Ⅰ ⟩
ℬ [ i₁ ] ∧[ 𝒪 X ] K₂ =⟨ Ⅱ ⟩
ℬ [ i₁ ] ∧[ 𝒪 X ] ℬ [ i₂ ] ∎
where
Ⅰ = ap (λ - → - ∧[ 𝒪 X ] K₂) (p₁ ⁻¹)
Ⅱ = ap (λ - → _ ∧[ 𝒪 X ] -) (p₂ ⁻¹)
open Meets (λ U V → U ≤[ poset-of (𝒪 X) ] V)
♠ : (Σ i₃ ꞉ index ℬ , (((ℬ [ i₃ ]) is-glb-of ((ℬ [ i₁ ]) , (ℬ [ i₂ ]))) holds))
→ is-compact-open X (ℬ [ i₁ ] ∧[ 𝒪 X ] ℬ [ i₂ ]) holds
♠ (i₃ , φ) =
transport
(λ - → is-compact-open X - holds)
q
(basisₛ-consists-of-compact-opens X σᴰ i₃)
where
q : ℬ [ i₃ ] = ℬ [ i₁ ] ∧[ 𝒪 X ] ℬ [ i₂ ]
q = ∧[ 𝒪 X ]-unique φ
♣ : is-compact-open X (ℬ [ i₁ ] ∧[ 𝒪 X ] ℬ [ i₂ ]) holds
♣ = ∥∥-rec
(holds-is-prop (is-compact-open X (ℬ [ i₁ ] ∧[ 𝒪 X ] ℬ [ i₂ ])))
♠
(basisₛ-closed-under-∧ X σᴰ i₁ i₂)
⦅𝟏⦆ : compacts-of-[ X ]-are-closed-under-finite-meets holds
⦅𝟏⦆ = κ , 𝕔
⦅𝟐⦆ : (U : ⟨ 𝒪 X ⟩) → has-a-directed-cover-of-compact-opens X U holds
⦅𝟐⦆ U = ∣ ⁅ ℬ [ j ] ∣ j ε cover-indexₛ X σᴰ U ⁆ , ϑ , d , c ∣
where
ϑ : consists-of-compact-opens X ⁅ ℬ [ j ] ∣ j ε cover-indexₛ X σᴰ U ⁆ holds
ϑ i = basisₛ-consists-of-compact-opens X σᴰ (cover-indexₛ X σᴰ U [ i ])
d : is-directed (𝒪 X) ⁅ ℬ [ j ] ∣ j ε cover-indexₛ X σᴰ U ⁆ holds
d = basisₛ-covers-are-directed X σᴰ U
c : U = ⋁[ 𝒪 X ] ⁅ ℬ [ j ] ∣ j ε cover-indexₛ X σᴰ U ⁆
c = ⋁[ 𝒪 X ]-unique
⁅ ℬ [ j ] ∣ j ε cover-indexₛ X σᴰ U ⁆
U
(basisₛ-covers-do-cover X σᴰ U)
\end{code}
\begin{code}
open import Locales.CompactRegular pt fe using (directify-preserves-closure-under-∧)
spectral-and-small-𝒦-implies-spectralᴰ : (X : Locale 𝓤 𝓥 𝓥)
→ is-spectral X holds
→ 𝒦 X is 𝓥 small
→ spectralᴰ X
spectral-and-small-𝒦-implies-spectralᴰ {𝓤} {𝓥} X σ 𝕤ₖ@(𝒦₀ , e) =
pr₁ Σ-assoc (spectral-and-small-𝒦-gives-directed-basis X σ 𝕤ₖ , κ , μ↑)
where
ℬ : Fam 𝓥 ⟨ 𝒪 X ⟩
ℬ = pr₁ (spectral-and-small-𝒦-gives-basis X σ 𝕤ₖ)
β : is-basis-for (𝒪 X) ℬ
β = pr₂ (spectral-and-small-𝒦-gives-basis X σ 𝕤ₖ)
sec : 𝒦₀ → 𝒦 X
sec = pr₁ e
ret : 𝒦 X → 𝒦₀
ret = pr₁ (pr₁ (pr₂ e))
q : (K : ⟨ 𝒪 X ⟩) (κ : is-compact-open X K holds)
→ sec (ret (K , κ)) = (K , κ)
q K κ = pr₂ (pr₁ (pr₂ e)) (K , κ)
q₀ : (K : ⟨ 𝒪 X ⟩) (κ : is-compact-open X K holds)
→ pr₁ (sec (ret (K , κ))) = K
q₀ K κ = pr₁ (from-Σ-= (q K κ))
ℬ-consists-of-compact-opens : (i : index ℬ)
→ is-compact-open X (ℬ [ i ]) holds
ℬ-consists-of-compact-opens i = pr₂ (sec i)
ℬ↑ : Fam 𝓥 ⟨ 𝒪 X ⟩
ℬ↑ = pr₁ (spectral-and-small-𝒦-gives-directed-basis X σ 𝕤ₖ)
β↑ : directed-basis-forᴰ (𝒪 X) ℬ↑
β↑ = pr₂ (spectral-and-small-𝒦-gives-directed-basis X σ 𝕤ₖ)
κ : consists-of-compact-opens X ℬ↑ holds
κ [] = 𝟎-is-compact X
κ (i ∷ is) = compact-opens-are-closed-under-∨
X
(ℬ [ i ])
(ℬ↑ [ is ])
(ℬ-consists-of-compact-opens i)
(κ is)
κ₁ : is-compact-open X 𝟏[ 𝒪 X ] holds
κ₁ = spectral-implies-compact X σ
τ↑ : contains-top (𝒪 X) ℬ↑ holds
τ↑ = ∣ (ret (𝟏[ 𝒪 X ] , κ₁) ∷ []) , † ∣
where
‡ : 𝟏[ 𝒪 X ] = (ℬ [ ret (𝟏[ 𝒪 X ] , κ₁) ] ∨[ 𝒪 X ] 𝟎[ 𝒪 X ])
‡ = 𝟏[ 𝒪 X ] =⟨ q₀ 𝟏[ 𝒪 X ] (pr₁ (pr₁ σ)) ⁻¹ ⟩
ℬ [ ret (𝟏[ 𝒪 X ] , κ₁) ] =⟨ 𝟎-left-unit-of-∨ (𝒪 X) (ℬ [ ret (𝟏[ 𝒪 X ] , κ₁) ]) ⁻¹ ⟩
ℬ [ ret (𝟏[ 𝒪 X ] , κ₁) ] ∨[ 𝒪 X ] 𝟎[ 𝒪 X ] ∎
† : is-top (𝒪 X) (ℬ [ ret (𝟏[ 𝒪 X ] , κ₁) ] ∨[ 𝒪 X ] 𝟎[ 𝒪 X ]) holds
† = transport (λ - → is-top (𝒪 X) - holds) ‡ (𝟏-is-top (𝒪 X))
μ : closed-under-binary-meets (𝒪 X) ℬ holds
μ i j =
∣ k , transport (λ - → (- is-glb-of (ℬ [ i ] , ℬ [ j ])) holds) ※ † ∣
where
open Meets (λ x y → x ≤[ poset-of (𝒪 X) ] y)
κᵢ : is-compact-open X (ℬ [ i ]) holds
κᵢ = ℬ-consists-of-compact-opens i
κⱼ : is-compact-open X (ℬ [ j ]) holds
κⱼ = ℬ-consists-of-compact-opens j
κ∧ : is-compact-open X (ℬ [ i ] ∧[ 𝒪 X ] ℬ [ j ]) holds
κ∧ = binary-coherence X σ (ℬ [ i ]) (ℬ [ j ]) κᵢ κⱼ
k : 𝒦₀
k = ret ((ℬ [ i ] ∧[ 𝒪 X ] ℬ [ j ]) , κ∧)
† : ((ℬ [ i ] ∧[ 𝒪 X ] ℬ [ j ]) is-glb-of (ℬ [ i ] , ℬ [ j ])) holds
† = (∧[ 𝒪 X ]-lower₁ (ℬ [ i ]) (ℬ [ j ]) , ∧[ 𝒪 X ]-lower₂ (ℬ [ i ]) (ℬ [ j ]))
, (λ (V , p) → ∧[ 𝒪 X ]-greatest (ℬ [ i ]) (ℬ [ j ]) _ (pr₁ p) (pr₂ p))
※ : ℬ [ i ] ∧[ 𝒪 X ] ℬ [ j ] = ℬ [ k ]
※ = ℬ [ i ] ∧[ 𝒪 X ] ℬ [ j ] =⟨ Ⅰ ⟩
pr₁ (sec (ret ((ℬ [ i ] ∧[ 𝒪 X ] ℬ [ j ]) , κ∧))) =⟨ refl ⟩
ℬ [ k ] ∎
where
Ⅰ = pr₁ (from-Σ-= (q (ℬ [ i ] ∧[ 𝒪 X ] ℬ [ j ]) κ∧ ⁻¹))
μ↑ : closed-under-finite-meets (𝒪 X) ℬ↑ holds
μ↑ = τ↑ , directify-preserves-closure-under-∧ (𝒪 X) ℬ β μ
\end{code}
\begin{code}
spectralᴰ-implies-small-𝒦 : (X : Locale 𝓤 𝓥 𝓥) → spectralᴰ X → has-small-𝒦 X
spectralᴰ-implies-small-𝒦 {𝓤} {𝓥} X σᴰ = 𝒦-is-small X (ℬ , β) κ ζ
where
ℬ : Fam 𝓥 ⟨ 𝒪 X ⟩
ℬ = basisₛ X σᴰ
β : directed-basis-forᴰ (𝒪 X) ℬ
β = basisₛ-is-directed-basis X σᴰ
κ : consists-of-compact-opens X ℬ holds
κ = basisₛ-consists-of-compact-opens X σᴰ
ζ : ⟨ 𝒪 X ⟩ is-locally 𝓥 small
ζ = local-smallness X
\end{code}
\begin{code}
is-spectral-with-small-basis : (ua : Univalence) (X : Locale 𝓤 𝓥 𝓥) → Ω (𝓤 ⊔ 𝓥 ⁺)
is-spectral-with-small-basis {𝓤} {𝓥} ua X =
is-spectral X ∧ has-small-𝒦 X , being-small-is-prop ua (𝒦 X) 𝓥
\end{code}
\begin{code}
ssb-implies-spectral : (ua : Univalence) (X : Locale 𝓤 𝓥 𝓥)
→ is-spectral-with-small-basis ua X holds
→ is-spectral X holds
ssb-implies-spectral ua X (σ , _) = σ
smallness-of-𝒦 : (ua : Univalence) (X : Locale 𝓤 𝓥 𝓥)
→ is-spectral-with-small-basis ua X holds
→ 𝒦 X is 𝓥 small
smallness-of-𝒦 ua X (_ , s) = s
ssb-implies-spectralᴰ : (ua : Univalence) (X : Locale 𝓤 𝓥 𝓥)
→ is-spectral-with-small-basis ua X holds
→ spectralᴰ X
ssb-implies-spectralᴰ ua X (σ , 𝕤) = spectral-and-small-𝒦-implies-spectralᴰ X σ 𝕤
spectralᴰ-implies-ssb : (ua : Univalence) (X : Locale 𝓤 𝓥 𝓥)
→ spectralᴰ X → is-spectral-with-small-basis ua X holds
spectralᴰ-implies-ssb ua X σᴰ =
spectralᴰ-gives-spectrality X σᴰ , spectralᴰ-implies-small-𝒦 X σᴰ
\end{code}
\begin{code}
truncated-spectralᴰ-implies-spectral : (ua : Univalence) (X : Locale 𝓤 𝓥 𝓥)
→ ∥ spectralᴰ X ∥ → is-spectral X holds
truncated-spectralᴰ-implies-spectral ua X p =
∥∥-rec (holds-is-prop (is-spectral X)) † p
where
† : spectralᴰ X → is-spectral X holds
† = pr₁ ∘ spectralᴰ-implies-ssb ua X
\end{code}
The split support result:
\begin{code}
truncated-spectralᴰ-implies-spectralᴰ : (ua : Univalence) (X : Locale 𝓤 𝓥 𝓥)
→ ∥ spectralᴰ X ∥ → spectralᴰ X
truncated-spectralᴰ-implies-spectralᴰ {𝓤} {𝓥} ua X p =
spectral-and-small-𝒦-implies-spectralᴰ
X
(truncated-spectralᴰ-implies-spectral ua X p)
†
where
φ : spectralᴰ X → 𝒦 X is 𝓥 small
φ σᴰ = 𝒦-is-small
X
(spectralᴰ-implies-directed-basisᴰ X σᴰ)
(basisₛ-consists-of-compact-opens X σᴰ)
(local-smallness X)
† : 𝒦 X is 𝓥 small
† = ∥∥-rec (being-small-is-prop ua (𝒦 X) 𝓥) φ p
\end{code}