Ayberk Tosun, 21 April 2022 (date completed)
Based on `ayberkt/formal-topology-in-UF`.
\begin{code}[hide]
{-# OPTIONS --safe --without-K --lossy-unification #-}
open import MLTT.List hiding ([_])
open import MLTT.Pi
open import MLTT.Spartan
open import Slice.Family
open import UF.Base
open import UF.EquivalenceExamples
open import UF.FunExt
open import UF.PropTrunc
open import UF.Size
open import UF.SubtypeClassifier
open import UF.UA-FunExt
open import UF.Univalence
\end{code}
\begin{code}
module Locales.PatchLocale
(pt : propositional-truncations-exist)
(fe : Fun-Ext)
(sr : Set-Replacement pt)
where
open import Locales.Compactness.Definition pt fe
open import Locales.ContinuousMap.FrameHomomorphism-Definition pt fe
open import Locales.ContinuousMap.FrameHomomorphism-Properties pt fe
open import Locales.Frame pt fe
open import Locales.Nucleus pt fe
open import Locales.SmallBasis pt fe sr
open import Locales.Spectrality.SpectralLocale pt fe
open import UF.Logic
open import UF.Subsingletons
open AllCombinators pt fe
open FrameHomomorphismProperties
open FrameHomomorphisms hiding (fun; fun-syntax)
open PropositionalTruncation pt
\end{code}
We fix a locale `X` for the remainder of this module.
\begin{code}
open Locale
module PatchConstruction (X : Locale 𝓤 𝓥 𝓦) (σ : is-spectral X holds) where
_≤_ : ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩ → Ω 𝓥
U ≤ V = U ≤[ poset-of (𝒪 X) ] V
open Meets _≤_
_⊓_ : ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩
U ⊓ V = U ∧[ 𝒪 X ] V
⋁_ : Fam 𝓦 ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩
⋁ S = ⋁[ 𝒪 X ] S
\end{code}
A nucleus is called perfect iff it is Scott-continuous:
\begin{code}
is-perfect : (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩) → Ω (𝓤 ⊔ 𝓥 ⊔ 𝓦 ⁺)
is-perfect = is-scott-continuous (𝒪 X) (𝒪 X)
\end{code}
\begin{code}
Perfect-Nucleus : 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⁺ ̇
Perfect-Nucleus = Σ j ꞉ (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩) ,
((is-nucleus (𝒪 X) j ∧ is-perfect j) holds)
\end{code}
\begin{code}
nucleus-of : Perfect-Nucleus → Nucleus (𝒪 X)
nucleus-of (j , ζ , _) = j , ζ
\end{code}
\section{Poset of perfect nuclei}
\begin{code}
_$_ : Perfect-Nucleus → ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩
(j , _) $ U = j U
\end{code}
\begin{code}
perfect-nuclei-eq : (𝒿 𝓀 : Perfect-Nucleus) → 𝒿 $_ = 𝓀 $_ → 𝒿 = 𝓀
perfect-nuclei-eq 𝒿 𝓀 = to-subtype-= γ
where
γ : (j : ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩)
→ is-prop ((is-nucleus (𝒪 X) j ∧ is-perfect j) holds)
γ j = holds-is-prop (is-nucleus (𝒪 X) j ∧ is-perfect j)
perfect-nuclei-eq-inverse : (𝒿 𝓀 : Perfect-Nucleus) → 𝒿 = 𝓀 → 𝒿 $_ ∼ 𝓀 $_
perfect-nuclei-eq-inverse 𝒿 𝓀 p =
transport (λ - → 𝒿 $_ ∼ - $_) p λ _ → refl
where
† : 𝒿 .pr₁ = 𝓀 .pr₁
† = pr₁ (from-Σ-= p)
\end{code}
Nuclei are ordered pointwise.
\begin{code}
_≼₀_ : (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩) → (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩) → Ω (𝓤 ⊔ 𝓥)
_≼₀_ j k = Ɐ U ꞉ ⟨ 𝒪 X ⟩ , (j U) ≤[ poset-of (𝒪 X) ] (k U)
_≼₁_ : Prenucleus (𝒪 X) → Prenucleus (𝒪 X) → Ω (𝓤 ⊔ 𝓥)
𝒿 ≼₁ 𝓀 = pr₁ 𝒿 ≼₀ pr₁ 𝓀
_≼_ : Perfect-Nucleus → Perfect-Nucleus → Ω (𝓤 ⊔ 𝓥)
𝒿 ≼ 𝓀 = (λ x → 𝒿 $ x) ≼₀ (λ x → 𝓀 $ x)
\end{code}
\begin{code}
≼-is-reflexive : is-reflexive _≼_ holds
≼-is-reflexive 𝒿 U = ≤-is-reflexive (poset-of (𝒪 X)) (𝒿 $ U)
\end{code}
\begin{code}
≼-is-transitive : is-transitive _≼_ holds
≼-is-transitive 𝒾 𝒿 𝓀 φ ψ U = 𝒾 $ U ≤⟨ φ U ⟩ 𝒿 $ U ≤⟨ ψ U ⟩ 𝓀 $ U ■
where
open PosetReasoning (poset-of (𝒪 X))
\end{code}
\begin{code}
≼-is-preorder : is-preorder _≼_ holds
≼-is-preorder = ≼-is-reflexive , ≼-is-transitive
\end{code}
\begin{code}
≼-is-antisymmetric : is-antisymmetric _≼_
≼-is-antisymmetric {x = 𝒿} {𝓀} φ ψ = perfect-nuclei-eq 𝒿 𝓀 (dfunext fe γ)
where
γ : 𝒿 $_ ∼ 𝓀 $_
γ U = ≤-is-antisymmetric (poset-of (𝒪 X)) (φ U) (ψ U)
\end{code}
\begin{code}
patch-poset : Poset (𝓤 ⊔ 𝓥 ⊔ 𝓦 ⁺) (𝓤 ⊔ 𝓥)
patch-poset = Perfect-Nucleus , _≼_ , ≼-is-preorder , ≼-is-antisymmetric
\end{code}
\section{Meet-semilattice of perfect nuclei}
\begin{code}
_⋏₀_ : (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩) → (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩) → (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩)
j ⋏₀ k = λ x → j x ∧[ 𝒪 X ] k x
⋏₀-inflationary : (j k : ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩)
→ is-inflationary (𝒪 X) j holds
→ is-inflationary (𝒪 X) k holds
→ is-inflationary (𝒪 X) (j ⋏₀ k) holds
⋏₀-inflationary j k p q U =
∧[ 𝒪 X ]-greatest (j U) (k U) U (p U) (q U)
⋏₀-idempotent : (j k : ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩)
→ preserves-binary-meets (𝒪 X) (𝒪 X) j holds
→ preserves-binary-meets (𝒪 X) (𝒪 X) k holds
→ is-idempotent (𝒪 X) j holds
→ is-idempotent (𝒪 X) k holds
→ is-idempotent (𝒪 X) (j ⋏₀ k) holds
⋏₀-idempotent j k ζj ζk ϑj ϑk U =
(j ⋏₀ k) ((j ⋏₀ k) U) =⟨ refl ⟩ₚ
(j ⋏₀ k) (j U ∧[ 𝒪 X ] k U) =⟨ refl ⟩ₚ
j (j U ∧[ 𝒪 X ] k U) ∧[ 𝒪 X ] k (j U ∧[ 𝒪 X ] k U) =⟨ i ⟩ₚ
(j (j U) ∧[ 𝒪 X ] j (k U)) ∧[ 𝒪 X ] k (j U ∧[ 𝒪 X ] k U) =⟨ ii ⟩ₚ
(j (j U) ∧[ 𝒪 X ] j (k U)) ∧[ 𝒪 X ] (k (j U) ∧[ 𝒪 X ] k (k U)) ≤⟨ iii ⟩
j (j U) ∧[ 𝒪 X ] (k (j U) ∧[ 𝒪 X ] k (k U)) ≤⟨ iv ⟩
j (j U) ∧[ 𝒪 X ] k (k U) ≤⟨ v ⟩
j U ∧[ 𝒪 X ] k (k U) ≤⟨ vi ⟩
(j ⋏₀ k) U ■
where
open PosetReasoning (poset-of (𝒪 X))
i = ap (λ - → - ∧[ 𝒪 X ] k (j U ∧[ 𝒪 X ] k U)) (ζj (j U) (k U))
ii = ap (λ - → (j (j U) ∧[ 𝒪 X ] j (k U)) ∧[ 𝒪 X ] -) (ζk (j U) (k U))
iii = ∧[ 𝒪 X ]-left-monotone (∧[ 𝒪 X ]-lower₁ (j (j U)) (j (k U)))
iv = ∧[ 𝒪 X ]-right-monotone (∧[ 𝒪 X ]-lower₂ (k (j U)) (k (k U)))
v = ∧[ 𝒪 X ]-left-monotone (ϑj U)
vi = ∧[ 𝒪 X ]-right-monotone (ϑk U)
⋏₀-is-meet-preserving : (j k : ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩)
→ preserves-binary-meets (𝒪 X) (𝒪 X) j holds
→ preserves-binary-meets (𝒪 X) (𝒪 X) k holds
→ preserves-binary-meets (𝒪 X) (𝒪 X) (j ⋏₀ k) holds
⋏₀-is-meet-preserving j k ζⱼ ζₖ U V =
(j ⋏₀ k) (U ∧[ 𝒪 X ] V) =⟨ refl ⟩
j (U ∧[ 𝒪 X ] V) ∧[ 𝒪 X ] k (U ∧[ 𝒪 X ] V) =⟨ i ⟩
(j U ∧[ 𝒪 X ] j V) ∧[ 𝒪 X ] k (U ∧[ 𝒪 X ] V) =⟨ ii ⟩
(j U ∧[ 𝒪 X ] j V) ∧[ 𝒪 X ] (k U ∧[ 𝒪 X ] k V) =⟨ iii ⟩
j U ∧[ 𝒪 X ] ((j V ∧[ 𝒪 X ] k U) ∧[ 𝒪 X ] k V) =⟨ iv ⟩
j U ∧[ 𝒪 X ] ((k U ∧[ 𝒪 X ] j V) ∧[ 𝒪 X ] k V) =⟨ v ⟩
j U ∧[ 𝒪 X ] (k U ∧[ 𝒪 X ] (j V ∧[ 𝒪 X ] k V)) =⟨ vi ⟩
(j U ∧[ 𝒪 X ] k U) ∧[ 𝒪 X ] (j V ∧[ 𝒪 X ] k V) =⟨ refl ⟩
((j ⋏₀ k) U) ∧[ 𝒪 X ] ((j ⋏₀ k) V) ∎
where
† = ∧[ 𝒪 X ]-is-associative (j U) (j V) (k U ∧[ 𝒪 X ] k V) ⁻¹
‡ = ap (λ - → j U ∧[ 𝒪 X ] -) (∧[ 𝒪 X ]-is-associative (j V) (k U) (k V))
i = ap (λ - → - ∧[ 𝒪 X ] k (U ∧[ 𝒪 X ] V)) (ζⱼ U V)
ii = ap (λ - → (j U ∧[ 𝒪 X ] j V) ∧[ 𝒪 X ] -) (ζₖ U V)
iii = (j U ∧[ 𝒪 X ] j V) ∧[ 𝒪 X ] (k U ∧[ 𝒪 X ] k V) =⟨ † ⟩
j U ∧[ 𝒪 X ] (j V ∧[ 𝒪 X ] (k U ∧[ 𝒪 X ] k V)) =⟨ ‡ ⟩
j U ∧[ 𝒪 X ] ((j V ∧[ 𝒪 X ] k U) ∧[ 𝒪 X ] k V) ∎
iv = ap
(λ - → j U ∧[ 𝒪 X ] (- ∧[ 𝒪 X ] k V))
(∧[ 𝒪 X ]-is-commutative (j V) (k U))
v = ap (λ - → j U ∧[ 𝒪 X ] -) (∧[ 𝒪 X ]-is-associative (k U) (j V) (k V) ⁻¹)
vi = ∧[ 𝒪 X ]-is-associative (j U) (k U) (j V ∧[ 𝒪 X ] k V)
_⋏₁_ : Nucleus (𝒪 X) → Nucleus (𝒪 X) → Nucleus (𝒪 X)
𝒿@(j , jn) ⋏₁ 𝓀@(k , kn) = (j ⋏₀ k) , ⋏-𝓃₁ , ⋏-𝓃₂ , ⋏-𝓃₃
where
⋏-𝓃₁ = ⋏₀-inflationary j k (𝓃₁ (𝒪 X) 𝒿) (𝓃₁ (𝒪 X) 𝓀)
⋏-𝓃₂ = ⋏₀-idempotent j k (𝓃₃ (𝒪 X) 𝒿) (𝓃₃ (𝒪 X) 𝓀) (𝓃₂ (𝒪 X) 𝒿) (𝓃₂ (𝒪 X) 𝓀)
⋏-𝓃₃ = ⋏₀-is-meet-preserving j k (𝓃₃ (𝒪 X) 𝒿) (𝓃₃ (𝒪 X) 𝓀)
⋏₀-perfect : (j k : ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩)
→ let P = poset-of (𝒪 X) in
is-monotonic P P j holds
→ is-monotonic P P k holds
→ is-perfect j holds
→ is-perfect k holds
→ is-perfect (j ⋏₀ k) holds
⋏₀-perfect j k μj μk ζj ζk S δ = β , γ
where
open Joins (λ x y → x ≤[ poset-of (𝒪 X) ] y)
open PosetReasoning (poset-of (𝒪 X))
open JoinNotation (λ S → ⋁[ 𝒪 X ] S)
β : ((j ⋏₀ k) (⋁[ 𝒪 X ] S) is-an-upper-bound-of ⁅ (j ⋏₀ k) s ∣ s ε S ⁆) holds
β l = (j ⋏₀ k) (S [ l ]) =⟨ refl ⟩ₚ
j (S [ l ]) ∧[ 𝒪 X ] k (S [ l ]) ≤⟨ i ⟩
j (⋁[ 𝒪 X ] S) ∧[ 𝒪 X ] k (S [ l ]) ≤⟨ ii ⟩
j (⋁[ 𝒪 X ] S) ∧[ 𝒪 X ] k (⋁[ 𝒪 X ] S) =⟨ refl ⟩ₚ
(j ⋏₀ k) (⋁[ 𝒪 X ] S) ■
where
† = ⋁[ 𝒪 X ]-upper S l
‡ = ⋁[ 𝒪 X ]-upper S l
i = ∧[ 𝒪 X ]-left-monotone (μj (S [ l ] , ⋁[ 𝒪 X ] S) †)
ii = ∧[ 𝒪 X ]-right-monotone (μk (S [ l ] , ⋁[ 𝒪 X ] S) ‡)
γ : (Ɐ (u , _) ꞉ upper-bound ⁅ (j ⋏₀ k) s ∣ s ε S ⁆ ,
(j ⋏₀ k) (⋁[ 𝒪 X ] S) ≤[ poset-of (𝒪 X) ] u) holds
γ 𝓊@(u , _) =
(j ⋏₀ k) (⋁[ 𝒪 X ] S) =⟨ refl ⟩ₚ
j (⋁[ 𝒪 X ] S) ∧[ 𝒪 X ] k (⋁[ 𝒪 X ] S) ≤⟨ i ⟩
(⋁[ 𝒪 X ] ⁅ j s ∣ s ε S ⁆) ∧[ 𝒪 X ] k (⋁[ 𝒪 X ] S) ≤⟨ ii ⟩
(⋁[ 𝒪 X ] ⁅ j s ∣ s ε S ⁆) ∧[ 𝒪 X ] (⋁[ 𝒪 X ] ⁅ k s ∣ s ε S ⁆) =⟨ iii ⟩ₚ
⋁[ 𝒪 X ] ⁅ 𝒮 m n ∣ (m , n) ∶ I × I ⁆ ≤⟨ iv ⟩
⋁⟨ i ∶ I ⟩ j (S [ i ]) ∧[ 𝒪 X ] k (S [ i ]) ≤⟨ v ⟩
u ■
where
I = index S
𝒮 : I → I → ⟨ 𝒪 X ⟩
𝒮 m n = j (S [ m ]) ∧[ 𝒪 X ] k (S [ n ])
† : j (⋁[ 𝒪 X ] S) = ⋁[ 𝒪 X ] ⁅ j s ∣ s ε S ⁆
† = scott-continuous-join-eq (𝒪 X) (𝒪 X) j ζj S δ
‡ : k (⋁[ 𝒪 X ] S) = ⋁[ 𝒪 X ] ⁅ k s ∣ s ε S ⁆
‡ = scott-continuous-join-eq (𝒪 X) (𝒪 X) k ζk S δ
※ : ((⋁⟨ i ∶ I ⟩ j (S [ i ]) ∧[ 𝒪 X ] k (S [ i ]))
is-an-upper-bound-of
⁅ 𝒮 m n ∣ (m , n) ∶ I × I ⁆) holds
※ (m , n) = ∥∥-rec (holds-is-prop P) ε (pr₂ δ m n)
where
P : Ω 𝓥
P = 𝒮 m n
≤[ poset-of (𝒪 X) ]
(⋁⟨ i ∶ I ⟩ j (S [ i ]) ∧[ 𝒪 X ] k (S [ i ]))
ε : Σ i ꞉ I , ((S [ m ]) ≤[ poset-of (𝒪 X) ] (S [ i ])
∧ ((S [ n ]) ≤[ poset-of (𝒪 X) ] (S [ i ]))) holds
→ P holds
ε (i , p , q) =
𝒮 m n =⟨ refl ⟩ₚ
j (S [ m ]) ∧[ 𝒪 X ] k (S [ n ]) ≤⟨ ♢ ⟩
j (S [ i ]) ∧[ 𝒪 X ] k (S [ n ]) ≤⟨ ♥ ⟩
j (S [ i ]) ∧[ 𝒪 X ] k (S [ i ]) ≤⟨ ♠ ⟩
⋁⟨ i ∶ I ⟩ j (S [ i ]) ∧[ 𝒪 X ] k (S [ i ]) ■
where
♢ = ∧[ 𝒪 X ]-left-monotone (μj (S [ m ] , S [ i ]) p)
♥ = ∧[ 𝒪 X ]-right-monotone (μk (S [ n ] , S [ i ]) q)
♠ = ⋁[ 𝒪 X ]-upper ⁅ (j (S [ i ])) ∧[ 𝒪 X ] (k (S [ i ])) ∣ i ∶ I ⁆ i
i = ∧[ 𝒪 X ]-left-monotone (reflexivity+ (poset-of (𝒪 X)) †)
ii = ∧[ 𝒪 X ]-right-monotone (reflexivity+ (poset-of (𝒪 X)) ‡)
iii = distributivity+ (𝒪 X) ⁅ j s ∣ s ε S ⁆ ⁅ k s ∣ s ε S ⁆
iv = ⋁[ 𝒪 X ]-least
⁅ 𝒮 m n ∣ (m , n) ∶ I × I ⁆
((⋁⟨ i ∶ I ⟩ j (S [ i ]) ∧[ 𝒪 X ] k (S [ i ])) , ※)
v = ⋁[ 𝒪 X ]-least ⁅ j (S [ i ]) ∧[ 𝒪 X ] k (S [ i ]) ∣ i ∶ I ⁆ 𝓊
_⋏_ : Perfect-Nucleus → Perfect-Nucleus → Perfect-Nucleus
(𝒿 , νj , ζj) ⋏ (𝓀 , νk , ζk) = pr₁ Σ-assoc (((𝒿 , νj) ⋏₁ (𝓀 , νk)) , γ)
where
μj = nuclei-are-monotone (𝒪 X) (𝒿 , νj)
μk = nuclei-are-monotone (𝒪 X) (𝓀 , νk)
γ : is-perfect (𝒿 ⋏₀ 𝓀) holds
γ = ⋏₀-perfect 𝒿 𝓀 μj μk ζj ζk
idₙ : Perfect-Nucleus
idₙ = id , pr₂ (identity-nucleus (𝒪 X)) , ζ
where
ζ : is-perfect id holds
ζ S δ = ⋁[ 𝒪 X ]-upper S , ⋁[ 𝒪 X ]-least S
\end{code}
\section{Construction of the join}
The construction of the join is the nontrivial component of this development.
Given a family `S ∶= { fᵢ : A → A | i ∶ I}` of endofunctions on some type `A`,
and a list `i₀, …, iₙ` of indices (of type `I`), the function `sequence gives
the composition of all `fᵢₙ ∘ ⋯ ∘ fᵢ₀`:
\begin{code}
sequence : {A : 𝓤 ̇ } → (S : Fam 𝓦 (A → A)) → List (index S) → A → A
sequence S [] = id
sequence S (i ∷ is) = sequence S is ∘ S [ i ]
\end{code}
Using `sequence`, we define the following functio that will help us “directify”
a given family:
\begin{code}
𝔡𝔦𝔯 : {A : 𝓤 ̇ } (S : Fam 𝓦 (A → A)) → Fam 𝓦 (A → A)
𝔡𝔦𝔯 S = List (index S) , sequence S
\end{code}
The first lemma we prove about `𝔡𝔦𝔯` is the fact that, given a family
```
S ∶= { jᵢ : 𝒪 X → 𝒪 X ∣ i ∶ I}
```
of prenuclei, `sequence S is` is a prenuclei for any given list `is : List I` of
indices.
\begin{code}
𝔡𝔦𝔯-prenuclei : (K : Fam 𝓦 (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩))
→ (Ɐ i ꞉ index K , is-prenucleus (𝒪 X) (K [ i ])) holds
→ (Ɐ is ꞉ List (index K) , is-prenucleus (𝒪 X) (𝔡𝔦𝔯 K [ is ])) holds
𝔡𝔦𝔯-prenuclei K ϑ [] = pr₂ (nucleus-pre (𝒪 X) (identity-nucleus (𝒪 X)))
𝔡𝔦𝔯-prenuclei K ϑ (j ∷ js) = n₁ , n₂
where
open PosetReasoning (poset-of (𝒪 X))
IH = 𝔡𝔦𝔯-prenuclei K ϑ js
n₁ : is-inflationary (𝒪 X) (𝔡𝔦𝔯 K [ j ∷ js ]) holds
n₁ x = x ≤⟨ i ⟩
(K [ j ]) x ≤⟨ ii ⟩
(𝔡𝔦𝔯 K [ js ]) ((K [ j ]) x) =⟨ refl ⟩ₚ
(𝔡𝔦𝔯 K [ j ∷ js ]) x ■
where
i = pr₁ (ϑ j) x
ii = pr₁ IH ((K [ j ]) x)
n₂ : preserves-binary-meets (𝒪 X) (𝒪 X) (𝔡𝔦𝔯 K [ j ∷ js ]) holds
n₂ x y = (𝔡𝔦𝔯 K [ j ∷ js ]) (x ∧[ 𝒪 X ] y) =⟨ refl ⟩
(𝔡𝔦𝔯 K [ js ]) ((K [ j ]) (x ∧[ 𝒪 X ] y)) =⟨ i ⟩
(𝔡𝔦𝔯 K [ js ]) ((K [ j ]) x ∧[ 𝒪 X ] (K [ j ]) y) =⟨ ii ⟩
(𝔡𝔦𝔯 K [ j ∷ js ]) x ∧[ 𝒪 X ] (𝔡𝔦𝔯 K [ j ∷ js ]) y ∎
where
i = ap (𝔡𝔦𝔯 K [ js ]) (pr₂ (ϑ j) x y)
ii = pr₂ IH ((K [ j ]) x) ((K [ j ]) y)
\end{code}
\begin{code}
_^** : Fam 𝓦 (Nucleus (𝒪 X)) → Fam 𝓦 (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩)
_^** K = 𝔡𝔦𝔯 ⁅ k ∣ (k , _) ε K ⁆
^**-functorial : (K : Fam 𝓦 (Nucleus (𝒪 X)))
→ (is js : List (index K))
→ K ^** [ is ++ js ] ∼ K ^** [ js ] ∘ K ^** [ is ]
^**-functorial K [] js _ = refl
^**-functorial K (i ∷ is) js x = ^**-functorial K is js ((K [ i ]) .pr₁ x)
_^* : Fam 𝓦 (Nucleus (𝒪 X)) → Fam 𝓦 (Prenucleus (𝒪 X))
_^* K = (List (index K)) , α
where
α : List (index K) → Prenucleus (𝒪 X)
α is = 𝔡𝔦𝔯 ⁅ k ∣ (k , _) ε K ⁆ [ is ]
, 𝔡𝔦𝔯-prenuclei ⁅ k ∣ (k , _) ε K ⁆ † is
where
† : (i : index K) → is-prenucleus (𝒪 X) (pr₁ (K [ i ])) holds
† = pr₂ ∘ nucleus-pre (𝒪 X) ∘ (λ - → K [ - ])
\end{code}
\begin{code}
^*-inhabited : (K : Fam 𝓦 (Nucleus (𝒪 X))) → ∥ index (K ^*) ∥
^*-inhabited K = ∣ [] ∣
^*-upwards-directed : (K : Fam 𝓦 (Nucleus (𝒪 X)))
→ (is : index (K ^*))
→ (js : index (K ^*))
→ Σ ks ꞉ index (K ^*) ,
(((K ^* [ is ]) ≼₁ (K ^* [ ks ]))
∧ ((K ^* [ js ]) ≼₁ (K ^* [ ks ])))
holds
^*-upwards-directed K is js = (is ++ js) , β , γ
where
open PosetReasoning (poset-of (𝒪 X))
open PrenucleusApplicationSyntax (𝒪 X) using (_$ₚ_)
β : (((K ^*) [ is ]) ≼₁ (K ^* [ is ++ js ])) holds
β U = K ^* [ is ] $ₚ U ≤⟨ i ⟩
K ^* [ js ] $ₚ K ^* [ is ] $ₚ U =⟨ ii ⟩ₚ
K ^* [ is ++ js ] $ₚ U ■
where
i = prenucleus-property₂ (𝒪 X) (K ^* [ js ]) (K ^* [ is ]) U
ii = ^**-functorial K is js U ⁻¹
γ : ((K ^* [ js ]) ≼₁ (K ^* [ is ++ js ])) holds
γ U = K ^* [ js ] $ₚ U ≤⟨ i ⟩
K ^* [ js ] $ₚ K ^* [ is ] $ₚ U =⟨ ii ⟩ₚ
K ^* [ is ++ js ] $ₚ U ■
where
i = prenucleus-property₁ (𝒪 X) (K ^* [ js ]) (K ^* [ is ]) U
ii = ^**-functorial K is js U ⁻¹
\end{code}
\begin{code}
^*-scott-continuous : (K : Fam 𝓦 (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩))
→ (Ɐ i ꞉ index K ,
is-scott-continuous (𝒪 X) (𝒪 X) (K [ i ])) holds
→ (Ɐ is ꞉ List (index K) ,
is-scott-continuous (𝒪 X) (𝒪 X) (𝔡𝔦𝔯 K [ is ])) holds
^*-scott-continuous K ϑ [] = id-is-scott-continuous (𝒪 X)
^*-scott-continuous K ϑ (i ∷ is) = ∘-of-scott-cont-is-scott-cont (𝒪 X) (𝒪 X) (𝒪 X)
(𝔡𝔦𝔯 K [ is ])
(K [ i ])
(^*-scott-continuous K ϑ is)
(ϑ i)
\end{code}
\begin{code}
joins-commute : (J : Fam 𝓦 (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩)) (S : Fam 𝓦 ⟨ 𝒪 X ⟩)
→ ⋁ ⁅ ⋁ ⁅ α U ∣ α ε 𝔡𝔦𝔯 J ⁆ ∣ U ε S ⁆
= ⋁ ⁅ ⋁ ⁅ α U ∣ U ε S ⁆ ∣ α ε 𝔡𝔦𝔯 J ⁆
joins-commute J S =
⋁ ⁅ ⋁ ⁅ α U ∣ α ε 𝔡𝔦𝔯 J ⁆ ∣ U ε S ⁆ =⟨ i ⟩
⋁ ⁅ (𝔡𝔦𝔯 J [ j ]) (S [ i ]) ∣ (i , j) ∶ index S × index (𝔡𝔦𝔯 J) ⁆ =⟨ ii ⟩
⋁ ⁅ (𝔡𝔦𝔯 J [ j ]) (S [ i ]) ∣ (j , i) ∶ index (𝔡𝔦𝔯 J) × index S ⁆ =⟨ iii ⟩
⋁ ⁅ ⋁ ⁅ α U ∣ U ε S ⁆ ∣ α ε 𝔡𝔦𝔯 J ⁆ ∎
where
T = ⁅ (𝔡𝔦𝔯 J [ j ]) (S [ i ]) ∣ (i , j) ∶ index S × index (𝔡𝔦𝔯 J) ⁆
U = ⁅ (𝔡𝔦𝔯 J [ j ]) (S [ i ]) ∣ (j , i) ∶ index (𝔡𝔦𝔯 J) × index S ⁆
† = ⋁[ 𝒪 X ]-least T (⋁ U , λ (i , j) → ⋁[ 𝒪 X ]-upper U (j , i))
‡ = ⋁[ 𝒪 X ]-least U (⋁ T , λ (j , i) → ⋁[ 𝒪 X ]-upper T (i , j))
i = (⋁[ 𝒪 X ]-iterated-join (index S) κ λ i j → (𝔡𝔦𝔯 J [ j ]) (S [ i ])) ⁻¹
where
κ : index S → 𝓦 ̇
κ = λ _ → index (𝔡𝔦𝔯 J)
ii = ≤-is-antisymmetric (poset-of (𝒪 X)) † ‡
iii = ⋁[ 𝒪 X ]-iterated-join
(index (𝔡𝔦𝔯 J))
(λ _ → index S)
λ j i → (𝔡𝔦𝔯 J [ j ]) (S [ i ])
\end{code}
The definition of the join:
\begin{code}
join : Fam 𝓦 (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩) → ⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩
join K = λ U → ⋁ ⁅ α U ∣ α ε 𝔡𝔦𝔯 K ⁆
⋁ₙ : Fam 𝓦 Perfect-Nucleus → Perfect-Nucleus
⋁ₙ K = join K₀ , (n₁ , n₂ , n₃) , γ
where
open PosetReasoning (poset-of (𝒪 X))
open Joins (λ x y → x ≤[ poset-of (𝒪 X) ] y)
K₀ : Fam 𝓦 (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩)
K₀ = ⁅ pr₁ j ∣ j ε K ⁆
ϑ : (Ɐ i ꞉ index K₀ , is-scott-continuous (𝒪 X) (𝒪 X) (K₀ [ i ])) holds
ϑ i = pr₂ (pr₂ (K [ i ]))
K₁ : Fam 𝓦 (Nucleus (𝒪 X))
K₁ = ⁅ nucleus-of k ∣ k ε K ⁆
n₁ : is-inflationary (𝒪 X) (join K₀) holds
n₁ U = ⋁[ 𝒪 X ]-upper ⁅ α U ∣ α ε 𝔡𝔦𝔯 K₀ ⁆ []
n₂ : is-idempotent (𝒪 X) (join K₀) holds
n₂ U =
join K₀ (join K₀ U) =⟨ refl ⟩ₚ
⋁ ⁅ α (⋁ ⁅ β U ∣ β ε 𝔡𝔦𝔯 K₀ ⁆) ∣ α ε 𝔡𝔦𝔯 K₀ ⁆ =⟨ i ⟩ₚ
⋁ ⁅ ⋁ ⁅ α (β U) ∣ β ε 𝔡𝔦𝔯 K₀ ⁆ ∣ α ε 𝔡𝔦𝔯 K₀ ⁆ =⟨ ii ⟩ₚ
⋁ ⁅ (𝔡𝔦𝔯 K₀ [ js ]) ((𝔡𝔦𝔯 K₀ [ is ]) U) ∣ (js , is) ∶ (_ × _) ⁆ ≤⟨ iii ⟩
join K₀ U ■
where
S = ⁅ (𝔡𝔦𝔯 K₀ [ j ]) ((𝔡𝔦𝔯 K₀ [ i ]) U) ∣ (j , i) ∶ (_ × _) ⁆
† : ((join K₀ U) is-an-upper-bound-of S) holds
† (js , is) =
transport
(λ - → (- ≤[ poset-of (𝒪 X) ] (join K₀ U)) holds)
(^**-functorial K₁ is js U)
(⋁[ 𝒪 X ]-upper _ (is ++ js))
δ : is-directed (𝒪 X) ⁅ pr₁ α U ∣ α ε K₁ ^* ⁆ holds
δ = (^*-inhabited K₁) , γ
where
γ : _
γ is js = ∣ ks , υ₁ , υ₂ ∣
where
ks = pr₁ (^*-upwards-directed K₁ is js)
υ₁ = pr₁ (pr₂ (^*-upwards-directed K₁ is js)) U
υ₂ = pr₂ (pr₂ (^*-upwards-directed K₁ is js)) U
i = ap
(λ - → ⋁ (index (𝔡𝔦𝔯 K₀) , -))
(dfunext fe λ is →
scott-continuous-join-eq (𝒪 X) (𝒪 X)
(𝔡𝔦𝔯 K₀ [ is ])
(^*-scott-continuous K₀ ϑ is) ⁅ β U ∣ β ε 𝔡𝔦𝔯 K₀ ⁆ δ)
ii = ⋁[ 𝒪 X ]-iterated-join
(index (𝔡𝔦𝔯 K₀))
(λ _ → index (K₁ ^*))
(λ j i → (K₁ ^* [ j ]) .pr₁ ((K₁ ^* [ i ]) .pr₁ U)) ⁻¹
iii = ⋁[ 𝒪 X ]-least S (join K₀ U , †)
μ : (is : List (index K₀)) → preserves-binary-meets (𝒪 X) (𝒪 X) (𝔡𝔦𝔯 K₀ [ is ]) holds
μ is = pr₂ (𝔡𝔦𝔯-prenuclei K₀ (λ i → pr₂ (nucleus-pre (𝒪 X) (K₁ [ i ]))) is)
n₃ : preserves-binary-meets (𝒪 X) (𝒪 X) (join K₀) holds
n₃ U V =
join K₀ (U ∧[ 𝒪 X ] V) =⟨ refl ⟩
⋁ ⁅ α (U ∧[ 𝒪 X ] V) ∣ α ε 𝔡𝔦𝔯 K₀ ⁆ =⟨ i ⟩
⋁ ⁅ (α U) ∧[ 𝒪 X ] (α V) ∣ α ε 𝔡𝔦𝔯 K₀ ⁆ =⟨ ii ⟩
⋁ ⁅ (𝔡𝔦𝔯 K₀ [ is ]) U ∧[ 𝒪 X ] (𝔡𝔦𝔯 K₀ [ js ]) V ∣ (is , js) ∶ _ × _ ⁆ =⟨ iii ⟩
join K₀ U ∧[ 𝒪 X ] join K₀ V ∎
where
S = ⁅ (𝔡𝔦𝔯 K₀ [ is ]) U ∧[ 𝒪 X ] (𝔡𝔦𝔯 K₀ [ js ]) V ∣ (is , js) ∶ _ × _ ⁆
† : ((⋁ ⁅ (α U) ∧[ 𝒪 X ] (α V) ∣ α ε 𝔡𝔦𝔯 K₀ ⁆)
≤[ poset-of (𝒪 X) ]
(⋁ ⁅ (𝔡𝔦𝔯 K₀ [ is ]) U ∧[ 𝒪 X ] (𝔡𝔦𝔯 K₀ [ js ]) V ∣ (is , js) ∶ _ × _ ⁆))
holds
† = ⋁[ 𝒪 X ]-least ⁅ (α U) ∧[ 𝒪 X ] (α V) ∣ α ε 𝔡𝔦𝔯 K₀ ⁆ (_ , ※)
where
※ : _
※ i = ⋁[ 𝒪 X ]-upper S (i , i)
ψ : ((⋁ ⁅ (α U) ∧[ 𝒪 X ] (α V) ∣ α ε 𝔡𝔦𝔯 K₀ ⁆) is-an-upper-bound-of S) holds
ψ (is , js) =
S [ is , js ] =⟨ refl ⟩ₚ
(𝔡𝔦𝔯 K₀ [ is ]) U ∧[ 𝒪 X ] (𝔡𝔦𝔯 K₀ [ js ]) V ≤⟨ ♠ ⟩
(𝔡𝔦𝔯 K₀ [ ks ]) U ∧[ 𝒪 X ] (𝔡𝔦𝔯 K₀ [ js ]) V ≤⟨ ♣ ⟩
(𝔡𝔦𝔯 K₀ [ ks ]) U ∧[ 𝒪 X ] (𝔡𝔦𝔯 K₀ [ ks ]) V ≤⟨ ♦ ⟩
⋁ ⁅ (α U) ∧[ 𝒪 X ] (α V) ∣ α ε 𝔡𝔦𝔯 K₀ ⁆ ■
where
ks = pr₁ (^*-upwards-directed K₁ is js)
♠ = ∧[ 𝒪 X ]-left-monotone (pr₁ (pr₂ (^*-upwards-directed K₁ is js)) U)
♣ = ∧[ 𝒪 X ]-right-monotone (pr₂ (pr₂ (^*-upwards-directed K₁ is js)) V)
♦ = ⋁[ 𝒪 X ]-upper ⁅ (α U) ∧[ 𝒪 X ] (α V) ∣ α ε 𝔡𝔦𝔯 K₀ ⁆ ks
‡ : ((⋁ ⁅ (𝔡𝔦𝔯 K₀ [ is ]) U ∧[ 𝒪 X ] (𝔡𝔦𝔯 K₀ [ js ]) V ∣ (is , js) ∶ _ × _ ⁆)
≤[ poset-of (𝒪 X) ]
(⋁ ⁅ (α U) ∧[ 𝒪 X ] (α V) ∣ α ε 𝔡𝔦𝔯 K₀ ⁆)) holds
‡ = ⋁[ 𝒪 X ]-least
(⁅ (𝔡𝔦𝔯 K₀ [ is ]) U ∧[ 𝒪 X ] (𝔡𝔦𝔯 K₀ [ js ]) V ∣ (is , js) ∶ _ × _ ⁆)
(_ , ψ)
i = ap (λ - → ⋁ (index (𝔡𝔦𝔯 K₀) , -)) (dfunext fe λ is → μ is U V)
ii = ≤-is-antisymmetric (poset-of (𝒪 X)) † ‡
iii = distributivity+ (𝒪 X) ⁅ α U ∣ α ε 𝔡𝔦𝔯 K₀ ⁆ ⁅ β V ∣ β ε 𝔡𝔦𝔯 K₀ ⁆ ⁻¹
γ : is-perfect (join K₀) holds
γ S δ = transport
(λ - → (- is-lub-of T) holds)
(※ ⁻¹)
(⋁[ 𝒪 X ]-upper T , ⋁[ 𝒪 X ]-least T)
where
T = ⁅ join K₀ s ∣ s ε S ⁆
※ : join K₀ (⋁ S) = ⋁ ⁅ join K₀ s ∣ s ε S ⁆
※ = join K₀ (⋁ S) =⟨ refl ⟩
⋁ ⁅ α (⋁ S) ∣ α ε 𝔡𝔦𝔯 K₀ ⁆ =⟨ i ⟩
⋁ ⁅ ⋁ ⁅ α s ∣ s ε S ⁆ ∣ α ε 𝔡𝔦𝔯 K₀ ⁆ =⟨ ii ⟩
⋁ ⁅ join K₀ s ∣ s ε S ⁆ ∎
where
† = dfunext fe λ is →
scott-continuous-join-eq (𝒪 X) (𝒪 X)
(𝔡𝔦𝔯 K₀ [ is ]) (^*-scott-continuous K₀ ϑ is) S δ
i = ap (λ - → ⋁ (index (𝔡𝔦𝔯 K₀) , -)) †
ii = joins-commute K₀ S ⁻¹
\end{code}
## The definition of the patch locale
\begin{code}
𝟏ₚ : Perfect-Nucleus
𝟏ₚ = 𝟏 , (n₁ , n₂ , n₃) , ζ
where
open Joins (λ x y → x ≤[ poset-of (𝒪 X) ] y)
𝟏 = λ _ → 𝟏[ 𝒪 X ]
n₁ : is-inflationary (𝒪 X) 𝟏 holds
n₁ = 𝟏-is-top (𝒪 X)
n₂ : is-idempotent (𝒪 X) 𝟏 holds
n₂ _ = ≤-is-reflexive (poset-of (𝒪 X)) 𝟏[ 𝒪 X ]
n₃ : preserves-binary-meets (𝒪 X) (𝒪 X) 𝟏 holds
n₃ _ _ = ∧[ 𝒪 X ]-is-idempotent 𝟏[ 𝒪 X ]
ζ : is-perfect 𝟏 holds
ζ S δ = † , ‡
where
P = poset-of (𝒪 X)
† : (𝟏 (⋁[ 𝒪 X ] S) is-an-upper-bound-of ⁅ 𝟏[ 𝒪 X ] ∣ _ ε S ⁆) holds
† i = 𝟏-is-top (𝒪 X) 𝟏[ 𝒪 X ]
‡ : (Ɐ (u , _) ꞉ upper-bound ⁅ 𝟏[ 𝒪 X ] ∣ _ ε S ⁆ , 𝟏[ 𝒪 X ] ≤[ P ] u) holds
‡ (u , φ) = ∥∥-rec (holds-is-prop (𝟏[ 𝒪 X ] ≤[ P ] u)) φ (pr₁ δ)
𝟏ₚ-is-top : Meets.is-top (λ 𝒿 𝓀 → 𝒿 ≼ 𝓀) 𝟏ₚ holds
𝟏ₚ-is-top 𝒿 U = 𝟏-is-top (𝒪 X) (𝒿 $ U)
⋏-is-meet : (Ɐ (𝒿 , 𝓀) ꞉ Perfect-Nucleus × Perfect-Nucleus ,
Meets._is-glb-of_ _≼_ (𝒿 ⋏ 𝓀) (𝒿 , 𝓀)) holds
⋏-is-meet (𝒿 , 𝓀) = β , γ
where
β : (Meets._is-a-lower-bound-of_ _≼_ (𝒿 ⋏ 𝓀)) (𝒿 , 𝓀) holds
β = (λ U → ∧[ 𝒪 X ]-lower₁ (𝒿 $ U) (𝓀 $ U))
, (λ U → ∧[ 𝒪 X ]-lower₂ (𝒿 $ U) (𝓀 $ U))
γ : (Ɐ (𝒾 , _) ꞉ (Meets.lower-bound _≼_ (𝒿 , 𝓀)) , 𝒾 ≼ (𝒿 ⋏ 𝓀)) holds
γ (𝒾 , φ , ϑ) U = ∧[ 𝒪 X ]-greatest (𝒿 $ U) (𝓀 $ U) (𝒾 $ U) (φ U) (ϑ U)
⋁ₙ-is-join : (Ɐ K ꞉ Fam 𝓦 Perfect-Nucleus , Joins._is-lub-of_ _≼_ (⋁ₙ K) K) holds
⋁ₙ-is-join K = β , γ
where
K₀ : Fam 𝓦 (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩)
K₀ = ⁅ pr₁ j ∣ j ε K ⁆
K₁ : Fam 𝓦 (Nucleus (𝒪 X))
K₁ = ⁅ nucleus-of 𝒿 ∣ 𝒿 ε K ⁆
β : Joins._is-an-upper-bound-of_ _≼_ (⋁ₙ K) K holds
β i U = ⋁[ 𝒪 X ]-upper ⁅ α U ∣ α ε 𝔡𝔦𝔯 K₀ ⁆ (i ∷ [])
γ : (Ɐ (𝒾 , _) ꞉ Joins.upper-bound _≼_ K , (⋁ₙ K) ≼ 𝒾) holds
γ (𝓀@(k , (n₁ , n₂ , n₃) , _) , φ) U =
⋁[ 𝒪 X ]-least ⁅ α U ∣ α ε 𝔡𝔦𝔯 K₀ ⁆ (𝓀 $ U , λ is → † is U)
where
open Joins (λ x y → x ≤[ poset-of (𝒪 X) ] y)
open PosetReasoning (poset-of (𝒪 X))
† : (is : (index (𝔡𝔦𝔯 K₀))) → ((𝔡𝔦𝔯 K₀ [ is ]) ≼₀ k) holds
† [] U = n₁ U
† (j ∷ js) U = (𝔡𝔦𝔯 K₀ [ js ]) ((K₀ [ j ]) U) ≤⟨ ♠ ⟩
(𝔡𝔦𝔯 K₀ [ js ]) (k U) ≤⟨ † js (k U) ⟩
k (k U) ≤⟨ n₂ U ⟩
k U ■
where
♠ = prenuclei-are-monotone (𝒪 X) (K₁ ^* [ js ]) _ (φ j U)
\end{code}
It's hard to find a good name for the following two lemmas, which are crucial
when proving distributivity.
\begin{code}
lemma-δ : (j : Nucleus (𝒪 X)) (K : Fam 𝓦 (Nucleus (𝒪 X)))
→ (is : index (K ^*))
→ ((⁅ j ⋏₁ k ∣ k ε K ⁆ ^* [ is ]) ≼₁ nucleus-pre (𝒪 X) j) holds
lemma-δ 𝒿@(j , n₁ , n₂ , n₃) K [] U = n₁ U
lemma-δ 𝒿@(j , n₁ , n₂ , n₃) K (i ∷ is) U =
(⁅ 𝒿 ⋏₁ 𝓀 ∣ 𝓀 ε K ⁆ ^** [ i ∷ is ]) U =⟨ refl ⟩ₚ
(⁅ 𝒿 ⋏₁ 𝓀 ∣ 𝓀 ε K ⁆ ^** [ is ]) (j U ∧[ 𝒪 X ] (K [ i ]) .pr₁ U) ≤⟨ ♠ ⟩
j ((j U) ∧[ 𝒪 X ] ((K [ i ]) .pr₁ U)) =⟨ ♥ ⟩ₚ
j (j U) ∧[ 𝒪 X ] j ((K [ i ]) .pr₁ U) ≤⟨ ♣ ⟩
j (j U) ≤⟨ n₂ U ⟩
j U ■
where
open PosetReasoning (poset-of (𝒪 X))
♠ = lemma-δ 𝒿 K is (j U ∧[ 𝒪 X ] ((K [ i ]) .pr₁ U))
♥ = n₃ (j U) ((K [ i ]) .pr₁ U)
♣ = ∧[ 𝒪 X ]-lower₁ (j (j U)) (j ((K [ i ]) .pr₁ U))
lemma-γ : (j : Nucleus (𝒪 X)) (K : Fam 𝓦 (Nucleus (𝒪 X)))
→ (is : index (K ^*))
→ ((⁅ j ⋏₁ k ∣ k ε K ⁆ ^* [ is ]) ≼₁ (K ^* [ is ])) holds
lemma-γ j K [] U = ≤-is-reflexive (poset-of (𝒪 X)) U
lemma-γ 𝒿@(j , _) K (i ∷ is) U =
_ ≤⟨ ih ⟩
(K ^** [ is ]) (j U ⊓ (K₀ [ i ]) U) =⟨ † ⟩ₚ
(K ^** [ is ]) (j U) ⊓ (K ^** [ is ]) ((K₀ [ i ]) U) ≤⟨ ‡ ⟩
(K ^** [ i ∷ is ]) U ■
where
open PosetReasoning (poset-of (𝒪 X))
K₀ = ⁅ pr₁ k ∣ k ε K ⁆
φ : (i : index K₀) → is-prenucleus (𝒪 X) (K₀ [ i ]) holds
φ i = pr₂ (nucleus-pre (𝒪 X) (K [ i ]))
ih = lemma-γ 𝒿 K is (j U ⊓ (K₀ [ i ]) U )
† = pr₂ (𝔡𝔦𝔯-prenuclei K₀ φ is) (j U) ((K₀ [ i ]) U)
‡ = ∧[ 𝒪 X ]-lower₂ ((K ^** [ is ]) (j U)) (((K ^**) [ is ]) ((K₀ [ i ]) U))
\end{code}
\begin{code}
lemma : (𝒿 : Perfect-Nucleus) (𝒦 : Fam 𝓦 Perfect-Nucleus)
→ let 𝒦₀ = ⁅ pr₁ j ∣ j ε 𝒦 ⁆ in
(V : ⟨ 𝒪 X ⟩)
→ cofinal-in (𝒪 X)
⁅ (𝒿 $ V) ∧[ 𝒪 X ] α V ∣ α ε 𝔡𝔦𝔯 𝒦₀ ⁆
⁅ α V ∣ α ε 𝔡𝔦𝔯 ⁅ pr₁ (𝒿 ⋏ 𝓀) ∣ 𝓀 ε 𝒦 ⁆ ⁆
holds
lemma 𝒿 𝒦 U [] = ∣ [] , ∧[ 𝒪 X ]-lower₂ (𝒿 $ U) U ∣
lemma 𝒿@(j , (n₁ , n₂ , n₃) , ζ) 𝒦 U (i ∷ is) = ∥∥-rec ∃-is-prop † ih
where
open PosetReasoning (poset-of (𝒪 X))
ih = lemma 𝒿 𝒦 ((𝒿 $ U) ∧[ 𝒪 X ] ((𝒦 [ i ]) .pr₁ U)) is
𝒦₀ = ⁅ pr₁ j ∣ j ε 𝒦 ⁆
𝒦₁ = ⁅ nucleus-of 𝒿 ∣ 𝒿 ε 𝒦 ⁆
μ : (i : index 𝒦₀) → is-prenucleus (𝒪 X) (𝒦₀ [ i ]) holds
μ i = pr₂ (nucleus-pre (𝒪 X) (𝒦₁ [ i ]))
ξ : (is : index (𝔡𝔦𝔯 𝒦₀)) (U : ⟨ 𝒪 X ⟩) → (U ≤ ((𝔡𝔦𝔯 𝒦₀) [ is ]) U) holds
ξ is U = pr₁ (𝔡𝔦𝔯-prenuclei 𝒦₀ μ is) U
α = (𝔡𝔦𝔯 𝒦₀) [ is ]
† : _
† (js , ϑ) = ∣ (i ∷ js) , ※ ∣
where
Kᵢ = 𝒦₀ [ i ]
p : ((j U ∧[ 𝒪 X ] α (Kᵢ U)) ≤ (j (j U) ∧[ 𝒪 X ] j (Kᵢ U))) holds
p = (𝒿 $ U) ∧[ 𝒪 X ] (α ((𝒦₀ [ i ]) U)) ≤⟨ Ⅰ ⟩
j U ≤⟨ Ⅱ ⟩
(j (j U)) ∧[ 𝒪 X ] (j ((𝒦₀ [ i ]) U)) ■
where
Ⅰ = ∧[ 𝒪 X ]-lower₁ (𝒿 $ U) (α ((𝒦₀ [ i ]) U))
Ⅱ = ∧[ 𝒪 X ]-greatest
(j (j U))
(j ((𝒦₀ [ i ]) U))
(j U)
(n₁ (j U))
(nuclei-are-monotone (𝒪 X) (nucleus-of 𝒿) _ (pr₁ (pr₂ (𝒦₁ [ i ])) U))
q : ((𝒿 $ U ∧[ 𝒪 X ] ((𝔡𝔦𝔯 𝒦₀) [ is ]) ((𝒦₀ [ i ]) U))
≤
(((𝔡𝔦𝔯 𝒦₀) [ is ]) (𝒿 $ U) ⊓ ((𝔡𝔦𝔯 𝒦₀) [ is ]) ((𝒦₀ [ i ]) U)))
holds
q = ∧[ 𝒪 X ]-greatest _ _ _ Ⅰ Ⅱ
where
Ⅰ = j U ⊓ (𝔡𝔦𝔯 𝒦₀ [ is ]) ((𝒦₀ [ i ]) U) ≤⟨ ∧[ 𝒪 X ]-lower₁ _ _ ⟩
j U ≤⟨ ξ is (j U) ⟩
α (j U) ■
Ⅱ = ∧[ 𝒪 X ]-lower₂ (j U) ((𝔡𝔦𝔯 𝒦₀ [ is ]) ((𝒦₀ [ i ]) U))
♥ = ∧[ 𝒪 X ]-greatest _ _ _ p q
♠ = ap
(λ - → (j (j U) ⊓ j (Kᵢ U)) ⊓ -)
((pr₂ (𝔡𝔦𝔯-prenuclei 𝒦₀ μ is) (j U) (Kᵢ U)) ⁻¹)
♣ = ap (λ - → - ∧[ 𝒪 X ] (α (j U ⊓ Kᵢ U))) (n₃ (j U) (Kᵢ U) ⁻¹)
※ = (j U) ∧[ 𝒪 X ] α (Kᵢ U) ≤⟨ ♥ ⟩
((j (j U) ∧[ 𝒪 X ] j (Kᵢ U))) ∧[ 𝒪 X ] (α (j U) ∧[ 𝒪 X ] α (Kᵢ U)) =⟨ ♠ ⟩ₚ
((j (j U) ∧[ 𝒪 X ] j (Kᵢ U))) ∧[ 𝒪 X ] α (j U ∧[ 𝒪 X ] Kᵢ U) =⟨ ♣ ⟩ₚ
(j (j U ∧[ 𝒪 X ] (Kᵢ U))) ∧[ 𝒪 X ] α (j U ∧[ 𝒪 X ] Kᵢ U) ≤⟨ ϑ ⟩
((𝔡𝔦𝔯 ⁅ pr₁ (𝒿 ⋏ 𝓀) ∣ 𝓀 ε 𝒦 ⁆) [ i ∷ js ]) U ■
distributivityₚ : (𝒿 : Perfect-Nucleus) (𝒦 : Fam 𝓦 Perfect-Nucleus)
→ 𝒿 ⋏ (⋁ₙ 𝒦) = ⋁ₙ ⁅ 𝒿 ⋏ 𝓀 ∣ 𝓀 ε 𝒦 ⁆
distributivityₚ 𝒿 𝒦 =
perfect-nuclei-eq (𝒿 ⋏ ⋁ₙ 𝒦) (⋁ₙ ⁅ 𝒿 ⋏ 𝓀 ∣ 𝓀 ε 𝒦 ⁆) (dfunext fe γ)
where
𝒦₀ : Fam 𝓦 (⟨ 𝒪 X ⟩ → ⟨ 𝒪 X ⟩)
𝒦₀ = ⁅ pr₁ j ∣ j ε 𝒦 ⁆
γ : (U : ⟨ 𝒪 X ⟩) → (𝒿 ⋏ (⋁ₙ 𝒦)) $ U = (⋁ₙ ⁅ 𝒿 ⋏ 𝓀 ∣ 𝓀 ε 𝒦 ⁆) $ U
γ U = ((𝒿 ⋏ (⋁ₙ 𝒦)) $ U) =⟨ refl ⟩
(𝒿 $ U) ∧[ 𝒪 X ] ((⋁ₙ 𝒦) $ U) =⟨ refl ⟩
(𝒿 $ U) ∧[ 𝒪 X ] (⋁[ 𝒪 X ] ⁅ α U ∣ α ε 𝔡𝔦𝔯 𝒦₀ ⁆) =⟨ i ⟩
⋁[ 𝒪 X ] ⁅ (𝒿 $ U) ∧[ 𝒪 X ] α U ∣ α ε 𝔡𝔦𝔯 𝒦₀ ⁆ =⟨ ii ⟩
(⋁ₙ ⁅ 𝒿 ⋏ 𝓀 ∣ 𝓀 ε 𝒦 ⁆) $ U ∎
where
δ : cofinal-in (𝒪 X)
⁅ (𝒿 $ U) ∧[ 𝒪 X ] α U ∣ α ε 𝔡𝔦𝔯 𝒦₀ ⁆
⁅ α U ∣ α ε 𝔡𝔦𝔯 ⁅ pr₁ (𝒿 ⋏ 𝓀) ∣ 𝓀 ε 𝒦 ⁆ ⁆
holds
δ = lemma 𝒿 𝒦 U
ε : cofinal-in (𝒪 X)
⁅ α U ∣ α ε 𝔡𝔦𝔯 ⁅ pr₁ (𝒿 ⋏ 𝓀) ∣ 𝓀 ε 𝒦 ⁆ ⁆
⁅ (𝒿 $ U) ∧[ 𝒪 X ] α U ∣ α ε 𝔡𝔦𝔯 𝒦₀ ⁆
holds
ε is = ∣ is , ※ ∣
where
† = lemma-δ (nucleus-of 𝒿) ⁅ nucleus-of 𝓀 ∣ 𝓀 ε 𝒦 ⁆ is U
‡ = lemma-γ (nucleus-of 𝒿) ⁅ nucleus-of 𝓀 ∣ 𝓀 ε 𝒦 ⁆ is U
※ = ∧[ 𝒪 X ]-greatest (𝒿 $ U) ((𝔡𝔦𝔯 𝒦₀ [ is ]) U) _ † ‡
i = distributivity (𝒪 X) (𝒿 $ U) ⁅ α U ∣ α ε 𝔡𝔦𝔯 𝒦₀ ⁆
ii = bicofinal-implies-same-join (𝒪 X)
⁅ (𝒿 $ U) ∧[ 𝒪 X ] α U ∣ α ε 𝔡𝔦𝔯 𝒦₀ ⁆
⁅ α U ∣ α ε 𝔡𝔦𝔯 ⁅ pr₁ (𝒿 ⋏ 𝓀) ∣ 𝓀 ε 𝒦 ⁆ ⁆
δ
ε
\end{code}
\begin{code}
Patch : Locale (𝓤 ⊔ 𝓥 ⊔ 𝓦 ⁺) (𝓤 ⊔ 𝓥) 𝓦
Patch = record { ⟨_⟩ₗ = Perfect-Nucleus
; frame-str-of = (_≼_ , 𝟏ₚ , _⋏_ , ⋁ₙ)
, (≼-is-preorder , ≼-is-antisymmetric)
, 𝟏ₚ-is-top
, ⋏-is-meet
, ⋁ₙ-is-join
, λ { (𝒿 , 𝒦) → distributivityₚ 𝒿 𝒦}
}
\end{code}
\section{Small version of Patch}
\begin{code}
module SmallPatchConstruction (X : Locale 𝓤 𝓥 𝓦) (σᴰ : spectralᴰ X) where
ℬ : Fam 𝓦 ⟨ 𝒪 X ⟩
ℬ = basisₛ X σᴰ
ℬₖ : Fam 𝓦 (Σ C ꞉ ⟨ 𝒪 X ⟩ , is-compact-open X C holds)
ℬₖ = index ℬ , λ i → ℬ [ i ] , pr₁ (pr₂ (pr₂ σᴰ)) i
ℬ-is-basis : basis-forᴰ (𝒪 X) ℬ
ℬ-is-basis = basisₛ-is-basis X σᴰ
cover : (U : ⟨ 𝒪 X ⟩) → Fam 𝓦 ⟨ 𝒪 X ⟩
cover U =
let
𝒥 = covering-index-family (𝒪 X) ℬ ℬ-is-basis U
in
⁅ ℬ [ j ] ∣ j ε 𝒥 ⁆
covers-are-directed′ : (U : ⟨ 𝒪 X ⟩)
→ is-directed (𝒪 X) (cover U) holds
covers-are-directed′ = basisₛ-covers-are-directed X σᴰ
X-is-spectral : is-spectral X holds
X-is-spectral = spectralᴰ-gives-spectrality X σᴰ
open PatchConstruction X X-is-spectral renaming (Perfect-Nucleus
to Perfect-Nucleus-on-X)
_≼ᵏ_ : Perfect-Nucleus-on-X → Perfect-Nucleus-on-X → Ω (𝓥 ⊔ 𝓦)
_≼ᵏ_ (j , ζⱼ) (k , ζₖ) =
Ɐ i ꞉ index ℬ , j (ℬ [ i ]) ≤[ poset-of (𝒪 X) ] k (ℬ [ i ])
_=ᵏ_ : Perfect-Nucleus-on-X → Perfect-Nucleus-on-X → Ω (𝓥 ⊔ 𝓦)
_=ᵏ_ 𝒿@(j , ζⱼ) 𝓀@(k , ζₖ) = (𝒿 ≼ᵏ 𝓀) ∧ (𝓀 ≼ᵏ 𝒿)
open Meets (λ 𝒿 𝓀 → 𝒿 ≼ᵏ 𝓀)
using ()
renaming (is-top to is-topₖ;
_is-glb-of_ to _is-glb-ofₖ_;
_is-a-lower-bound-of_ to _is-a-lower-bound-ofₖ_;
lower-bound to lower-boundₖ)
≼-implies-≼ᵏ : (𝒿 𝓀 : Perfect-Nucleus-on-X) → (𝒿 ≼ 𝓀 ⇒ 𝒿 ≼ᵏ 𝓀) holds
≼-implies-≼ᵏ 𝒿 𝓀 p i = p (ℬ [ i ])
≼ᵏ-implies-≼ : (𝒿 𝓀 : Perfect-Nucleus-on-X) → (𝒿 ≼ᵏ 𝓀 ⇒ 𝒿 ≼ 𝓀) holds
≼ᵏ-implies-≼ 𝒿@(j , νⱼ , ζⱼ) 𝓀@(k , νₖ , ζₖ) p U =
j U =⟨ i ⟩ₚ
j (⋁[ 𝒪 X ] ⁅ ℬ [ i ] ∣ i ε 𝒥 ⁆) =⟨ ii ⟩ₚ
⋁[ 𝒪 X ] ⁅ j (ℬ [ i ]) ∣ i ε 𝒥 ⁆ ≤⟨ iii ⟩
⋁[ 𝒪 X ] ⁅ k (ℬ [ i ]) ∣ i ε 𝒥 ⁆ =⟨ iv ⟩ₚ
k (⋁[ 𝒪 X ] ⁅ ℬ [ i ] ∣ i ε 𝒥 ⁆) =⟨ v ⟩ₚ
k U ■
where
open PosetReasoning (poset-of (𝒪 X))
𝒥 : Fam 𝓦 (index ℬ)
𝒥 = cover-indexₛ X σᴰ U
δ : is-directed (𝒪 X) ⁅ ℬ [ i ] ∣ i ε 𝒥 ⁆ holds
δ = covers-are-directed′ U
i = ap j (covers (𝒪 X) ℬ ℬ-is-basis U)
ii = scott-continuous-join-eq (𝒪 X) (𝒪 X) j ζⱼ ⁅ ℬ [ i ] ∣ i ε 𝒥 ⁆ δ
iii = cofinal-implies-join-covered
(𝒪 X)
⁅ j (ℬ [ i ]) ∣ i ε 𝒥 ⁆
⁅ k (ℬ [ i ]) ∣ i ε 𝒥 ⁆
λ i → ∣ i , p (𝒥 [ i ]) ∣
iv = scott-continuous-join-eq (𝒪 X) (𝒪 X) k ζₖ ⁅ ℬ [ i ] ∣ i ε 𝒥 ⁆ δ ⁻¹
v = ap k (covers (𝒪 X) ℬ ℬ-is-basis U) ⁻¹
≼-iff-≼ᵏ : (𝒿 𝓀 : Perfect-Nucleus-on-X) → (𝒿 ≼ 𝓀 ⇔ 𝒿 ≼ᵏ 𝓀) holds
≼-iff-≼ᵏ 𝒿 𝓀 = ≼-implies-≼ᵏ 𝒿 𝓀 , ≼ᵏ-implies-≼ 𝒿 𝓀
≼ᵏ-is-reflexive : is-reflexive _≼ᵏ_ holds
≼ᵏ-is-reflexive 𝒿 = ≼-implies-≼ᵏ 𝒿 𝒿 (≼-is-reflexive 𝒿)
≼ᵏ-is-transitive : is-transitive _≼ᵏ_ holds
≼ᵏ-is-transitive 𝒿 𝓀 𝓁 p₀ q₀ = ≼-implies-≼ᵏ 𝒿 𝓁 (≼-is-transitive 𝒿 𝓀 𝓁 p q)
where
p : (𝒿 ≼ 𝓀) holds
p = ≼ᵏ-implies-≼ 𝒿 𝓀 p₀
q : (𝓀 ≼ 𝓁) holds
q = ≼ᵏ-implies-≼ 𝓀 𝓁 q₀
≼ᵏ-is-preorder : is-preorder _≼ᵏ_ holds
≼ᵏ-is-preorder = ≼ᵏ-is-reflexive , ≼ᵏ-is-transitive
≼ᵏ-is-antisymmetric : is-antisymmetric _≼ᵏ_
≼ᵏ-is-antisymmetric {x = 𝒿} {y = 𝓀} p₀ q₀ = ≼-is-antisymmetric p q
where
p : (𝒿 ≼ 𝓀) holds
p = ≼ᵏ-implies-≼ 𝒿 𝓀 p₀
q : (𝓀 ≼ 𝒿) holds
q = ≼ᵏ-implies-≼ 𝓀 𝒿 q₀
𝟏ₚ-is-topₖ : is-topₖ 𝟏ₚ holds
𝟏ₚ-is-topₖ 𝒿 = ≼-implies-≼ᵏ 𝒿 𝟏ₚ (𝟏ₚ-is-top 𝒿)
⋏-is-meetₖ : (𝒿 𝓀 : Perfect-Nucleus-on-X)
→ ((𝒿 ⋏ 𝓀) is-glb-ofₖ (𝒿 , 𝓀)) holds
⋏-is-meetₖ 𝒿 𝓀 = β , γ
where
μ = ⋏-is-meet (𝒿 , 𝓀)
β : ((𝒿 ⋏ 𝓀) is-a-lower-bound-ofₖ (𝒿 , 𝓀)) holds
β = ≼-implies-≼ᵏ (𝒿 ⋏ 𝓀) 𝒿 β₁ , ≼-implies-≼ᵏ (𝒿 ⋏ 𝓀) 𝓀 β₂
where
β₁ : ((𝒿 ⋏ 𝓀) ≼ 𝒿) holds
β₁ = pr₁ (pr₁ (⋏-is-meet (𝒿 , 𝓀)))
β₂ : ((𝒿 ⋏ 𝓀) ≼ 𝓀) holds
β₂ = pr₂ (pr₁ (⋏-is-meet (𝒿 , 𝓀)))
γ : (Ɐ (𝒾 , _) ꞉ (Meets.lower-bound _≼ᵏ_ (𝒿 , 𝓀)) , 𝒾 ≼ᵏ (𝒿 ⋏ 𝓀)) holds
γ (𝒾 , φ , ψ) = ≼-implies-≼ᵏ 𝒾 (𝒿 ⋏ 𝓀) δ
where
† = pr₂ (⋏-is-meet (𝒿 , 𝓀))
δ : (𝒾 ≼ (𝒿 ⋏ 𝓀)) holds
δ = † (𝒾 , ≼ᵏ-implies-≼ 𝒾 𝒿 φ , ≼ᵏ-implies-≼ 𝒾 𝓀 ψ)
⋁ₙ-is-joinₖ : (Ɐ K ꞉ Fam 𝓦 Perfect-Nucleus-on-X , Joins._is-lub-of_ _≼ᵏ_ (⋁ₙ K) K) holds
⋁ₙ-is-joinₖ 𝒦 = β , γ
where
β : (_≼ᵏ_ Joins.is-an-upper-bound-of ⋁ₙ 𝒦) 𝒦 holds
β i = ≼-implies-≼ᵏ (𝒦 [ i ] ) (⋁ₙ 𝒦) †
where
† : ((𝒦 [ i ]) ≼ ⋁ₙ 𝒦) holds
† = pr₁ (⋁ₙ-is-join 𝒦) i
γ : (Ɐ (𝒾 , _) ꞉ Joins.upper-bound _≼ᵏ_ 𝒦 , (⋁ₙ 𝒦) ≼ᵏ 𝒾) holds
γ (𝒾 , φ) = ≼-implies-≼ᵏ (⋁ₙ 𝒦) 𝒾 (pr₂ (⋁ₙ-is-join 𝒦) (𝒾 , †))
where
† : (_≼_ Joins.is-an-upper-bound-of 𝒾) 𝒦 holds
† j = ≼ᵏ-implies-≼ (𝒦 [ j ]) 𝒾 (φ j)
SmallPatch : Locale (𝓤 ⊔ 𝓥 ⊔ 𝓦 ⁺) (𝓥 ⊔ 𝓦) 𝓦
SmallPatch = record { ⟨_⟩ₗ = Perfect-Nucleus-on-X
; frame-str-of = (_≼ᵏ_ , 𝟏ₚ , _⋏_ , ⋁ₙ)
, (≼ᵏ-is-preorder , ≼ᵏ-is-antisymmetric)
, 𝟏ₚ-is-topₖ
, (λ { (𝒿 , 𝓀) → ⋏-is-meetₖ 𝒿 𝓀})
, ⋁ₙ-is-joinₖ
, λ { (𝒿 , 𝒦) → distributivityₚ 𝒿 𝒦}
}
𝟎-is-id : 𝟎[ 𝒪 SmallPatch ] $_ ∼ id
𝟎-is-id U = ≤-is-antisymmetric (poset-of (𝒪 X)) † ‡
where
open PosetReasoning (poset-of (𝒪 X))
† : ((𝟎[ 𝒪 SmallPatch ] $ U) ≤[ poset-of (𝒪 X) ] U) holds
† = 𝟎-is-bottom (𝒪 Patch) idₙ U
‡ : (U ≤[ poset-of (𝒪 X) ] (𝟎[ 𝒪 SmallPatch ] $ U)) holds
‡ = U ≤⟨ ※ ⟩
(⋁[ 𝒪 SmallPatch ] ∅ 𝓦) $ U =⟨ refl ⟩ₚ
𝟎[ 𝒪 SmallPatch ] $ U ■
where
※ = ⋁[ 𝒪 X ]-upper ⁅ α U ∣ α ε 𝔡𝔦𝔯 (∅ 𝓦) ⁆ []
\end{code}