---
title: The spectral Scott locale of a Scott domain
author: Ayberk Tosun
date-started: 2023-10-25
date-completed: 2023-11-26
dates-updated: [2024-03-16]
---
In this module, we prove that the Scott locale of any Scott domain is a spectral
locale (provided that the domain in consideration is large and locally small and
satisfies a certain decidability condition).
\begin{code}[hide]
{-# OPTIONS --safe --without-K --exact-split --lossy-unification #-}
open import MLTT.List hiding ([_])
open import MLTT.Spartan hiding (𝟚)
open import Slice.Family
open import UF.EquivalenceExamples
open import UF.FunExt
open import UF.Logic
open import UF.Powerset-MultiUniverse
open import UF.PropTrunc
open import UF.Size
open import UF.Subsingletons
open import UF.SubtypeClassifier
open import UF.Univalence
module Locales.ScottLocale.ScottLocalesOfScottDomains
(pt : propositional-truncations-exist)
(fe : Fun-Ext)
(sr : Set-Replacement pt)
(𝓤 : Universe) where
open import DomainTheory.BasesAndContinuity.Bases pt fe 𝓤
open import DomainTheory.BasesAndContinuity.CompactBasis pt fe 𝓤
open import DomainTheory.BasesAndContinuity.Continuity pt fe 𝓤
open import DomainTheory.BasesAndContinuity.ScottDomain pt fe 𝓤
open import DomainTheory.Basics.Dcpo pt fe 𝓤
renaming (⟨_⟩ to ⟨_⟩∙) hiding (is-directed)
open import DomainTheory.Basics.WayBelow pt fe 𝓤
open import DomainTheory.Topology.ScottTopology pt fe 𝓤
open import DomainTheory.Topology.ScottTopologyProperties pt fe 𝓤
open import Locales.Compactness.Definition pt fe
hiding (is-compact)
open import Locales.Frame pt fe
hiding (∅)
open import Locales.ScottLocale.Definition pt fe 𝓤
open import Locales.ScottLocale.Properties pt fe 𝓤
open import Locales.SmallBasis pt fe sr
open import Locales.Spectrality.SpectralLocale pt fe
open AllCombinators pt fe
open Locale
open PropositionalTruncation pt hiding (_∨_)
\end{code}
The module:
\begin{code}
open import Locales.ScottLocale.ScottLocalesOfAlgebraicDcpos pt fe 𝓤
\end{code}
contains a proof that the Scott locale of any algebraic dcpo is a locale.
In this module, we extend this proof by showing that the Scott locale is
spectral.
\section{Preliminaries}
The following function expresses a list being contained in a given subset.
\begin{code}
_⊆⊆_ : {𝓤 𝓥 : Universe} {X : 𝓤 ̇ } → List X → 𝓟 {𝓥} {𝓤} X → 𝓤 ⊔ 𝓥 ̇
_⊆⊆_ {_} {_} {X} xs U = (x : X) → member x xs → x ∈ U
\end{code}
For the proof of spectrality, we will also need the following decidability
assumption for upper boundedness of compact elements.
\begin{code}
decidability-condition : (𝓓 : DCPO {𝓤 ⁺} {𝓤}) → 𝓤 ⁺ ̇
decidability-condition 𝓓 = (c d : ⟨ 𝓓 ⟩∙) →
is-compact 𝓓 c → is-compact 𝓓 d →
is-decidable (bounded-above 𝓓 c d holds)
\end{code}
This condition is trivially satisfied if the dcpo in consideration is complete
(or equivalently, it has all binary joins) because the upper bound mentioned
here will always exist. In many cases, the dcpos we are interested in turn out
to be such complete lattices.
\section{The proof}
As mentioned previously, we assume a couple of things.
1. The dcpo `𝓓` in consideration is large and locally small.
2. It is pointed.
3. It has a specified small compact basis.
4. It satisfies the aforementioned decidability condition.
5. It is bounded complete (which means it is a Scott domain when combined
with the algebraicity condition).
\begin{code}
open DefinitionOfBoundedCompleteness
module SpectralScottLocaleConstruction
(𝓓 : DCPO {𝓤 ⁺} {𝓤})
(hl : has-least (underlying-order 𝓓))
(hscb : has-specified-small-compact-basis 𝓓)
(dc : decidability-condition 𝓓)
(bc : bounded-complete 𝓓 holds)
(pe : propext 𝓤) where
open ScottLocaleConstruction 𝓓 hscb pe
\end{code}
We denote by `Σ𝓓` the large and locally small Scott locale of the dcpo `𝓓`.
\begin{code}
open ScottLocaleProperties 𝓓 hl hscb pe
Σ[𝓓] : Locale (𝓤 ⁺) 𝓤 𝓤
Σ[𝓓] = Σ⦅𝓓⦆
\end{code}
We denote by `(B, β)` the algebraic basis of the pointed dcpo 𝓓 in consideration.
\begin{code}
B : 𝓤 ̇
B = index-of-compact-basis 𝓓 hscb
β : B → ⟨ 𝓓 ⟩∙
β i = family-of-compact-elements 𝓓 hscb i
open structurally-algebraic
scb : is-small-compact-basis 𝓓 (family-of-compact-elements 𝓓 hscb)
scb = small-compact-basis 𝓓 hscb
open is-small-compact-basis scb
ϟ : (b : B) → is-compact 𝓓 (β b)
ϟ = basis-is-compact
\end{code}
We define some nice notation for the prop-valued equality of the dcpo `𝓓`.
\begin{code}
open DefnOfScottTopology 𝓓 𝓤
open BottomLemma 𝓓 𝕒 hl
open Properties 𝓓
open binary-unions-of-subsets pt
\end{code}
We also define some nice notation for the open given by a basis index.
\begin{code}
↑ᵏ[_] : B → ⟨ 𝒪 Σ[𝓓] ⟩
↑ᵏ[ i ] = ↑ˢ[ β i , ϟ i ]
\end{code}
We now proceed to construct the intensional basis for the Scott locale.
The basis is the family `(List B , 𝜸₀)`, where `𝜸₀` is the following function:
\begin{code}
𝜸₀ : List B → 𝓟 {𝓤} ⟨ 𝓓 ⟩∙
𝜸₀ = foldr _∪_ ∅ ∘ map (principal-filter 𝓓 ∘ β)
\end{code}
For the reader who might be unfamiliar with it, `foldr` is a function on lists
that takes a binary function `f : X → Y → Y` and an element `u : Y`, and "folds"
a given a list `x[0], …, x[n-1]` into
```
f(x[0], f(x[1], … f(x[n-1], u)))
```
\begin{code}
𝜸₀-is-upwards-closed : (ks : List B)
→ is-upwards-closed (𝜸₀ ks) holds
𝜸₀-is-upwards-closed [] x y () q
𝜸₀-is-upwards-closed (b ∷ bs) x y p q =
∥∥-rec (holds-is-prop (y ∈ₚ 𝜸₀ (b ∷ bs))) † p
where
† : (β b ⊑⟨ 𝓓 ⟩ x) + x ∈ 𝜸₀ bs → 𝜸₀ (b ∷ bs) y holds
† (inl r) = ∣ inl (principal-filter-is-upwards-closed (β b) x y r q) ∣
† (inr r) = ∣ inr (𝜸₀-is-upwards-closed bs x y r q) ∣
𝜸₀-is-inaccessible-by-directed-joins :(ks : List B)
→ is-inaccessible-by-directed-joins (𝜸₀ ks)
holds
𝜸₀-is-inaccessible-by-directed-joins [] (S , δ) ()
𝜸₀-is-inaccessible-by-directed-joins (k ∷ ks) (S , δ) p =
∥∥-rec ∃-is-prop † p
where
σ : is-scott-open (↑[ 𝓓 ] β k) holds
σ = compact-implies-principal-filter-is-scott-open (β k) (basis-is-compact k)
υ : is-upwards-closed (↑[ 𝓓 ] (β k)) holds
υ = 𝒪ₛᴿ.pred-is-upwards-closed (to-𝒪ₛᴿ (↑[ 𝓓 ] (β k) , σ))
ι : is-inaccessible-by-directed-joins (↑[ 𝓓 ] β k) holds
ι = 𝒪ₛᴿ.pred-is-inaccessible-by-dir-joins (to-𝒪ₛᴿ (↑[ 𝓓 ] (β k) , σ))
† : (β k ⊑⟨ 𝓓 ⟩ (⋁ (S , δ))) + (⋁ (S , δ)) ∈ 𝜸₀ ks
→ ∃ i ꞉ index S , (S [ i ]) ∈ 𝜸₀ (k ∷ ks)
† (inl q) = let
‡ : Σ i ꞉ index S , (S [ i ]) ∈ ↑[ 𝓓 ] β k
→ ∃ i ꞉ index S , (S [ i ]) ∈ 𝜸₀ (k ∷ ks)
‡ = λ { (i , p) → ∣ i , ∣ inl p ∣ ∣}
in
∥∥-rec ∃-is-prop ‡ (ι (S , δ) q)
† (inr q) = let
IH : ∃ i ꞉ index S , (S [ i ]) ∈ 𝜸₀ ks
IH = 𝜸₀-is-inaccessible-by-directed-joins ks (S , δ) q
‡ : Σ i ꞉ index S , (S [ i ]) ∈ 𝜸₀ ks
→ ∃ i ꞉ index S , (S [ i ]) ∈ 𝜸₀ (k ∷ ks)
‡ = λ { (i , r) → ∣ i , ∣ inr r ∣ ∣}
in
∥∥-rec ∃-is-prop ‡ IH
𝜸₀-gives-scott-opens : (ks : List B) → is-scott-open (𝜸₀ ks) holds
𝜸₀-gives-scott-opens ks = ⦅𝟏⦆ , ⦅𝟐⦆
where
⦅𝟏⦆ = 𝜸₀-is-upwards-closed ks
⦅𝟐⦆ = 𝜸₀-is-inaccessible-by-directed-joins ks
𝜸₀-lemma : (x : ⟨ 𝓓 ⟩∙) (ks : List B)
→ x ∈ 𝜸₀ ks → ∃ k ꞉ B , member k ks × β k ⊑⟨ 𝓓 ⟩ x
𝜸₀-lemma x [] = λ ()
𝜸₀-lemma x (k ∷ ks) p = ∥∥-rec ∃-is-prop † p
where
† : principal-filter 𝓓 (β k) x holds + x ∈ 𝜸₀ ks
→ ∃ k₀ ꞉ B , member k₀ (k ∷ ks) × underlying-order 𝓓 (β k₀) x
† (inl q) = ∣ k , (in-head , q) ∣
† (inr q) = ∥∥-rec
∃-is-prop
(λ { (k₀ , r , s) → ∣ k₀ , in-tail r , s ∣})
(𝜸₀-lemma x ks q)
𝜸 : List B → ⟨ 𝒪 Σ[𝓓] ⟩
𝜸 ks = 𝜸₀ ks , 𝜸₀-gives-scott-opens ks
𝜸₁ : List B → ⟨ 𝒪 Σ[𝓓] ⟩
𝜸₁ [] = 𝟎[ 𝒪 Σ[𝓓] ]
𝜸₁ (k ∷ ks) = ↑ᵏ[ k ] ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ ks
\end{code}
The function `𝜸₁` is equal to `𝜸`.
\begin{code}
𝜸-below-𝜸₁ : (bs : List B) → (𝜸 bs ≤[ poset-of (𝒪 Σ[𝓓]) ] 𝜸₁ bs) holds
𝜸-below-𝜸₁ [] _ ()
𝜸-below-𝜸₁ (i ∷ is) j p =
∥∥-rec (holds-is-prop (𝜸₁ (i ∷ is) .pr₁ (β j))) † p
where
IH : (𝜸 is ≤[ poset-of (𝒪 Σ[𝓓]) ] 𝜸₁ is) holds
IH = 𝜸-below-𝜸₁ is
† : (β i ⊑⟨ 𝓓 ⟩ β j) + (β j ∈ₛ 𝜸 is) holds
→ ((β j) ∈ₛ 𝜸₁ (i ∷ is)) holds
† (inl q) = ∣ inl ⋆ , q ∣
† (inr q) = ∣ inr ⋆ , IH j q ∣
𝜸₁-below-𝜸 : (bs : List B) → (𝜸₁ bs ≤[ poset-of (𝒪 Σ[𝓓]) ] 𝜸 bs) holds
𝜸₁-below-𝜸 [] j p = 𝟎-is-bottom (𝒪 Σ[𝓓]) (𝜸 []) j p
𝜸₁-below-𝜸 (i ∷ is) j p = ∥∥-rec (holds-is-prop (β j ∈ₛ 𝜸 (i ∷ is))) † p
where
IH : (𝜸₁ is ≤[ poset-of (𝒪 Σ[𝓓]) ] 𝜸 is) holds
IH = 𝜸₁-below-𝜸 is
† : (Σ k ꞉ 𝟚 𝓤 ,
(β j ∈ₛ (⁅ ↑ᵏ[ i ] , 𝜸₁ is ⁆ [ k ])) holds)
→ (β j ∈ₛ 𝜸 (i ∷ is)) holds
† (inl ⋆ , r) = ∣ inl r ∣
† (inr ⋆ , r) = ∣ inr (IH j r) ∣
𝜸-equal-to-𝜸₁ : (bs : List B) → 𝜸 bs = 𝜸₁ bs
𝜸-equal-to-𝜸₁ bs =
≤-is-antisymmetric (poset-of (𝒪 Σ[𝓓])) (𝜸-below-𝜸₁ bs) (𝜸₁-below-𝜸 bs)
\end{code}
TODO: get rid of `𝜸` altogether and use `𝜸₁` as the basis function
\begin{code}
𝜸-lemma₁ : (is js : List B) → (𝜸 is ≤[ poset-of (𝒪 Σ[𝓓]) ] 𝜸 (is ++ js)) holds
𝜸-lemma₁ [] js = λ _ ()
𝜸-lemma₁ (i ∷ is) [] = let
open PosetNotation (poset-of (𝒪 Σ[𝓓]))
† : (i ∷ is) = (i ∷ is) ++ []
† = []-right-neutral (i ∷ is)
‡ : (𝜸 (i ∷ is) ≤ 𝜸 (i ∷ is)) holds
‡ = ≤-is-reflexive (poset-of (𝒪 Σ[𝓓])) (𝜸 (i ∷ is))
in
transport (λ - → (𝜸 (i ∷ is) ≤ 𝜸 -) holds) † ‡
𝜸-lemma₁ (i ∷ is) (j ∷ js) x p = Ⅲ x (Ⅱ x (Ⅰ x p))
where
† : (𝜸₁ is ≤[ poset-of (𝒪 Σ[𝓓]) ] 𝜸₁ (is ++ (j ∷ js))) holds
† y q =
𝜸-below-𝜸₁ (is ++ (j ∷ js)) y (𝜸-lemma₁ is (j ∷ js) y (𝜸₁-below-𝜸 is y q))
Ⅰ = 𝜸-below-𝜸₁ (i ∷ is)
Ⅱ = ∨[ 𝒪 Σ[𝓓] ]-right-monotone †
Ⅲ = 𝜸₁-below-𝜸 (i ∷ (is ++ (j ∷ js)))
𝜸-lemma₂ : (is js : List B) → (𝜸 js ≤[ poset-of (𝒪 Σ[𝓓]) ] 𝜸 (is ++ js)) holds
𝜸-lemma₂ [] js = ≤-is-reflexive (poset-of (𝒪 Σ[𝓓])) (𝜸 js)
𝜸-lemma₂ is@(i ∷ is′) js = λ x p → ∣_∣ (inr (𝜸-lemma₂ is′ js x p))
𝜸-maps-∨-to-++ : (is js : List B) → 𝜸₁ (is ++ js) = 𝜸₁ is ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ js
𝜸-maps-∨-to-++ [] js = 𝟎-right-unit-of-∨ (𝒪 Σ[𝓓]) (𝜸₁ js) ⁻¹
𝜸-maps-∨-to-++ (i ∷ is) js =
𝜸₁ ((i ∷ is) ++ js) =⟨ refl ⟩
↑ᵏ[ i ] ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ (is ++ js) =⟨ Ⅰ ⟩
↑ᵏ[ i ] ∨[ 𝒪 Σ[𝓓] ] (𝜸₁ is ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ js) =⟨ Ⅱ ⟩
(↑ᵏ[ i ] ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ is) ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ js =⟨ refl ⟩
𝜸₁ (i ∷ is) ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ js ∎
where
Ⅰ = ap (λ - → ↑ᵏ[ i ] ∨[ 𝒪 Σ[𝓓] ] -) (𝜸-maps-∨-to-++ is js)
Ⅱ = ∨[ 𝒪 Σ[𝓓] ]-assoc ↑ᵏ[ i ] (𝜸₁ is) (𝜸₁ js) ⁻¹
\end{code}
The principal filter `↑(x)` on any `x : 𝓓` is a compact Scott open.
\begin{code}
principal-filter-is-compact : (b : B)
→ is-compact-open Σ[𝓓] ↑ᵏ[ b ] holds
principal-filter-is-compact b = principal-filter-is-compact₀ (β b) (ϟ b)
\end{code}
For any `bs : List B`, the Scott open `𝜸₁(bs)` is compact.
\begin{code}
𝜸₁-gives-compact-opens : (bs : List B) → is-compact-open Σ[𝓓] (𝜸₁ bs) holds
𝜸₁-gives-compact-opens [] = 𝟎-is-compact Σ[𝓓]
𝜸₁-gives-compact-opens (b ∷ bs) = †
where
𝔘ᶜ : ⟨ 𝒪 Σ[𝓓] ⟩
𝔘ᶜ = ↑[ 𝓓 ] (β b)
, compact-implies-principal-filter-is-scott-open (β b) (basis-is-compact b)
𝔘ᶜᵣ : 𝒪ₛᴿ
𝔘ᶜᵣ = to-𝒪ₛᴿ 𝔘ᶜ
IH : is-compact-open Σ[𝓓] (𝜸₁ bs) holds
IH = 𝜸₁-gives-compact-opens bs
† : is-compact-open Σ[𝓓] (𝜸₁ (b ∷ bs)) holds
† = compact-opens-are-closed-under-∨
Σ[𝓓]
𝔘ᶜ
(𝜸₁ bs)
(principal-filter-is-compact b)
IH
𝜸-gives-compact-opens : (bs : List B) → is-compact-open Σ[𝓓] (𝜸 bs) holds
𝜸-gives-compact-opens bs =
transport (λ - → is-compact-open Σ[𝓓] - holds) (𝜸-equal-to-𝜸₁ bs ⁻¹) †
where
† : is-compact-open Σ[𝓓] (𝜸₁ bs) holds
† = 𝜸₁-gives-compact-opens bs
\end{code}
Given compact elements `c` and `d` of `𝓓`, if an element `s` is their sup,
then it is compact.
\begin{code}
sup-is-compact : (c d s : ⟨ 𝓓 ⟩∙)
→ (κᶜ : is-compact 𝓓 c)
→ (κᵈ : is-compact 𝓓 d)
→ is-sup (underlying-order 𝓓) s (binary-family 𝓤 c d [_])
→ is-compact 𝓓 s
sup-is-compact c d s κᶜ κᵈ (p , q) =
binary-join-is-compact 𝓓 (p (inl ⋆)) (p (inr ⋆)) η κᶜ κᵈ
where
η : (d₁ : ⟨ 𝓓 ⟩∙) → c ⊑⟨ 𝓓 ⟩ d₁ → d ⊑⟨ 𝓓 ⟩ d₁ → s ⊑⟨ 𝓓 ⟩ d₁
η d₁ r₁ r₂ = q d₁ λ { (inl ⋆) → r₁ ; (inr ⋆) → r₂}
open DefnOfScottLocale 𝓓 𝓤 pe using (_⊆ₛ_)
\end{code}
\begin{code}
principal-filter-is-antitone : (b c : ⟨ 𝓓 ⟩∙)
→ b ⊑⟨ 𝓓 ⟩ c
→ (κᵇ : is-compact 𝓓 b)
→ (κᶜ : is-compact 𝓓 c)
→ (↑ˢ[ c , κᶜ ] ≤[ poset-of (𝒪 Σ[𝓓]) ] ↑ˢ[ b , κᵇ ]) holds
principal-filter-is-antitone b c p κᵇ κᶜ x =
upward-closure ↑ˢ[ b , κᵇ ] c (β x) p
principal-filter-reflects-joins
: (c d s : ⟨ 𝓓 ⟩∙)
→ (κᶜ : is-compact 𝓓 c)
→ (κᵈ : is-compact 𝓓 d)
→ (σ : is-sup (underlying-order 𝓓) s (⁅ c , d ⁆ [_]))
→ let
κˢ = sup-is-compact c d s κᶜ κᵈ σ
in
↑ˢ[ s , κˢ ] = ↑ˢ[ c , κᶜ ] ∧[ 𝒪 Σ[𝓓] ] ↑ˢ[ d , κᵈ ]
principal-filter-reflects-joins c d s κᶜ κᵈ σ =
≤-is-antisymmetric (poset-of (𝒪 Σ[𝓓])) Ⅰ Ⅱ
where
open PosetReasoning (poset-of (𝒪 Σ[𝓓]))
κₛ : is-compact 𝓓 s
κₛ = sup-is-compact c d s κᶜ κᵈ σ
† : (↑ˢ[ s , κₛ ] ⊆ₛ (↑ˢ[ c , κᶜ ] ∧[ 𝒪 Σ[𝓓] ] ↑ˢ[ d , κᵈ ])) holds
† x p = (c ⊑⟨ 𝓓 ⟩[ pr₁ σ (inl ⋆) ] s ⊑⟨ 𝓓 ⟩[ p ] x ∎⟨ 𝓓 ⟩)
, (d ⊑⟨ 𝓓 ⟩[ pr₁ σ (inr ⋆) ] s ⊑⟨ 𝓓 ⟩[ p ] x ∎⟨ 𝓓 ⟩)
‡ : ((↑ˢ[ c , κᶜ ] ∧[ 𝒪 Σ[𝓓] ] ↑ˢ[ d , κᵈ ]) ⊆ₛ ↑ˢ[ s , κₛ ]) holds
‡ x (p , q) = pr₂ σ x λ { (inl ⋆) → p ; (inr ⋆) → q}
Ⅰ : (↑ˢ[ s , κₛ ] ⊆ₖ (↑ˢ[ c , κᶜ ] ∧[ 𝒪 Σ[𝓓] ] ↑ˢ[ d , κᵈ ])) holds
Ⅰ = ⊆ₛ-implies-⊆ₖ ↑ˢ[ s , κₛ ] (↑ˢ[ c , κᶜ ] ∧[ 𝒪 Σ[𝓓] ] ↑ˢ[ d , κᵈ ]) †
Ⅱ : ((↑ˢ[ c , κᶜ ] ∧[ 𝒪 Σ[𝓓] ] ↑ˢ[ d , κᵈ ]) ⊆ₖ ↑ˢ[ s , κₛ ]) holds
Ⅱ = ⊆ₛ-implies-⊆ₖ (↑ˢ[ c , κᶜ ] ∧[ 𝒪 Σ[𝓓] ] ↑ˢ[ d , κᵈ ]) ↑ˢ[ s , κₛ ] ‡
\end{code}
The following is the main lemma used when showing that the image of `𝜸` is
closed under binary meets.
\begin{code}
𝜸-closure-under-∧₁ : (i : B) (is : List B)
→ ∃ ks ꞉ List B , 𝜸₁ ks = ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ is
𝜸-closure-under-∧₁ i [] = let
† = 𝟎-right-annihilator-for-∧ (𝒪 Σ[𝓓]) ↑ᵏ[ i ]
in ∣ [] , († ⁻¹) ∣
𝜸-closure-under-∧₁ i (j ∷ js) = cases †₁ †₂ (dc (β i) (β j) (ϟ i) (ϟ j))
where
IH : ∃ ks′ ꞉ List B , 𝜸₁ ks′ = ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js
IH = 𝜸-closure-under-∧₁ i js
†₁ : (β i ↑[ 𝓓 ] β j) holds
→ ∃ ks ꞉ List B , 𝜸₁ ks = ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ (j ∷ js)
†₁ υ = ∥∥-rec ∃-is-prop ‡₁ ξ
where
open Joins (λ x y → x ⊑⟨ 𝓓 ⟩ₚ y)
s : ⟨ 𝓓 ⟩∙
s = pr₁ (bc ⁅ β i , β j ⁆ υ)
φ : (s is-an-upper-bound-of ⁅ β i , β j ⁆) holds
φ = pr₁ (pr₂ (bc ⁅ β i , β j ⁆ υ))
ψ : is-lowerbound-of-upperbounds (underlying-order 𝓓) s (⁅ β i , β j ⁆ [_])
ψ = pr₂ (pr₂ (bc ⁅ β i , β j ⁆ υ))
κˢ : is-compact 𝓓 s
κˢ = sup-is-compact (β i) (β j) s (ϟ i) (ϟ j) (φ , ψ)
ξ : ∃ k ꞉ B , β k = s
ξ = small-compact-basis-contains-all-compact-elements 𝓓 β scb s κˢ
‡₁ : Σ k ꞉ B , β k = s
→ ∃ ks ꞉ List B , 𝜸₁ ks = ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ (j ∷ js)
‡₁ (k , p) = ∥∥-rec ∃-is-prop ※₁ IH
where
※₁ : Σ ks′ ꞉ List B , 𝜸₁ ks′ = ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js
→ ∃ ks ꞉ List B , 𝜸₁ ks = ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ (j ∷ js)
※₁ (ks′ , q) = ∣ (k ∷ ks′) , ♣ ∣
where
μ : ↑ᵏ[ k ] = ↑ˢ[ s , κˢ ]
μ =
to-subtype-= (holds-is-prop ∘ is-scott-open) (ap (λ - → ↑[ 𝓓 ] -) p)
ζ : ↑ˢ[ s , κˢ ] = ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] ↑ᵏ[ j ]
ζ = principal-filter-reflects-joins (β i) (β j) s (ϟ i) (ϟ j) (φ , ψ)
ρ : ↑ᵏ[ k ] = ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] ↑ᵏ[ j ]
ρ = ↑ᵏ[ k ] =⟨ μ ⟩ ↑ˢ[ s , κˢ ] =⟨ ζ ⟩ ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] ↑ᵏ[ j ] ∎
Ⅰ = ap (λ - → - ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ ks′) ρ
Ⅱ = ap (λ - → (↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] ↑ᵏ[ j ]) ∨[ 𝒪 Σ[𝓓] ] -) q
Ⅲ = binary-distributivity (𝒪 Σ[𝓓]) ↑ᵏ[ i ] ↑ᵏ[ j ] (𝜸₁ js) ⁻¹
♣ : 𝜸₁ (k ∷ ks′) = ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ (j ∷ js)
♣ =
𝜸₁ (k ∷ ks′)
=⟨ refl ⟩
↑ᵏ[ k ] ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ ks′
=⟨ Ⅰ ⟩
(↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] ↑ᵏ[ j ]) ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ ks′
=⟨ Ⅱ ⟩
(↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] ↑ᵏ[ j ]) ∨[ 𝒪 Σ[𝓓] ] (↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js)
=⟨ Ⅲ ⟩
↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] (↑ᵏ[ j ] ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ js)
=⟨ refl ⟩
↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ (j ∷ js)
∎
†₂ : (β i ↑[ 𝓓 ] β j ⇒ ⊥) holds
→ ∃ ks ꞉ List B , 𝜸₁ ks = ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ (j ∷ js)
†₂ ν = ∥∥-rec ∃-is-prop ‡₂ IH
where
‡₂ : Σ ks′ ꞉ List B , 𝜸₁ ks′ = ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js
→ ∃ ks ꞉ List B , 𝜸₁ ks = ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ (j ∷ js)
‡₂ (ks′ , p) = ∣ ks′ , ρ ∣
where
ρ : 𝜸₁ ks′ = ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] (𝜸₁ (j ∷ js))
ρ =
𝜸₁ ks′
=⟨ p ⟩
↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js
=⟨ Ⅰ ⟩
𝟎[ 𝒪 Σ[𝓓] ] ∨[ 𝒪 Σ[𝓓] ] (↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js)
=⟨ Ⅱ ⟩
(↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] ↑ᵏ[ j ]) ∨[ 𝒪 Σ[𝓓] ] (↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js)
=⟨ Ⅲ ⟩
↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] (↑ᵏ[ j ] ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ js)
=⟨ refl ⟩
↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ (j ∷ js)
∎
where
Ⅰ = 𝟎-right-unit-of-∨ (𝒪 Σ[𝓓]) (↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js) ⁻¹
Ⅱ = ap
(λ - → - ∨[ 𝒪 Σ[𝓓] ] (↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js))
(not-bounded-lemma (β i) (β j) (ϟ i) (ϟ j) ν ⁻¹ )
Ⅲ = binary-distributivity (𝒪 Σ[𝓓]) ↑ᵏ[ i ] ↑ᵏ[ j ] (𝜸₁ js) ⁻¹
𝜸-closure-under-∧ : (is js : List B)
→ ∃ ks ꞉ List B , 𝜸₁ ks = 𝜸₁ is ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js
𝜸-closure-under-∧ [] js = ∣ [] , † ∣
where
† = 𝟎-left-annihilator-for-∧ (𝒪 Σ[𝓓]) (𝜸₁ js) ⁻¹
𝜸-closure-under-∧ (i ∷ is) js = ∥∥-rec₂ ∃-is-prop † η₀ ρ₀
where
η₀ : ∃ ks₀ ꞉ List B , 𝜸₁ ks₀ = 𝜸₁ is ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js
η₀ = 𝜸-closure-under-∧ is js
ρ₀ : ∃ ks₁ ꞉ List B , 𝜸₁ ks₁ = ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js
ρ₀ = 𝜸-closure-under-∧₁ i js
† : Σ ks₀ ꞉ List B , 𝜸₁ ks₀ = 𝜸₁ is ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js
→ Σ ks₁ ꞉ List B , 𝜸₁ ks₁ = ↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js
→ ∃ ks ꞉ List B , 𝜸₁ ks = 𝜸₁ (i ∷ is) ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js
† (ks₀ , p₀) (ks₁ , p₁) = ∣ (ks₀ ++ ks₁) , ‡ ∣
where
‡ : 𝜸₁ (ks₀ ++ ks₁) = 𝜸₁ (i ∷ is) ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js
‡ =
𝜸₁ (ks₀ ++ ks₁)
=⟨ Ⅰ ⟩
𝜸₁ ks₀ ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ ks₁
=⟨ Ⅱ ⟩
(𝜸₁ is ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js) ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ ks₁
=⟨ Ⅲ ⟩
(𝜸₁ is ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js) ∨[ 𝒪 Σ[𝓓] ] (↑ᵏ[ i ] ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js)
=⟨ Ⅳ ⟩
(𝜸₁ is ∨[ 𝒪 Σ[𝓓] ] ↑ᵏ[ i ]) ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js
=⟨ Ⅴ ⟩
(↑ᵏ[ i ] ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ is) ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js
=⟨ refl ⟩
𝜸₁ (i ∷ is) ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js
∎
where
Ⅰ = 𝜸-maps-∨-to-++ ks₀ ks₁
Ⅱ = ap (λ - → - ∨[ 𝒪 Σ[𝓓] ] 𝜸₁ ks₁) p₀
Ⅲ = ap (λ - → (𝜸₁ is ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js) ∨[ 𝒪 Σ[𝓓] ] -) p₁
Ⅳ = binary-distributivity-right (𝒪 Σ[𝓓]) ⁻¹
Ⅴ = ap
(λ - → - ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js)
(∨[ 𝒪 Σ[𝓓] ]-is-commutative (𝜸₁ is) ↑ᵏ[ i ])
\end{code}
We are now ready to package up the basis. We call it `basis-for-Σ[𝓓]`.
\begin{code}
basis-for-Σ[𝓓] : Fam 𝓤 ⟨ 𝒪 Σ[𝓓] ⟩
basis-for-Σ[𝓓] = List B , 𝜸
open PropertiesAlgebraic 𝓓 𝕒
\end{code}
This forms a directed basis.
\begin{code}
Σ[𝓓]-dir-basis-forᴰ : directed-basis-forᴰ (𝒪 Σ[𝓓]) basis-for-Σ[𝓓]
Σ[𝓓]-dir-basis-forᴰ U@(_ , so) = (D , δ) , † , 𝒹
where
open Joins (λ x y → x ≤[ poset-of (𝒪 Σ[𝓓]) ] y)
Uᴿ : 𝒪ₛᴿ
Uᴿ = to-𝒪ₛᴿ U
open 𝒪ₛᴿ Uᴿ renaming (pred to 𝔘)
D : 𝓤 ̇
D = (Σ b⃗ ꞉ (List B) , ((b : B) → member b b⃗ → (β b) ∈ 𝔘))
δ : (Σ b⃗ ꞉ (List B) , ((b : B) → member b b⃗ → (β b) ∈ 𝔘)) → List B
δ = pr₁
†₁ : (U is-an-upper-bound-of ⁅ 𝜸 d ∣ d ε (D , δ) ⁆) holds
†₁ (b⃗ , r) b p =
∥∥-rec (holds-is-prop (β b ∈ₚ 𝔘)) ‡₁ (𝜸₀-lemma (β b) b⃗ p)
where
‡₁ : Σ k ꞉ B , member k b⃗ × β k ⊑⟨ 𝓓 ⟩ β b → β b ∈ 𝔘
‡₁ (k , q , φ) = pred-is-upwards-closed (β k) (β b) (r k q) φ
†₂ : ((U′ , _) : upper-bound ⁅ 𝜸 d ∣ d ε (D , δ) ⁆)
→ (U ≤[ poset-of (𝒪 Σ[𝓓]) ] U′) holds
†₂ (U′ , ψ) k p = ‡₂ k (reflexivity 𝓓 (β k))
where
r : ↑ˢ[ β k , ϟ k ] = 𝜸 (k ∷ [])
r =
↑ˢ[ β k , ϟ k ] =⟨ Ⅰ ⟩
↑ˢ[ β k , ϟ k ] ∨[ 𝒪 Σ[𝓓] ] 𝟎[ 𝒪 Σ[𝓓] ] =⟨ Ⅱ ⟩
𝜸 (k ∷ []) ∎
where
Ⅰ = 𝟎-left-unit-of-∨ (𝒪 Σ[𝓓]) ↑ˢ[ β k , ϟ k ] ⁻¹
Ⅱ = 𝜸-equal-to-𝜸₁ (k ∷ []) ⁻¹
‡₂ : (↑ˢ[ β k , ϟ k ] ≤[ poset-of (𝒪 Σ[𝓓]) ] U′) holds
‡₂ = transport
(λ - → (- ≤[ poset-of (𝒪 Σ[𝓓]) ] U′) holds)
(r ⁻¹)
(ψ ((k ∷ []) , λ { _ in-head → p}))
† : (U is-lub-of ⁅ 𝜸 d ∣ d ε (D , δ) ⁆) holds
† = †₁ , †₂
𝒹↑ : ((is , _) (js , _) : D)
→ ∃ (ks , _) ꞉ D , (𝜸 is ⊆ₖ 𝜸 ks) holds × (𝜸 js ⊆ₖ 𝜸 ks) holds
𝒹↑ (is , 𝕚) (js , 𝕛)= ∣ ((is ++ js) , ♣) , 𝜸-lemma₁ is js , 𝜸-lemma₂ is js ∣
where
♣ : (b : B) → member b (is ++ js) → 𝔘 (β b) holds
♣ b q = cases (𝕚 b) (𝕛 b) (split-++-membership b is js q)
𝒹 : is-directed (𝒪 Σ[𝓓]) ⁅ 𝜸 d ∣ d ε (D , δ) ⁆ holds
𝒹 = ∣ [] , (λ _ ()) ∣ , 𝒹↑
\end{code}
The lemmas we have proved so far constitute the proof of spectrality when
combined as follows.
\begin{code}
σᴰ : spectralᴰ Σ[𝓓]
σᴰ = pr₁ Σ-assoc (𝒷 , 𝜸-gives-compact-opens , τ , μ)
where
𝒷 : directed-basisᴰ (𝒪 Σ[𝓓])
𝒷 = basis-for-Σ[𝓓] , Σ[𝓓]-dir-basis-forᴰ
τ : contains-top (𝒪 Σ[𝓓]) basis-for-Σ[𝓓] holds
τ = ∥∥-rec
(holds-is-prop (contains-top (𝒪 Σ[𝓓]) basis-for-Σ[𝓓]))
†
(compact-opens-are-basic Σ[𝓓] 𝒷 𝟏[ 𝒪 Σ[𝓓] ] ⊤-is-compact)
where
† : Σ is ꞉ List B , (𝜸 is) = 𝟏[ 𝒪 Σ[𝓓] ]
→ contains-top (𝒪 Σ[𝓓]) basis-for-Σ[𝓓] holds
† (is , p) =
∣ is , transport (_holds ∘ is-top (𝒪 Σ[𝓓])) (p ⁻¹) (𝟏-is-top (𝒪 Σ[𝓓])) ∣
μ : closed-under-binary-meets (𝒪 Σ[𝓓]) basis-for-Σ[𝓓] holds
μ is js = ∥∥-rec ∃-is-prop † (𝜸-closure-under-∧ is js)
where
open Meets (λ x y → x ≤[ poset-of (𝒪 Σ[𝓓]) ] y)
† : (Σ ks ꞉ List B , 𝜸₁ ks = 𝜸₁ is ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js)
→ ∃ ks ꞉ List B , ((𝜸 ks) is-glb-of (𝜸 is , 𝜸 js)) holds
† (ks , p) =
∣ ks , transport (λ - → (- is-glb-of (𝜸 is , 𝜸 js)) holds) q ‡ ∣
where
q : 𝜸 is ∧[ 𝒪 Σ[𝓓] ] 𝜸 js = 𝜸 ks
q = 𝜸 is ∧[ 𝒪 Σ[𝓓] ] 𝜸 js =⟨ Ⅰ ⟩
𝜸₁ is ∧[ 𝒪 Σ[𝓓] ] 𝜸 js =⟨ Ⅱ ⟩
𝜸₁ is ∧[ 𝒪 Σ[𝓓] ] 𝜸₁ js =⟨ Ⅲ ⟩
𝜸₁ ks =⟨ Ⅳ ⟩
𝜸 ks ∎
where
Ⅰ = ap (λ - → - ∧[ 𝒪 Σ[𝓓] ] 𝜸 js) (𝜸-equal-to-𝜸₁ is)
Ⅱ = ap (λ - → 𝜸₁ is ∧[ 𝒪 Σ[𝓓] ] - ) (𝜸-equal-to-𝜸₁ js)
Ⅲ = p ⁻¹
Ⅳ = 𝜸-equal-to-𝜸₁ ks ⁻¹
‡ : ((𝜸 is ∧[ 𝒪 Σ[𝓓] ] 𝜸 js) is-glb-of (𝜸 is , 𝜸 js)) holds
‡ = (∧[ 𝒪 Σ[𝓓] ]-lower₁ (𝜸 is) (𝜸 js) , ∧[ 𝒪 Σ[𝓓] ]-lower₂ (𝜸 is) (𝜸 js))
, λ { (l , φ , ψ) → ∧[ 𝒪 Σ[𝓓] ]-greatest (𝜸 is) (𝜸 js) l φ ψ}
\end{code}
In the module `SpectralScottLocaleConstruction` above, we worked with a
specified basis for convenience. Because the type of bases for algebraic dcpos
has split support, we can carry out the same construction with an unspecified
basis. The following module is a wrapper around the previous
`SpectralScottLocaleConstruction` module in which the spectrality proof is
constructed with only the assumption of an unspecified basis.
\begin{code}
open DefinitionOfScottDomain
module SpectralScottLocaleConstruction₂
(𝓓 : DCPO {𝓤 ⁺} {𝓤})
(ua : Univalence)
(hl : has-least (underlying-order 𝓓))
(sd : is-scott-domain 𝓓 holds)
(dc : decidability-condition 𝓓)
(pe : propext 𝓤) where
𝒷₀ : has-unspecified-small-compact-basis 𝓓
𝒷₀ = pr₁ sd
bc : bounded-complete 𝓓 holds
bc = pr₂ sd
hscb : has-specified-small-compact-basis 𝓓
hscb = specified-small-compact-basis-has-split-support ua sr 𝓓 𝒷₀
𝕒 : structurally-algebraic 𝓓
𝕒 = structurally-algebraic-if-specified-small-compact-basis 𝓓 hscb
pe′ : propext 𝓤
pe′ = univalence-gives-propext (ua 𝓤)
open SpectralScottLocaleConstruction 𝓓 hl hscb dc bc pe
σ⦅𝓓⦆ : Locale (𝓤 ⁺) 𝓤 𝓤
σ⦅𝓓⦆ = Σ[𝓓]
scott-locale-spectralᴰ : spectralᴰ Σ[𝓓]
scott-locale-spectralᴰ = σᴰ
scott-locale-is-spectral : is-spectral Σ[𝓓] holds
scott-locale-is-spectral = spectralᴰ-gives-spectrality Σ[𝓓] σᴰ
scott-locale-has-small-𝒦 : has-small-𝒦 Σ[𝓓]
scott-locale-has-small-𝒦 = spectralᴰ-implies-small-𝒦 Σ[𝓓] σᴰ
scott-locale-has-spectral-basis : is-spectral-with-small-basis ua Σ[𝓓] holds
scott-locale-has-spectral-basis =
scott-locale-is-spectral , scott-locale-has-small-𝒦
\end{code}