Ayberk Tosun, 23 April 2022 (date started)

Based on `ayberkt/formal-topology-in-UF`.

\begin{code}[hide]

{-# OPTIONS --safe --without-K --lossy-unification #-}

open import UF.FunExt
open import UF.PropTrunc
open import UF.Size

\end{code}

\begin{code}[hide]

module Locales.PatchProperties
        (pt : propositional-truncations-exist)
        (fe : Fun-Ext)
        (sr : Set-Replacement pt) where

open import Locales.AdjointFunctorTheoremForFrames pt fe
open import Locales.CharacterisationOfContinuity pt fe
open import Locales.Clopen      pt fe sr
open import Locales.CompactRegular pt fe using (∨-is-scott-continuous)
open import Locales.Compactness.Definition pt fe
open import Locales.Complements pt fe
open import Locales.ContinuousMap.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.HeytingImplication pt fe
open import Locales.Nucleus pt fe
open import Locales.PatchLocale pt fe sr
open import Locales.PerfectMaps pt fe
open import Locales.Regular pt fe sr
open import Locales.SmallBasis pt fe sr
open import Locales.Spectrality.SpectralLocale pt fe
open import Locales.Spectrality.SpectralMap    pt fe
open import Locales.Stone pt fe sr
open import Locales.StoneImpliesSpectral pt fe sr
open import Locales.ZeroDimensionality pt fe sr
open import MLTT.List hiding ([_])
open import MLTT.Spartan hiding (𝟚)
open import Slice.Family
open import UF.EquivalenceExamples
open import UF.Logic
open import UF.Subsingletons
open import UF.SubtypeClassifier

open AllCombinators pt fe
open ContinuousMaps
open FrameHomomorphismProperties
open FrameHomomorphisms hiding (fun-syntax; fun)
open Locale
open PropositionalTruncation pt

\end{code}

\section{Basic properties}

\begin{code}

module BasicProperties (X : Locale 𝓀 π“₯ 𝓦) (Οƒ : is-spectral X holds) where

 open PatchConstruction X Οƒ renaming (Perfect-Nucleus to Perfect-Nucleus-on-X;
                                      Patch to Patch-of-X)

\end{code}

We first prove the following lemma about directed families of nuclei, which
amounts the fact that the directification of an already directed family is
cofinal in the original family.

\begin{code}

 directedness-lemma : (K : Fam 𝓦 Perfect-Nucleus-on-X)
                    β†’ is-directed (π’ͺ Patch-of-X) K holds
                    β†’ let
                       Kβ‚€ = ⁅ pr₁ k ∣ k Ξ΅ K ⁆
                      in
                       (is : index (𝔑𝔦𝔯 Kβ‚€))
                    β†’ βˆƒ i κž‰ index K , (((𝔑𝔦𝔯 Kβ‚€ [ is ]) β‰Όβ‚€ (Kβ‚€ [ i ])) holds )
 directedness-lemma K Ξ΄ []       = βˆ₯βˆ₯-rec βˆƒ-is-prop Ξ³ Ξ²
  where
   open PosetReasoning (poset-of (π’ͺ X))

   Kβ‚€ = ⁅ pr₁ k ∣ k Ξ΅ K ⁆

   Ξ² : βˆ₯ index K βˆ₯
   Ξ² = directedness-entails-inhabitation (π’ͺ Patch-of-X) K Ξ΄

   Ξ³ : index K β†’ _
   Ξ³ i = ∣ i , 𝓃₁ (π’ͺ X) (nucleus-of (K [ i ])) ∣
 directedness-lemma K Ξ΄ (i ∷ is) = βˆ₯βˆ₯-rec βˆƒ-is-prop Ξ³ IH
  where
   open PosetReasoning (poset-of (π’ͺ X))

   Kβ‚€ = ⁅ pr₁ k ∣ k Ξ΅ K ⁆
   K₁ = ⁅ nucleus-of k ∣ k Ξ΅ K ⁆

   Ξ³ : (Ξ£ j κž‰ index K , (((𝔑𝔦𝔯 Kβ‚€ [ is ]) β‰Όβ‚€ (Kβ‚€ [ j ])) holds))
     β†’ _
   Ξ³ (j , Ο†) = βˆ₯βˆ₯-rec βˆƒ-is-prop β€» (prβ‚‚ Ξ΄ i j)
    where
     β€» : _ β†’ _
     β€» (l , Οˆβ‚ , Οˆβ‚‚) = ∣ l , † ∣
      where
       † : ((𝔑𝔦𝔯 Kβ‚€ [ i ∷ is ]) β‰Όβ‚€ (Kβ‚€ [ l ])) holds
       † U = (𝔑𝔦𝔯 Kβ‚€ [ is ]) ((Kβ‚€ [ i ]) U)    β‰€βŸ¨ β™₯ ⟩
             (Kβ‚€ [ j ]) ((Kβ‚€ [ i ]) U)         β‰€βŸ¨ β™  ⟩
             (Kβ‚€ [ j ]) ((Kβ‚€ [ l ]) U)         β‰€βŸ¨ ♣ ⟩
             (Kβ‚€ [ l ]) ((Kβ‚€ [ l ]) U)         =⟨ β™’ βŸ©β‚š
             (Kβ‚€ [ l ]) U                      β– 
              where
               β™₯ = Ο† ((Kβ‚€ [ i ]) U)
               β™  = nuclei-are-monotone (π’ͺ X) (K₁ [ j ]) _ (Οˆβ‚ U)
               ♣ = Οˆβ‚‚ ((Kβ‚€ [ l ]) U)
               β™’ = nuclei-are-idempotent (π’ͺ X) (K₁ [ l ]) U

   IH : βˆƒ j κž‰ index K , (((𝔑𝔦𝔯 Kβ‚€ [ is ]) β‰Όβ‚€ (Kβ‚€ [ j ])) holds)
   IH = directedness-lemma K Ξ΄ is

\end{code}

\begin{code}

 directed-joins-are-computed-pointwise : (K : Fam 𝓦 Perfect-Nucleus-on-X)
                                       β†’ is-directed (π’ͺ Patch-of-X) K holds
                                       β†’ (U : ⟨ π’ͺ X ⟩)
                                       β†’ (⋁[ π’ͺ Patch-of-X ] K) $ U = ⋁[ π’ͺ X ] ⁅ k $ U ∣ k Ξ΅ K ⁆
 directed-joins-are-computed-pointwise K Ξ΄ U =
  ≀-is-antisymmetric (poset-of (π’ͺ X)) Ξ² Ξ³
   where
    open Joins (Ξ» x y β†’ x ≀[ poset-of (π’ͺ X) ] y)
    open PosetReasoning (poset-of (π’ͺ X))

    π“π’½π“ˆ = (⋁[ π’ͺ Patch-of-X ] K) $ U
    π“‡π’½π“ˆ = ⋁[ π’ͺ X ] ⁅ k $ U ∣ k Ξ΅ K ⁆

    Kβ‚€ = ⁅ _$_ k ∣ k Ξ΅ K ⁆

    ‑ : cofinal-in (π’ͺ X) ⁅ Ξ± U ∣ Ξ± Ξ΅ 𝔑𝔦𝔯 Kβ‚€ ⁆ ⁅ k $ U ∣ k Ξ΅ K ⁆ holds
    ‑ is = βˆ₯βˆ₯-rec βˆƒ-is-prop (Ξ» (j , Ο†) β†’ ∣ j , Ο† U ∣) (directedness-lemma K Ξ΄ is)

    Ξ² : (π“π’½π“ˆ ≀[ poset-of (π’ͺ X) ] π“‡π’½π“ˆ) holds
    Ξ² = cofinal-implies-join-covered (π’ͺ X) _ _ ‑

    Ξ³ : (π“‡π’½π“ˆ ≀[ poset-of (π’ͺ X) ] π“π’½π“ˆ) holds
    Ξ³ = ⋁[ π’ͺ X ]-least ⁅ k $ U ∣ k Ξ΅ K ⁆ (π“π’½π“ˆ , †)
     where
      † : (π“π’½π“ˆ is-an-upper-bound-of ⁅ k $ U ∣ k Ξ΅ K ⁆) holds
      † i = ⋁[ π’ͺ Patch-of-X ]-upper K i U

\end{code}

\section{Open and closed nuclei}

\begin{code}

module ClosedNucleus (X : Locale 𝓀 π“₯ 𝓦) (Οƒ : is-spectral X holds) where

 open PatchConstruction X Οƒ renaming (Perfect-Nucleus to Perfect-Nucleus-on-X)

 β€˜_’ : ⟨ π’ͺ X ⟩ β†’ Perfect-Nucleus-on-X
 β€˜ U ’ = binary-join (π’ͺ X) U , ∨-is-nucleus (π’ͺ X) U , ∨-is-scott-continuous (π’ͺ X) U

\end{code}

\begin{code}

module OpenNucleus (X  : Locale 𝓀 π“₯ π“₯)
                   (Οƒα΄° : spectralα΄° X)
                   (sk : 𝒦 X is π“₯ small) where

 private
  Οƒ : is-spectral X holds
  Οƒ = spectralα΄°-gives-spectrality X Οƒα΄°

 open PatchConstruction X Οƒ renaming (Perfect-Nucleus to Perfect-Nucleus-on-X)

 private
  X-has-small-basis : βˆ₯ basisα΄° (π’ͺ X) βˆ₯
  X-has-small-basis = ∣ spectralα΄°-implies-basisα΄° X Οƒα΄° ∣

 open HeytingImplicationConstruction X X-has-small-basis

 opn : ⟨ π’ͺ X ⟩ β†’ ⟨ π’ͺ X ⟩ β†’ ⟨ π’ͺ X ⟩
 opn U = U ==>_

 opn-monotone : (U : ⟨ π’ͺ X ⟩)
              β†’ is-monotonic (poset-of (π’ͺ X)) (poset-of (π’ͺ X)) (opn U) holds
 opn-monotone U (V , W) p = heyting-implication₁ U W (U ==> V) †
  where
   open PosetReasoning (poset-of (π’ͺ X))

   † : (((U ==> V) ∧[ π’ͺ X ] U) ≀[ poset-of (π’ͺ X) ] W) holds
   † = (U ==> V) ∧[ π’ͺ X ] U β‰€βŸ¨ mp-right U V ⟩ V β‰€βŸ¨ p ⟩ W β– 

 opn-is-inflationary : (U : ⟨ π’ͺ X ⟩) β†’ is-inflationary (π’ͺ X) (opn U) holds
 opn-is-inflationary U V = heyting-implication₁ U V V (∧[ π’ͺ X ]-lower₁ V U)

 opn-is-idempotent : (U : ⟨ π’ͺ X ⟩) β†’ is-idempotent (π’ͺ X) (opn U) holds
 opn-is-idempotent U V = heyting-implication₁ U V (U ==> (U ==> V)) Ξ³
  where
   open PosetReasoning (poset-of (π’ͺ X))

   Ξ³ : (((U ==> (U ==> V)) ∧[ π’ͺ X ] U) ≀[ poset-of (π’ͺ X) ] V) holds
   Ξ³ = (U ==> (U ==> V)) ∧[ π’ͺ X ] U                =⟨ i    βŸ©β‚š
       (U ==> (U ==> V)) ∧[ π’ͺ X ] (U ∧[ π’ͺ X ] U)   =⟨ ii   βŸ©β‚š
       ((U ==> (U ==> V)) ∧[ π’ͺ X ] U) ∧[ π’ͺ X ] U   β‰€βŸ¨ iii  ⟩
       (U ==> V) ∧[ π’ͺ X ] U                        β‰€βŸ¨ iv   ⟩
       V                                           β– 
        where
         i   = ap (Ξ» - β†’ (U ==> (U ==> V)) ∧[ π’ͺ X ] -) (∧[ π’ͺ X ]-is-idempotent U)
         ii  = ∧[ π’ͺ X ]-is-associative (U ==> (U ==> V)) U U
         iii = ∧[ π’ͺ X ]-left-monotone
                (modus-ponens X (==>-is-heyting-implication U (U ==> V)))
         iv  = modus-ponens X (==>-is-heyting-implication U V)

 opn-preserves-meets : (U : ⟨ π’ͺ X ⟩)
                     β†’ preserves-binary-meets (π’ͺ X) (π’ͺ X) (opn U) holds
 opn-preserves-meets U V W = ≀-is-antisymmetric (poset-of (π’ͺ X)) Ξ² Ξ³
  where
   open PosetReasoning (poset-of (π’ͺ X))

   Ξ² : ((U ==> (V ∧[ π’ͺ X ] W))
          ≀[ poset-of (π’ͺ X) ]
        (U ==> V ∧[ π’ͺ X ] (U ==> W)))
       holds
   Ξ² = ∧[ π’ͺ X ]-greatest (U ==> V) (U ==> W) (U ==> meet-of (π’ͺ X) V W) β₁ Ξ²β‚‚
        where
         δ₁ : ((U ==> (V ∧[ π’ͺ X ] W) ∧[ π’ͺ X ] U) ≀ V) holds
         δ₁ = (U ==> (V ∧[ π’ͺ X ] W)) ∧[ π’ͺ X ] U  β‰€βŸ¨ mp-right U (V ∧[ π’ͺ X ] W) ⟩
              V ∧[ π’ͺ X ] W                       β‰€βŸ¨ ∧[ π’ͺ X ]-lower₁ V W       ⟩
              V                                  β– 

         β₁ : ((U ==> (V ∧[ π’ͺ X ] W)) ≀[ poset-of (π’ͺ X) ] (U ==> V)) holds
         β₁ = heyting-implication₁ U V (U ==> (V ∧[ π’ͺ X ] W)) δ₁

         Ξ΄β‚‚ : ((U ==> (V ∧[ π’ͺ X ] W) ∧[ π’ͺ X ] U) ≀ W) holds
         Ξ΄β‚‚ = (U ==> (V ∧[ π’ͺ X ] W)) ∧[ π’ͺ X ] U  β‰€βŸ¨ mp-right U (V ∧[ π’ͺ X ] W) ⟩
              V ∧[ π’ͺ X ] W                       β‰€βŸ¨ ∧[ π’ͺ X ]-lowerβ‚‚ V W       ⟩
              W                                  β– 

         Ξ²β‚‚ : ((U ==> (V ∧[ π’ͺ X ] W)) ≀[ poset-of (π’ͺ X) ] (U ==> W)) holds
         Ξ²β‚‚ = heyting-implication₁ U W (U ==> (V ∧[ π’ͺ X ] W)) Ξ΄β‚‚

   Ξ³ : (((U ==> V) ∧[ π’ͺ X ] (U ==> W))
          ≀[ poset-of (π’ͺ X) ]
        (U ==> (V ∧[ π’ͺ X ] W)))
        holds
   Ξ³ = heyting-implication₁ U (V ∧[ π’ͺ X ] W) ((U ==> V) ∧[ π’ͺ X ] (U ==> W)) Ξ΄
        where
         i   = ap
               (Ξ» - β†’ ((U ==> V) ∧[ π’ͺ X ] (U ==> W)) ∧[ π’ͺ X ] -)
               (∧[ π’ͺ X ]-is-idempotent U)
         ii  = ∧[ π’ͺ X ]-is-associative (U ==> V) (U ==> W) (U ∧[ π’ͺ X ] U) ⁻¹
         iii = ap
               (Ξ» - β†’ (U ==> V) ∧[ π’ͺ X ] -)
               (∧[ π’ͺ X ]-is-associative (U ==> W) U U)
         iv  = ∧[ π’ͺ X ]-right-monotone (∧[ π’ͺ X ]-left-monotone (mp-right U W))
         v   = ap (Ξ» - β†’ meet-of (π’ͺ X) (U ==> V) -) (∧[ π’ͺ X ]-is-commutative W U)
         vi  = ∧[ π’ͺ X ]-is-associative (U ==> V) U W
         vii = ∧[ π’ͺ X ]-left-monotone (mp-right U V)

         Ξ΄ : ((((U ==> V) ∧[ π’ͺ X ] (U ==> W)) ∧[ π’ͺ X ] U)
               ≀[ poset-of (π’ͺ X) ]
              (V ∧[ π’ͺ X ] W)) holds
         Ξ΄ = ((U ==> V) ∧[ π’ͺ X ] (U ==> W)) ∧[ π’ͺ X ] U               =⟨ i   βŸ©β‚š
             ((U ==> V) ∧[ π’ͺ X ] (U ==> W)) ∧[ π’ͺ X ] (U ∧[ π’ͺ X ] U)  =⟨ ii  βŸ©β‚š
             (U ==> V) ∧[ π’ͺ X ] ((U ==> W) ∧[ π’ͺ X ] (U ∧[ π’ͺ X ] U))  =⟨ iii βŸ©β‚š
             (U ==> V) ∧[ π’ͺ X ] (((U ==> W) ∧[ π’ͺ X ] U) ∧[ π’ͺ X ] U)  β‰€βŸ¨ iv  ⟩
             (U ==> V) ∧[ π’ͺ X ] (W ∧[ π’ͺ X ] U)                       =⟨ v   βŸ©β‚š
             (U ==> V) ∧[ π’ͺ X ] (U ∧[ π’ͺ X ] W)                       =⟨ vi  βŸ©β‚š
             ((U ==> V) ∧[ π’ͺ X ] U) ∧[ π’ͺ X ] W                       β‰€βŸ¨ vii ⟩
             V ∧[ π’ͺ X ] W β– 

 opn-perfect : ((K , _) : 𝒦 X) β†’ is-perfect (opn K) holds
 opn-perfect (K , ΞΊ) = characterisation-of-continuity X X Οƒ (opn K) (opn-monotone K) Ξ³
   where
    open PosetReasoning (poset-of (π’ͺ X))

    Ξ³ : continuity-condition X X (opn K) holds
    Ξ³ Kβ‚‚ U ΞΊβ‚‚ p = ∣ (K ∧[ π’ͺ X ] Kβ‚‚) , ΞΊβ€² , β™  , β™₯ ∣
     where
      ΞΊβ€² : is-compact-open X (K ∧[ π’ͺ X ] Kβ‚‚) holds
      ΞΊβ€² = binary-coherence X Οƒ K Kβ‚‚ ΞΊ ΞΊβ‚‚

      β™  : ((K ∧[ π’ͺ X ] Kβ‚‚) ≀[ poset-of (π’ͺ X) ] U) holds
      β™  = K ∧[ π’ͺ X ] Kβ‚‚          β‰€βŸ¨ i  ⟩
          K ∧[ π’ͺ X ] (K ==> U)   β‰€βŸ¨ ii ⟩
          U                      β– 
           where
            i  = ∧[ π’ͺ X ]-right-monotone p
            ii = mp-left K U

      ♣ : ((Kβ‚‚ ∧[ π’ͺ X ] K) ≀[ poset-of (π’ͺ X) ] (K ∧[ π’ͺ X ] Kβ‚‚)) holds
      ♣ = reflexivity+ (poset-of (π’ͺ X)) (∧[ π’ͺ X ]-is-commutative Kβ‚‚ K)

      β™₯ : (Kβ‚‚ ≀[ poset-of (π’ͺ X) ] opn K (K ∧[ π’ͺ X ] Kβ‚‚)) holds
      β™₯ = heyting-implication₁ K (K ∧[ π’ͺ X ] Kβ‚‚) Kβ‚‚ ♣

 opn-is-nucleus : (U : ⟨ π’ͺ X ⟩) β†’ is-nucleus (π’ͺ X) (opn U) holds
 opn-is-nucleus U = opn-is-inflationary U
                  , opn-is-idempotent U
                  , opn-preserves-meets U

 Β¬β€˜_’ : 𝒦 X β†’ Perfect-Nucleus-on-X
 Β¬β€˜ (K , ΞΊ) ’ = K ==>_ , (opn-is-nucleus K , opn-perfect (K , ΞΊ))

\end{code}

\begin{code}

 opn-reverses-binary-joins : (U V : ⟨ π’ͺ X ⟩) β†’ opn (U ∨[ π’ͺ X ] V) = opn U ⋏₀ opn V
 opn-reverses-binary-joins U V = dfunext fe Ξ³
  where
   open PosetReasoning (poset-of (π’ͺ X))

   Ξ³ : opn (U ∨[ π’ͺ X ] V) ∼ (opn U ⋏₀ opn V)
   Ξ³ W = ≀-is-antisymmetric (poset-of (π’ͺ X)) Ξ΄ Ξ΅
    where
     Ξ΄ : (((U ∨[ π’ͺ X ] V) ==> W) ≀ (U ==> W ∧[ π’ͺ X ] V ==> W)) holds
     Ξ΄ = ∧[ π’ͺ X ]-greatest (U ==> W) (V ==> W) _ δ₁ Ξ΄β‚‚
      where
       † : (((opn (U ∨[ π’ͺ X ] V) W) ∧[ π’ͺ X ] U) ≀[ poset-of (π’ͺ X) ] W) holds
       † = ((U ∨[ π’ͺ X ] V) ==> W) ∧[ π’ͺ X ] U               β‰€βŸ¨ i ⟩
           ((U ∨[ π’ͺ X ] V) ==> W) ∧[ π’ͺ X ] (U ∨[ π’ͺ X ] V)  β‰€βŸ¨ ii ⟩
           W                                               β– 
            where
             i   = ∧[ π’ͺ X ]-right-monotone (∨[ π’ͺ X ]-upper₁ U V)
             ii  = modus-ponens X (==>-is-heyting-implication (U ∨[ π’ͺ X ] V) W)

       ‑ : ((opn (U ∨[ π’ͺ X ] V) W ∧[ π’ͺ X ] V) ≀[ poset-of (π’ͺ X) ] W) holds
       ‑ = opn (U ∨[ π’ͺ X ] V) W ∧[ π’ͺ X ] V               β‰€βŸ¨ i  ⟩
           opn (U ∨[ π’ͺ X ] V) W ∧[ π’ͺ X ] (U ∨[ π’ͺ X ] V)  β‰€βŸ¨ ii ⟩
           W β– 
            where
             i  = ∧[ π’ͺ X ]-right-monotone (∨[ π’ͺ X ]-upperβ‚‚ U V)
             ii = modus-ponens X (==>-is-heyting-implication (U ∨[ π’ͺ X ] V) W)

       δ₁ : (opn (U ∨[ π’ͺ X ] V) W ≀[ poset-of (π’ͺ X) ] (U ==> W)) holds
       δ₁ = heyting-implication₁ U W _ †

       Ξ΄β‚‚ :  (opn (U ∨[ π’ͺ X ] V) W ≀[ poset-of (π’ͺ X) ] (V ==> W)) holds
       Ξ΄β‚‚ = heyting-implication₁ V W _ ‑

     Ρ₁ : ((U ==> W ∧[ π’ͺ X ] V ==> W ∧[ π’ͺ X ] (U ∨[ π’ͺ X ] V)) ≀ W) holds
     Ρ₁ =
      T ∧[ π’ͺ X ] (U ∨[ π’ͺ X ] V)                                              =⟨ i   βŸ©β‚š
      (T ∧[ π’ͺ X ] U) ∨[ π’ͺ X ] (T ∧[ π’ͺ X ] V)                                 β‰€βŸ¨ ii  ⟩
      (U ==> W ∧[ π’ͺ X ] U) ∨[ π’ͺ X ] ((U ==> W ∧[ π’ͺ X ] V ==> W) ∧[ π’ͺ X ] V)  β‰€βŸ¨ iii ⟩
      W ∨[ π’ͺ X ] ((U ==> W ∧[ π’ͺ X ] V ==> W) ∧[ π’ͺ X ] V)                     β‰€βŸ¨ iv  ⟩
      W ∨[ π’ͺ X ] (V ==> W ∧[ π’ͺ X ] V)                                        β‰€βŸ¨ v   ⟩
      W ∨[ π’ͺ X ] W                                                           β‰€βŸ¨ vi  ⟩
      W                                                                      β– 
       where
        T   = (U ==> W) ∧[ π’ͺ X ] (V ==> W)
        i   = binary-distributivity (π’ͺ X) _ U V
        ii  = ∨[ π’ͺ X ]-left-monotone
               (∧[ π’ͺ X ]-left-monotone
               (∧[ π’ͺ X ]-lower₁ (opn U W) (opn V W)))
        iii = ∨[ π’ͺ X ]-left-monotone
               (modus-ponens
               X
               (==>-is-heyting-implication U W))
        iv  = ∨[ π’ͺ X ]-right-monotone
               (∧[ π’ͺ X ]-left-monotone
               (∧[ π’ͺ X ]-lowerβ‚‚ (U ==> W) (V ==> W)))
        v   = ∨[ π’ͺ X ]-right-monotone
               (modus-ponens X (==>-is-heyting-implication V W))
        vi  = ∨[ π’ͺ X ]-least
               (≀-is-reflexive (poset-of (π’ͺ X)) W)
               (≀-is-reflexive (poset-of (π’ͺ X)) W)

     Ξ΅ : ((opn U W ∧[ π’ͺ X ] opn V W)
            ≀[ poset-of (π’ͺ X) ]
          opn (U ∨[ π’ͺ X ] V) W) holds
     Ξ΅ = heyting-implication₁ (U ∨[ π’ͺ X ] V) W (opn U W ∧[ π’ͺ X ] opn V W) Ρ₁

 nuclei-preserve-==> : (U V : ⟨ π’ͺ X ⟩) ((j , _) : Nucleus (π’ͺ X))
                                      β†’ ((U ==> V) ≀[ poset-of (π’ͺ X) ] (j U ==> j V)) holds
 nuclei-preserve-==> U V 𝒿@(j , _) = U ==> V        β‰€βŸ¨ † ⟩
                                     U ==> j V      β‰€βŸ¨ ‑ ⟩
                                     j U ==> j V    β– 
  where
   open PosetReasoning (poset-of (π’ͺ X))

   β™  : (((U ==> V) ∧[ π’ͺ X ] U) ≀[ poset-of (π’ͺ X) ] j V) holds
   β™  = (U ==> V) ∧[ π’ͺ X ] U β‰€βŸ¨ mp-right U V ⟩ V β‰€βŸ¨ 𝓃₁ (π’ͺ X) 𝒿 V ⟩ j V β– 

   ♣ : (((U ==> j V) ∧[ π’ͺ X ] (j U)) ≀[ poset-of (π’ͺ X) ] j V) holds
   ♣ = (U ==> j V) ∧[ π’ͺ X ] j U     β‰€βŸ¨ i  ⟩
       j (U ==> j V) ∧[ π’ͺ X ] j U   =⟨ ii βŸ©β‚š
       j ((U ==> j V) ∧[ π’ͺ X ] U)   β‰€βŸ¨ iii ⟩
       j (j V)                      =⟨ iv βŸ©β‚š
       j V                          β– 
        where
         i   = ∧[ π’ͺ X ]-left-monotone (𝓃₁ (π’ͺ X) 𝒿 (U ==> j V))
         ii  = 𝓃₃ (π’ͺ X) 𝒿 (U ==> j V) U ⁻¹
         iii = nuclei-are-monotone (π’ͺ X) 𝒿 _ (mp-right U (j V))
         iv  = nuclei-are-idempotent (π’ͺ X) 𝒿 V

   † = heyting-implication₁ U (j V) (U ==> V) β™ 
   ‑ = heyting-implication₁ (j U) (j V) (U ==> j V) ♣

\end{code}

\begin{code}

module Epsilon (X : Locale (𝓀 ⁺) 𝓀 𝓀) (Οƒα΄° : spectralα΄° X) where

 private
  Οƒ : is-spectral X holds
  Οƒ = spectralα΄°-gives-spectrality X Οƒα΄°

  ℬ↑ : Fam 𝓀 ⟨ π’ͺ X ⟩
  ℬ↑ = basisβ‚› X Οƒα΄°

  d : directed-basisα΄° (π’ͺ X)
  d = ℬ↑ , basisβ‚›-is-directed-basis X Οƒα΄°

  Ξ² : has-basis (π’ͺ X) holds
  Ξ² = ∣ spectralα΄°-implies-basisα΄° X Οƒα΄° ∣

  ΞΊ : consists-of-compact-opens X ℬ↑ holds
  ΞΊ = basisβ‚›-consists-of-compact-opens X Οƒα΄°

 sk : 𝒦 X is 𝓀 small
 sk = 𝒦-is-small X d ΞΊ (local-smallness X)

 open PatchConstruction X Οƒ renaming (Perfect-Nucleus to Perfect-Nucleus-on-X)
 open SmallPatchConstruction X Οƒα΄° renaming (SmallPatch to Patchβ‚›-X)
 open ClosedNucleus X Οƒ
 open OpenNucleus X Οƒα΄° sk
 open HeytingImplicationConstruction X Ξ²

 πŸŽβ‚– : 𝒦 X
 πŸŽβ‚– = 𝟎[ π’ͺ X ] , 𝟎-is-compact X

 Β¬β€˜β€™-reflects-𝟎 : Β¬β€˜ πŸŽβ‚– ’ = 𝟏[ π’ͺ Patchβ‚›-X ]
 Β¬β€˜β€™-reflects-𝟎 = only-𝟏-is-above-𝟏 (π’ͺ Patchβ‚›-X) Β¬β€˜ πŸŽβ‚– ’ †
  where
   open PosetReasoning (poset-of (π’ͺ X))

   † :  (𝟏[ π’ͺ Patchβ‚›-X ] ≀[ poset-of (π’ͺ Patchβ‚›-X) ] Β¬β€˜ πŸŽβ‚– ’) holds
   † i = ex-falso-quodlibet (ℬ [ i ])

 Ο΅-preserves-𝟏 : β€˜ 𝟏[ π’ͺ X ] ’ = 𝟏[ π’ͺ Patchβ‚›-X ]
 Ο΅-preserves-𝟏 = perfect-nuclei-eq β€˜ 𝟏[ π’ͺ X ] ’ 𝟏[ π’ͺ Patchβ‚›-X ] (dfunext fe †)
  where
   † : (U : ⟨ π’ͺ X ⟩) β†’ 𝟏[ π’ͺ X ] ∨[ π’ͺ X ] U = 𝟏[ π’ͺ X ]
   † U = 𝟏-left-annihilator-for-∨ (π’ͺ X) U

 Ο΅-preserves-⋁ : let
                  open Joins (Ξ» x y β†’ x ≀[ poset-of (π’ͺ Patchβ‚›-X) ] y)
                 in
                  (β±― S κž‰ Fam 𝓀 ⟨ π’ͺ X ⟩ , β€˜ ⋁[ π’ͺ X ] S ’ is-lub-of ⁅ β€˜ U ’ ∣ U Ξ΅ S ⁆) holds
 Ο΅-preserves-⋁ S = † , ‑
  where
   open Joins (Ξ» x y β†’ x ≀[ poset-of (π’ͺ Patchβ‚›-X) ] y)
   open PosetReasoning (poset-of (π’ͺ X))

   † : (β€˜ ⋁[ π’ͺ X ] S ’ is-an-upper-bound-of ⁅ β€˜ U ’ ∣ U Ξ΅ S ⁆) holds
   † i j = ∨[ π’ͺ X ]-least β™₯ β™ 
      where
       β™₯ : ((S [ i ]) ≀[ poset-of (π’ͺ X) ] β€˜ ⋁[ π’ͺ X ] S ’ .pr₁ (ℬ [ j ])) holds
       β™₯ = S [ i ]                         β‰€βŸ¨ ⋁[ π’ͺ X ]-upper S i ⟩
           ⋁[ π’ͺ X ] S                      β‰€βŸ¨ ∨[ π’ͺ X ]-upper₁ (⋁[ π’ͺ X ] S) (ℬ [ j ]) ⟩
           (⋁[ π’ͺ X ] S) ∨[ π’ͺ X ] (ℬ [ j ]) β– 

       β™  : ((ℬ [ j ]) ≀[ poset-of (π’ͺ X) ] ((⋁[ π’ͺ X ] S) ∨[ π’ͺ X ] (ℬ [ j ]))) holds
       β™  = ∨[ π’ͺ X ]-upperβ‚‚ (⋁[ π’ͺ X ] S) (ℬ [ j ])

   ‑ : (β±― (𝒿 , _) κž‰ upper-bound ⁅ β€˜ U ’ ∣ U Ξ΅ S ⁆ ,
         β€˜ ⋁[ π’ͺ X ] S ’ ≀[ poset-of (π’ͺ Patchβ‚›-X) ] 𝒿) holds
   ‑ (𝒿@(j , _) , ψ) i =
    ∨[ π’ͺ X ]-least Ξ΄ (𝓃₁ (π’ͺ X) (nucleus-of 𝒿) (ℬ [ i ]))
     where
      Ξ΄ : ((⋁[ π’ͺ X ] S) ≀[ poset-of (π’ͺ X) ] j (ℬ [ i ])) holds
      Ξ΄ = ⋁[ π’ͺ X ]-least S (j (ℬ [ i ]) , Ξ΅)
       where
        open Joins (Ξ» x y β†’ x ≀[ poset-of (π’ͺ X) ] y)
         renaming (_is-an-upper-bound-of_ to _is-an-upper-bound-ofβ‚€_)

        Ξ΅ : (j (ℬ [ i ]) is-an-upper-bound-ofβ‚€ S) holds
        Ξ΅ l =
         S [ l ]                      β‰€βŸ¨ ∨[ π’ͺ X ]-upper₁ (S [ l ]) (ℬ [ i ]) ⟩
         (S [ l ]) ∨[ π’ͺ X ] (ℬ [ i ]) β‰€βŸ¨ ψ l i                               ⟩
         j (ℬ [ i ])                  β– 

 Ο΅ : Patchβ‚›-X ─cβ†’ X
 Ο΅ = β€˜_’ , Ο΅-preserves-𝟏 , Ξ²β€² , Ο΅-preserves-⋁
  where
   Ξ²β€² : preserves-binary-meets (π’ͺ X) (π’ͺ Patchβ‚›-X) β€˜_’ holds
   Ξ²β€² U V = perfect-nuclei-eq
            β€˜ U ∧[ π’ͺ X ] V ’
            (β€˜ U ’ ∧[ π’ͺ Patchβ‚›-X ] β€˜ V ’)
            (dfunext fe †)
    where
     † : (W : ⟨ π’ͺ X ⟩) β†’ β€˜ U ∧[ π’ͺ X ] V ’ $ W = (β€˜ U ’ ∧[ π’ͺ Patchβ‚›-X ] β€˜ V ’) $ W
     † W = (U ∧[ π’ͺ X ] V) ∨[ π’ͺ X ] W                =⟨ i   ⟩
           W ∨[ π’ͺ X ] (U ∧[ π’ͺ X ] V)                =⟨ ii  ⟩
           (W ∨[ π’ͺ X ] U) ∧[ π’ͺ X ] (W ∨[ π’ͺ X ] V)   =⟨ iii ⟩
           (U ∨[ π’ͺ X ] W) ∧[ π’ͺ X ] (W ∨[ π’ͺ X ] V)   =⟨ iv  ⟩
           (U ∨[ π’ͺ X ] W) ∧[ π’ͺ X ] (V ∨[ π’ͺ X ] W)   ∎
            where
             i   = ∨[ π’ͺ X ]-is-commutative (U ∧[ π’ͺ X ] V) W
             ii  = binary-distributivity-op (π’ͺ X) W U V
             iii = ap
                    (Ξ» - β†’ - ∧[ π’ͺ X ] (W ∨[ π’ͺ X ] V))
                    (∨[ π’ͺ X ]-is-commutative W U)
             iv  = ap
                    (Ξ» - β†’  (U ∨[ π’ͺ X ] W) ∧[ π’ͺ X ] -)
                    (∨[ π’ͺ X ]-is-commutative W V)

   open Joins (Ξ» x y β†’ x ≀[ poset-of (π’ͺ Patchβ‚›-X) ] y)

 𝒷 : has-basis (π’ͺ X) holds
 𝒷 = ∣ spectralα΄°-implies-basisα΄° X Οƒα΄° ∣

 open PerfectMaps Patchβ‚›-X X
 open AdjointFunctorTheorem Patchβ‚›-X X 𝒷
 open BasicProperties X Οƒ
 open PatchConstruction X Οƒ using () renaming (Patch to Patch-of-X)

\end{code}

The right adjoint `ϡ⁎` of `ϡ` is the function applying a given perfect nucleus
to the bottom element `𝟎` of the locale in consideration.

\begin{code}

 ϡ⁎-is-application-to-𝟎 : (𝒿 : Perfect-Nucleus-on-X)
                        β†’ Ο΅ ⁎· 𝒿 = 𝒿 $ 𝟎[ π’ͺ X ]
 ϡ⁎-is-application-to-𝟎 𝒿@(j , _) =
  ≀-is-antisymmetric (poset-of (π’ͺ X)) Ξ²β€² Ξ³
   where

\end{code}

We break this up into two directions by using antisymmetry: `Ξ²` and `Ξ³`.
The nontrivial direction is the `Ξ²` direction, so let's get the trivial
`Ξ³` direction out of the way first:

\begin{code}

    Ξ³ : (j 𝟎[ π’ͺ X ] ≀[ poset-of (π’ͺ X) ] (Ο΅ ⁎· 𝒿)) holds
    Ξ³ = adjunction-inequality-forward Ο΅ 𝒿 (j 𝟎[ π’ͺ X ]) †
     where
      † : (β€˜ j 𝟎[ π’ͺ X ] ’ ≀[ poset-of (π’ͺ Patchβ‚›-X) ] 𝒿) holds
      † i = ∨[ π’ͺ X ]-least ‑₁ ‑₂
       where
        ‑₁ : (j 𝟎[ π’ͺ X ] ≀[ poset-of (π’ͺ X) ] j (ℬ [ i ])) holds
        ‑₁ = nuclei-are-monotone (π’ͺ X) (nucleus-of 𝒿) _ (𝟎-is-bottom (π’ͺ X) (ℬ [ i ]))

        ‑₂ : ((ℬ [ i ]) ≀[ poset-of (π’ͺ X) ] j (ℬ [ i ])) holds
        ‑₂ = 𝓃₁ (π’ͺ X) (nucleus-of 𝒿) (ℬ [ i ])

\end{code}

We use Yoneda for the `Ξ²` direction.

\begin{code}

    Ξ²β€² : ((Ο΅ ⁎· 𝒿) ≀[ poset-of (π’ͺ X) ] j 𝟎[ π’ͺ X ]) holds
    Ξ²β€² = yoneda (π’ͺ X) (Ο΅ ⁎· 𝒿) (j 𝟎[ π’ͺ X ]) †
     where
      open PosetReasoning (poset-of (π’ͺ X))

      † : (z : ⟨ π’ͺ X ⟩)
        β†’ (rel-syntax (poset-of (π’ͺ X)) z (Ο΅ ⁎· (j , _))
        β‡’ rel-syntax (poset-of (π’ͺ X)) z (j 𝟎[ π’ͺ X ])) holds
      † U Ο† = U                   β‰€βŸ¨ ∨[ π’ͺ X ]-upper₁ U 𝟎[ π’ͺ X ] ⟩
              U ∨[ π’ͺ X ] 𝟎[ π’ͺ X ] β‰€βŸ¨ Ξ·                          ⟩
              j 𝟎[ π’ͺ X ]          β– 
       where
        ΞΆ : (β€˜ U ’ ≀[ poset-of (π’ͺ Patchβ‚›-X) ] 𝒿) holds
        ΞΆ = adjunction-inequality-backward Ο΅ 𝒿 U Ο†

        Ξ· : ((U ∨[ π’ͺ X ] 𝟎[ π’ͺ X ]) ≀[ poset-of (π’ͺ X) ] j 𝟎[ π’ͺ X ]) holds
        Ξ· = ≼ᡏ-implies-β‰Ό β€˜ U ’ 𝒿 ΞΆ 𝟎[ π’ͺ X ]

\end{code}

\begin{code}

 Ο΅-is-a-perfect-map : is-perfect-map 𝒷 Ο΅ holds
 Ο΅-is-a-perfect-map 𝒦 Ξ΄ =
  transport (Ξ» - β†’ (- is-lub-of ⁅ Ο΅ ⁎· k ∣ k Ξ΅ 𝒦 ⁆) holds) (Ξ³ ⁻¹) †
   where
    open Joins (Ξ» x y β†’ x ≀[ poset-of (π’ͺ X) ] y)

    Ξ΄β€² : is-directed (π’ͺ Patch-of-X) 𝒦 holds
    Ξ΄β€² = pr₁ Ξ΄ , ΞΆ
     where
      ΞΆ : (β±― i κž‰ index 𝒦 , β±― j κž‰ index 𝒦 ,
            Ǝ k κž‰ index 𝒦 , (((𝒦 [ i ]) β‰Ό (𝒦 [ k ])) holds)
                          Γ— (((𝒦 [ j ]) β‰Ό (𝒦 [ k ])) holds)) holds
      ΞΆ i j = βˆ₯βˆ₯-rec βˆƒ-is-prop Ξ· (prβ‚‚ Ξ΄ i j)
       where
        Ξ· : _
        Ξ· (k , Ο† , ψ) =
                      ∣ k
                      , ≼ᡏ-implies-β‰Ό (𝒦 [ i ]) (𝒦 [ k ]) Ο†
                      , ≼ᡏ-implies-β‰Ό (𝒦 [ j ]) (𝒦 [ k ]) ψ
                      ∣

    Ξ³ : Ο΅ ⁎· (⋁[ π’ͺ Patchβ‚›-X ] 𝒦) = ⋁[ π’ͺ X ] ⁅ Ο΅ ⁎· k ∣ k Ξ΅ 𝒦 ⁆
    Ξ³ = Ο΅ ⁎· (⋁[ π’ͺ Patchβ‚›-X ] 𝒦)            =⟨ i   ⟩
        (⋁[ π’ͺ Patchβ‚›-X ] 𝒦) $ 𝟎[ π’ͺ X ]      =⟨ ii  ⟩
        ⋁[ π’ͺ X ] ⁅ k $ 𝟎[ π’ͺ X ] ∣ k Ξ΅ 𝒦 ⁆   =⟨ iii ⟩
        ⋁[ π’ͺ X ] ⁅ Ο΅ ⁎· k ∣ k Ξ΅ 𝒦 ⁆         ∎
          where
           β€»   : (i : index 𝒦) β†’ (𝒦 [ i ]) $ 𝟎[ π’ͺ X ] = Ο΅ ⁎· (𝒦 [ i ])
           β€»   = Ξ» i β†’ ϡ⁎-is-application-to-𝟎 (𝒦 [ i ]) ⁻¹

           i   = ϡ⁎-is-application-to-𝟎 (⋁[ π’ͺ Patchβ‚›-X ] 𝒦)
           ii  = directed-joins-are-computed-pointwise 𝒦 Ξ΄β€² 𝟎[ π’ͺ X ]
           iii = ap (Ξ» - β†’ ⋁[ π’ͺ X ] (index 𝒦 , -)) (dfunext fe β€»)

    † : ((⋁[ π’ͺ X ] ⁅ Ο΅ ⁎· k ∣ k Ξ΅ 𝒦 ⁆) is-lub-of ⁅ Ο΅ ⁎· k ∣ k Ξ΅ 𝒦 ⁆) holds
    † = ⋁[ π’ͺ X ]-upper ⁅ Ο΅ ⁎· k ∣ k Ξ΅ 𝒦 ⁆ , ⋁[ π’ͺ X ]-least ⁅ Ο΅ ⁎· k ∣ k Ξ΅ 𝒦 ⁆

\end{code}

\section{Open and Closed Nuclei are Complements}

\begin{code}

module PatchComplementation (X : Locale (𝓀 ⁺) 𝓀 𝓀) (Οƒα΄° : spectralα΄° X) where

 Οƒ : is-spectral X holds
 Οƒ = spectralα΄°-gives-spectrality X Οƒα΄°

 ℬ↑ : Fam 𝓀 ⟨ π’ͺ X ⟩
 ℬ↑ = basisβ‚› X Οƒα΄°

 d : directed-basisα΄° (π’ͺ X)
 d = ℬ↑ , basisβ‚›-is-directed-basis X Οƒα΄°

 Ξ² : has-basis (π’ͺ X) holds
 Ξ² = ∣ spectralα΄°-implies-basisα΄° X Οƒα΄° ∣

 ΞΊ : consists-of-compact-opens X ℬ↑ holds
 ΞΊ = basisβ‚›-consists-of-compact-opens X Οƒα΄°

 sk : 𝒦 X is 𝓀 small
 sk = 𝒦-is-small X d ΞΊ (local-smallness X)

 X-has-small-basis : βˆ₯ basisα΄° (π’ͺ X) βˆ₯
 X-has-small-basis = ∣ spectralα΄°-implies-basisα΄° X Οƒα΄° ∣

 open SmallPatchConstruction X Οƒα΄° renaming (SmallPatch to Patchβ‚›-X)
 open PatchConstruction X Οƒ using (_$_; 𝔑𝔦𝔯)
 open ClosedNucleus X Οƒ
 open OpenNucleus   X Οƒα΄° sk
 open HeytingImplicationConstruction X X-has-small-basis

 open-complements-closed : (K : ⟨ π’ͺ X ⟩)
                         β†’ (ΞΊ : is-compact-open X K holds)
                         β†’ (is-boolean-complement-of (π’ͺ Patchβ‚›-X) Β¬β€˜ (K , ΞΊ) ’ β€˜ K ’ ) holds
 open-complements-closed K ΞΊ = † , ‑
  where
   open PosetReasoning (poset-of (π’ͺ X))

   †₁ : ((β€˜ K ’ ∧[ π’ͺ Patchβ‚›-X ] Β¬β€˜ (K , ΞΊ) ’)
         ≀[ poset-of (π’ͺ Patchβ‚›-X) ]
         𝟎[ π’ͺ Patchβ‚›-X ]) holds
   †₁ l =
    (K ∨[ π’ͺ X ] (ℬ [ l ])) ∧[ π’ͺ X ] ((K ==> (ℬ [ l ])))                           =⟨ β…  βŸ©β‚š
    (K ∧[ π’ͺ X ] (K ==> (ℬ [ l ]))) ∨[ π’ͺ X ] (ℬ [ l ] ∧[ π’ͺ X ] (K ==> (ℬ [ l ])))  β‰€βŸ¨ β…‘ ⟩
    (ℬ [ l ]) ∨[ π’ͺ X ] (ℬ [ l ] ∧[ π’ͺ X ] (K ==> (ℬ [ l ])))                       β‰€βŸ¨ β…’ ⟩
    ℬ [ l ]                                                                       =⟨ β…£ βŸ©β‚š
    𝟎[ π’ͺ Patchβ‚›-X ] $ (ℬ [ l ])                                                   β– 
     where
      β…  =  binary-distributivity-right (π’ͺ X)
      β…‘ = ∨[ π’ͺ X ]-left-monotone (mp-left K (ℬ [ l ]))
      β…’ = ∨[ π’ͺ X ]-least β™₯ β™ 
           where
            β™₯ = ≀-is-reflexive (poset-of (π’ͺ X)) (ℬ [ l ])
            β™  = ∧[ π’ͺ X ]-lower₁ (ℬ [ l ]) (K ==> (ℬ [ l ]))
      β…£ = 𝟎-is-id (ℬ [ l ]) ⁻¹

   ‑₁ : (𝟏[ π’ͺ Patchβ‚›-X ] ≼ᡏ (β€˜ K ’ ∨[ π’ͺ Patchβ‚›-X ] Β¬β€˜ (K , ΞΊ) ’)) holds
   ‑₁ l =
     𝟏[ π’ͺ X ]                                                 β‰€βŸ¨ β…  ⟩
     K ==> (K ∨[ π’ͺ X ] (ℬ [ l ]))                             β‰€βŸ¨ β…‘ ⟩
     (β€˜ K ’ ∨[ π’ͺ Patchβ‚›-X ] Β¬β€˜ (K , ΞΊ) ’) $ (ℬ [ l ])         β– 
      where
       β€» : ((𝟏[ π’ͺ X ] ∧[ π’ͺ X ] K) ≀[ poset-of (π’ͺ X) ] (K ∨[ π’ͺ X ] ℬ [ l ])) holds
       β€» = 𝟏[ π’ͺ X ] ∧[ π’ͺ X ] K   β‰€βŸ¨ ∧[ π’ͺ X ]-lowerβ‚‚ (𝟏[ π’ͺ X ]) K ⟩
           K                     β‰€βŸ¨ ∨[ π’ͺ X ]-upper₁ K (ℬ [ l ])  ⟩
           K ∨[ π’ͺ X ] ℬ [ l ]    β– 

       β…  = heyting-implication₁ K (K ∨[ π’ͺ X ] (ℬ [ l ])) 𝟏[ π’ͺ X ] β€»
       β…‘ = ⋁[ π’ͺ X ]-upper _ (inl ⋆ ∷ inr ⋆ ∷ [])

   † : β€˜ K ’ ∧[ π’ͺ Patchβ‚›-X ] Β¬β€˜ (K , ΞΊ) ’ = 𝟎[ π’ͺ Patchβ‚›-X ]
   † = only-𝟎-is-below-𝟎 (π’ͺ Patchβ‚›-X) _ †₁

   ‑ : β€˜ K ’ ∨[ π’ͺ Patchβ‚›-X ] Β¬β€˜ (K , ΞΊ) ’ = 𝟏[ π’ͺ Patchβ‚›-X ]
   ‑ = only-𝟏-is-above-𝟏 (π’ͺ Patchβ‚›-X) _ ‑₁

 closed-complements-open : (K : ⟨ π’ͺ X ⟩)
                         β†’ (ΞΊ : is-compact-open X K holds)
                         β†’ is-boolean-complement-of (π’ͺ Patchβ‚›-X) β€˜ K ’ Β¬β€˜ (K , ΞΊ) ’ holds
 closed-complements-open K ΞΊ =
  complementation-is-symmetric (π’ͺ Patchβ‚›-X) Β¬β€˜ (K , ΞΊ) ’ β€˜ K ’ β€»
   where
    β€» = open-complements-closed K ΞΊ

\end{code}

I define below an alternative version of the module above due to a technical
problem. Consider a spectral locale `A` with a proof `Οƒ` of spectrality. When
the module above is called with the data contained in `Οƒ` (let's call this
`Οƒα΄°`), Agda does not recognise the fact that `Οƒ = ∣ Οƒα΄° ∣`. To circumvent this
problem, I'm defining a version of this module that takes as argument the proof
of spectrality instead of the structure contained within.

\begin{code}

-- module PatchComplementationAlternative (X : Locale (𝓀 ⁺) 𝓀 𝓀)
--                                        (Οƒ : is-spectral (π’ͺ X) holds) where

--  open PatchConstruction X Οƒ renaming (Patch to Patch-X)
--  open ClosedNucleus     X Οƒ
--  open OpenNucleus       X Οƒ

--  X-has-basis : has-basis (π’ͺ X) holds
--  X-has-basis = spectral-frames-have-bases (π’ͺ X) Οƒ

--  open HeytingImplicationConstruction X X-has-basis

--  𝟎-is-id : (U : ⟨ π’ͺ X ⟩) β†’ 𝟎[ π’ͺ Patch-X ] $ U = U
--  𝟎-is-id U = ≀-is-antisymmetric (poset-of (π’ͺ X)) † (‑ U)
--   where
--    † : ((𝟎[ π’ͺ Patch-X ] $ U) ≀[ poset-of (π’ͺ X) ] U) holds
--    † = 𝟎-is-bottom (π’ͺ Patch-X) idβ‚™ U

--    ‑ : (idβ‚™ ≀[ poset-of (π’ͺ Patch-X) ] 𝟎[ π’ͺ Patch-X ]) holds
--    ‑ U = U β‰€βŸ¨ β€» ⟩ (⋁[ π’ͺ Patch-X ] βˆ… 𝓀) $ U =⟨ refl βŸ©β‚š 𝟎[ π’ͺ Patch-X ] $ U β– 
--     where
--      open PosetReasoning (poset-of (π’ͺ X))

--      β€» : (U ≀[ poset-of (π’ͺ X) ] (⋁[ π’ͺ Patch-X ] βˆ… 𝓀) $ U) holds
--      β€» = ⋁[ π’ͺ X ]-upper ⁅ Ξ± U ∣ Ξ± Ξ΅ 𝔑𝔦𝔯 (βˆ… 𝓀) ⁆ []

--  open-complements-closed : (K : ⟨ π’ͺ X ⟩)
--                          β†’ (ΞΊ : is-compact-open (π’ͺ X) K holds)
--                          β†’ (is-boolean-complement-of (π’ͺ Patch-X) Β¬β€˜ (K , ΞΊ) ’ β€˜ K ’ ) holds
--  open-complements-closed K ΞΊ = † , ‑
--   where
--    β€» : (U : ⟨ π’ͺ X ⟩) β†’ (K ∨[ π’ͺ X ] U) ∧[ π’ͺ X ] (K ==> U) = 𝟎[ π’ͺ Patch-X ] $ U
--    β€» U = (K ∨[ π’ͺ X ] U) ∧[ π’ͺ X ] (K ==> U)  =⟨ β…             ⟩
--          (U ∨[ π’ͺ X ] K) ∧[ π’ͺ X ] (K ==> U)  =⟨ β…‘            ⟩
--          U                                  =⟨ 𝟎-is-id U ⁻¹ ⟩
--          𝟎[ π’ͺ Patch-X ] $ U                 ∎
--           where
--            β…  = ap (Ξ» - β†’ - ∧[ π’ͺ X ] (K ==> U)) (∨[ π’ͺ X ]-is-commutative K U)
--            β…‘ = Hβ‚ˆ U K ⁻¹

--    † : β€˜ K ’ ∧[ π’ͺ Patch-X ] Β¬β€˜ (K , ΞΊ) ’ = 𝟎[ π’ͺ Patch-X ]
--    † = perfect-nuclei-eq
--         (β€˜ K ’ ∧[ π’ͺ Patch-X ] Β¬β€˜ K , ΞΊ ’)
--         𝟎[ π’ͺ Patch-X ]
--         (dfunext fe β€»)

--    ϟ : (𝟏[ π’ͺ Patch-X ] ≀[ poset-of (π’ͺ Patch-X) ] (β€˜ K ’ ∨[ π’ͺ Patch-X ] Β¬β€˜ (K , ΞΊ) ’)) holds
--    ϟ U =
--     𝟏[ π’ͺ X ]                                β‰€βŸ¨ β…  ⟩
--     K ==> (K ∨[ π’ͺ X ] U)                    β‰€βŸ¨ β…‘ ⟩
--     (β€˜ K ’ ∨[ π’ͺ Patch-X ] Β¬β€˜ (K , ΞΊ) ’) $ U β– 
--      where
--       open PosetReasoning (poset-of (π’ͺ X))

--       Ο‘ : ((𝟏[ π’ͺ X ] ∧[ π’ͺ X ] K) ≀[ poset-of (π’ͺ X) ] (K ∨[ π’ͺ X ] U)) holds
--       Ο‘ = 𝟏[ π’ͺ X ] ∧[ π’ͺ X ] K   β‰€βŸ¨ ∧[ π’ͺ X ]-lowerβ‚‚ 𝟏[ π’ͺ X ] K ⟩
--           K                     β‰€βŸ¨ ∨[ π’ͺ X ]-upper₁ K U        ⟩
--           K ∨[ π’ͺ X ] U          β– 

--       β…  = heyting-implication₁ K (K ∨[ π’ͺ X ] U) 𝟏[ π’ͺ X ] Ο‘
--       β…‘ = ⋁[ π’ͺ X ]-upper _ (inl ⋆ ∷ inr ⋆ ∷ [])

--    ‑ : β€˜ K ’ ∨[ π’ͺ Patch-X ] Β¬β€˜ (K , ΞΊ) ’ = 𝟏[ π’ͺ Patch-X ]
--    ‑ = only-𝟏-is-above-𝟏
--         (π’ͺ Patch-X)
--         (β€˜ K ’ ∨[ π’ͺ Patch-X ] Β¬β€˜ (K , ΞΊ) ’)
--         ϟ

\end{code}

\section{Basis of Patch}

\begin{code}

module BasisOfPatch (X : Locale (𝓀 ⁺) 𝓀 𝓀) (Οƒα΄° : spectralα΄° X) where

 Οƒ : is-spectral X holds
 Οƒ = spectralα΄°-gives-spectrality X Οƒα΄°

 ℬ↑ : Fam 𝓀 ⟨ π’ͺ X ⟩
 ℬ↑ = basisβ‚› X Οƒα΄°

 d : directed-basisα΄° (π’ͺ X)
 d = ℬ↑ , basisβ‚›-is-directed-basis X Οƒα΄°

 Ξ² : has-basis (π’ͺ X) holds
 Ξ² = ∣ spectralα΄°-implies-basisα΄° X Οƒα΄° ∣

 ΞΊ : consists-of-compact-opens X ℬ↑ holds
 ΞΊ = basisβ‚›-consists-of-compact-opens X Οƒα΄°

 sk : 𝒦 X is 𝓀 small
 sk = 𝒦-is-small X d ΞΊ (local-smallness X)

 open PatchConstruction X Οƒ
  using (_β‰Ό_; _⋏_; nucleus-of; _$_; ⋁ₙ)
  renaming (Patch to Patch-X; Perfect-Nucleus to Perfect-Nucleus-on-X)
 open SmallPatchConstruction X Οƒα΄° renaming (SmallPatch to Patchβ‚›-X)
 open HeytingImplicationConstruction X ∣ spectralα΄°-implies-basisα΄° X Οƒα΄° ∣
 open ClosedNucleus X Οƒ
 open OpenNucleus X Οƒα΄° sk

\end{code}

For convenience, we define the following auxiliary notation for the open nucleus:

\begin{code}

 𝔠 : index ℬ β†’ ⟨ π’ͺ Patchβ‚›-X ⟩
 𝔠 i = β€˜ ℬ [ i ] ’

 𝔬 : index ℬ β†’ ⟨ π’ͺ Patchβ‚›-X ⟩
 𝔬 i = Β¬β€˜ ℬ [ i ] , pr₁ (prβ‚‚ (prβ‚‚ Οƒα΄°)) i ’

 π•œ : (i : index ℬ) β†’ is-compact-open X (ℬ [ i ]) holds
 π•œ = pr₁ (prβ‚‚ (prβ‚‚ Οƒα΄°))

\end{code}

We define the following basis for Patch:

\begin{code}

 ℬ-patch : Fam 𝓀 ⟨ π’ͺ Patchβ‚›-X ⟩
 ℬ-patch = ⁅ 𝔠 k ⋏ 𝔬 l ∣ (k , l) ∢ (index ℬ Γ— index ℬ) ⁆

 ℬ-patch-consists-of-clopens : consists-of-clopens (π’ͺ Patch-X) ℬ-patch holds
 ℬ-patch-consists-of-clopens (k , l) = (𝔬 k ∨[ π’ͺ Patch-X ] 𝔠 l) , β€»
  where
   open PatchComplementation X Οƒα΄°

   † : is-boolean-complement-of (π’ͺ Patch-X) (𝔠 k) (𝔬 k) holds
   † = closed-complements-open (ℬ [ k ]) (π•œ k)

   ‑ : is-boolean-complement-of (π’ͺ Patch-X) (𝔬 l) (𝔠 l) holds
   ‑ = open-complements-closed (ℬ [ l ]) (π•œ l)

   β€» : is-boolean-complement-of
        (π’ͺ Patch-X)
        (𝔬 k ∨[ π’ͺ Patch-X ] 𝔠 l)
        (𝔠 k ∧[ π’ͺ Patch-X ] 𝔬 l) holds
   β€» = ∧-complement (π’ͺ Patch-X) † ‑

 ℬ-patchβ‚›-consists-of-clopens : consists-of-clopens (π’ͺ Patchβ‚›-X) ℬ-patch holds
 ℬ-patchβ‚›-consists-of-clopens (k , l) = (𝔬 k ∨[ π’ͺ Patchβ‚›-X ] 𝔠 l) , β€»
  where
   open PatchComplementation X Οƒα΄°

   abstract
    † : is-boolean-complement-of (π’ͺ Patchβ‚›-X) (𝔠 k) (𝔬 k) holds
    † = closed-complements-open (ℬ [ k ]) (π•œ k)

    ‑ : is-boolean-complement-of (π’ͺ Patchβ‚›-X) (𝔬 l) (𝔠 l) holds
    ‑ = open-complements-closed (ℬ [ l ]) (π•œ l)

    β€» : is-boolean-complement-of
         (π’ͺ Patchβ‚›-X)
         (𝔬 k ∨[ π’ͺ Patchβ‚›-X ] 𝔠 l)
         (𝔠 k ∧[ π’ͺ Patch-X ] 𝔬 l)
        holds
    β€» = ∧-complement (π’ͺ Patchβ‚›-X) † ‑

 ℬ-patch-↑ : Fam 𝓀 ⟨ π’ͺ Patchβ‚›-X ⟩
 ℬ-patch-↑ = directify (π’ͺ Patchβ‚›-X) ℬ-patch

{--

 ℬ-patch-↑-consists-of-clopens : consists-of-clopens (π’ͺ Patchβ‚›-X) ℬ-patch-↑ holds
 ℬ-patch-↑-consists-of-clopens = {! directification-preserves-clopenness (π’ͺ Patchβ‚›-X) ? ? !}
  -- directification-preserves-clopenness
  --  (π’ͺ Patch-X)
  --  ℬ-patch ℬ-patch-consists-of-clopens

--}

\end{code}

Given a perfect nucleus `j : π“ž(X) β†’ π“ž(X)`, the basic covering family for it
is given by the restriction of the family, given by the function `𝕔𝕠𝕧`

\begin{code}

 basic-below : Perfect-Nucleus-on-X β†’ 𝓀  Μ‡
 basic-below 𝒿@(j , _) =
  Ξ£ (k , l) κž‰ (index ℬ Γ— index ℬ) , ((ℬ [ k ]) ≀[ poset-of (π’ͺ X) ] j (ℬ [ l ])) holds

 proj : (𝒿 : Perfect-Nucleus-on-X) β†’ basic-below 𝒿 β†’ index ℬ Γ— index ℬ
 proj 𝒿 ((k , l) , _)= k , l

 𝕔𝕠𝕧₁ : Perfect-Nucleus-on-X β†’ Fam 𝓀 ⟨ π’ͺ Patchβ‚›-X ⟩
 𝕔𝕠𝕧₁ 𝒿@(j , _) = ⁅ 𝔠 k ∧[ π’ͺ Patchβ‚›-X ] 𝔬 l ∣ ((k , l) , _) ∢ basic-below 𝒿 ⁆

 π•œβ€² : Perfect-Nucleus-on-X β†’ index ℬ β†’ ⟨ π’ͺ Patchβ‚›-X ⟩
 π•œβ€² (j , _) l = β€˜ j (ℬ [ l ]) ’ ∧[ π’ͺ Patchβ‚›-X ] 𝔬 l

 𝕔𝕠𝕧₂ : Perfect-Nucleus-on-X β†’ Fam 𝓀 ⟨ π’ͺ Patchβ‚›-X ⟩
 𝕔𝕠𝕧₂ 𝒿 = ⁅ π•œβ€² 𝒿 i ∣ i ∢ index ℬ ⁆

\end{code}

\begin{code}

 π•œβ±Όi-is-below-j : (𝒿 : Perfect-Nucleus-on-X) (i : index ℬ) β†’ (π•œβ€² 𝒿 i ≼ᡏ 𝒿) holds
 π•œβ±Όi-is-below-j 𝒿@(j , _) i l =
  π•œβ€² 𝒿 i $ (ℬ [ l ])                                         =⟨ refl βŸ©β‚š
  (j ℬᡒ ∨[ π’ͺ X ] ℬₗ) ∧[ π’ͺ X ] (ℬᡒ ==> ℬₗ)                    β‰€βŸ¨ ᚠ ⟩
  (j ℬᡒ ∨[ π’ͺ X ] ℬₗ) ∧[ π’ͺ X ] (j ℬᡒ ==> j ℬₗ)                β‰€βŸ¨ ᚣ ⟩
  (j ℬᡒ ∨[ π’ͺ X ] ℬₗ) ∧[ π’ͺ X ] ((j ℬᡒ ∨[ π’ͺ X ] ℬₗ) ==> j ℬₗ)  β‰€βŸ¨ ᚬ ⟩
  j (ℬ [ l ])                                                β– 
   where
    open PosetReasoning (poset-of (π’ͺ X))
    ℬᡒ = ℬ [ i ]
    ℬₗ = ℬ [ l ]

    β…  = binary-distributivity (π’ͺ X) (j ℬᡒ ==> j ℬₗ) (j ℬᡒ) ℬₗ
    β…‘ = ∨[ π’ͺ X ]-left-monotone (mp-right (j ℬᡒ) (j ℬₗ))
    β…’ = ∨[ π’ͺ X ]-right-monotone (∧[ π’ͺ X ]-lowerβ‚‚ (j ℬᡒ ==> j ℬₗ) ℬₗ)
    β…£ = ∨[ π’ͺ X ]-least (≀-is-reflexive (poset-of (π’ͺ X)) (j ℬₗ)) (𝓃₁ (π’ͺ X) (nucleus-of 𝒿) ℬₗ)

    ♣ : ((j ℬᡒ ==> j ℬₗ ∧[ π’ͺ X ] (j ℬᡒ ∨[ π’ͺ X ] ℬₗ)) ≀[ poset-of (π’ͺ X) ] j ℬₗ) holds
    ♣ = j ℬᡒ ==> j ℬₗ ∧[ π’ͺ X ] (j ℬᡒ ∨[ π’ͺ X ] ℬₗ)                             =⟨ β…  βŸ©β‚š
        ((j ℬᡒ ==> j ℬₗ) ∧[ π’ͺ X ] j ℬᡒ) ∨[ π’ͺ X ] (j ℬᡒ ==> j ℬₗ) ∧[ π’ͺ X ] ℬₗ  β‰€βŸ¨ β…‘ ⟩
        j ℬₗ ∨[ π’ͺ X ] (j ℬᡒ ==> j ℬₗ) ∧[ π’ͺ X ] ℬₗ                             β‰€βŸ¨ β…’ ⟩
        j ℬₗ ∨[ π’ͺ X ] ℬₗ                                                      β‰€βŸ¨ β…£ ⟩
        j ℬₗ                                                                  β– 


    β™  : ((j ℬᡒ ==> j ℬₗ) ≀[ poset-of (π’ͺ X) ] ((j ℬᡒ ∨[ π’ͺ X ] ℬₗ) ==> j ℬₗ)) holds
    β™  = heyting-implication₁ _ (j ℬₗ) (j ℬᡒ ==> j ℬₗ) ♣

    ᚠ = ∧[ π’ͺ X ]-right-monotone (nuclei-preserve-==> ℬᡒ ℬₗ (nucleus-of 𝒿))
    ᚣ = ∧[ π’ͺ X ]-right-monotone β™ 
    ᚬ = mp-left (j ℬᡒ ∨[ π’ͺ X ] ℬₗ) (j ℬₗ)

\end{code}

This lemma can be strengthened to an equality in the case where `π•œβ±Ό(i)` is being
applied to `ℬⱼ`.

\begin{code}

 π•œ-𝒿-eq : (𝒿 : Perfect-Nucleus-on-X) (i : index ℬ) β†’ π•œβ€² 𝒿 i $ (ℬ [ i ]) = 𝒿 $ (ℬ [ i ])
 π•œ-𝒿-eq 𝒿@(j , _) i = ≀-is-antisymmetric (poset-of (π’ͺ X)) † ‑
  where
   open PosetReasoning (poset-of (π’ͺ X))

   ℬᡒ = ℬ [ i ]

   † : (((π•œβ€² 𝒿 i) $ (ℬ [ i ])) ≀[ poset-of (π’ͺ X) ] (𝒿 $ (ℬ [ i ]))) holds
   † = π•œβ±Όi-is-below-j 𝒿 i i

   β…  = ∨[ π’ͺ X ]-upper₁ (j (ℬ [ i ])) (ℬ [ i ])
   β…‘ = 𝟏-right-unit-of-∧ (π’ͺ X) (j (ℬ [ i ]) ∨[ π’ͺ X ] ℬ [ i ]) ⁻¹
   β…’ = ap
       (Ξ» - β†’ (j (ℬ [ i ]) ∨[ π’ͺ X ] ℬ [ i ]) ∧[ π’ͺ X ] -)
       (heyting-implication-identity (ℬ [ i ]) ⁻¹)

   ‑ : ((𝒿 $ (ℬ [ i ])) ≀[ poset-of (π’ͺ X) ] (π•œβ€² 𝒿 i $ (ℬ [ i ]))) holds
   ‑ = 𝒿 $ (ℬ [ i ])                                                     β‰€βŸ¨ β…  ⟩
       j (ℬ [ i ]) ∨[ π’ͺ X ] ℬ [ i ]                                      =⟨ β…‘ βŸ©β‚š
       (j (ℬ [ i ]) ∨[ π’ͺ X ] ℬ [ i ]) ∧[ π’ͺ X ] 𝟏[ π’ͺ X ]                  =⟨ β…’ βŸ©β‚š
       (j (ℬ [ i ]) ∨[ π’ͺ X ] ℬ [ i ]) ∧[ π’ͺ X ] ((ℬ [ i ]) ==> (ℬ [ i ])) =⟨ refl βŸ©β‚š
       π•œβ€² 𝒿 i $ (ℬ [ i ])                                                 β– 

\end{code}

The first lemma we prove is the fact that `𝒿 = 𝕔𝕠𝕧₂ 𝒿` which we call
*Johnstone's lemma*.

\begin{code}

 lemma-johnstone : (𝒿 : Perfect-Nucleus-on-X) β†’ 𝒿 = ⋁[ π’ͺ Patchβ‚›-X ] 𝕔𝕠𝕧₂ 𝒿
 lemma-johnstone 𝒿@(j , _) = ⋁[ π’ͺ Patchβ‚›-X ]-unique (𝕔𝕠𝕧₂ 𝒿) 𝒿 († , ‑)
  where
   open Joins (Ξ» 𝒿 𝓀 β†’ 𝒿 ≀[ poset-of (π’ͺ Patchβ‚›-X) ] 𝓀)
   open PosetReasoning (poset-of (π’ͺ X))

   † : (𝒿 is-an-upper-bound-of 𝕔𝕠𝕧₂ 𝒿) holds
   † = π•œβ±Όi-is-below-j 𝒿

   ‑ : ((𝓀 , _) : upper-bound (𝕔𝕠𝕧₂ 𝒿)) β†’ (𝒿 ≼ᡏ 𝓀) holds
   ‑ (𝓀 , Ο…) l = j (ℬ [ l ])        =⟨ π•œ-𝒿-eq 𝒿 l ⁻¹ βŸ©β‚š
                 π•œβ€² 𝒿 l $ (ℬ [ l ]) β‰€βŸ¨ Ο… l l ⟩
                 𝓀 $ (ℬ [ l ])      β– 

\end{code}

\begin{code}

 open Epsilon X Οƒα΄°

 β€˜β€™-is-monotone : (U V : ⟨ π’ͺ X ⟩)
                β†’ (U ≀[ poset-of (π’ͺ X) ] V) holds
                β†’ (β€˜ U ’ ≀[ poset-of (π’ͺ Patch-X) ] β€˜ V ’) holds
 β€˜β€™-is-monotone U V p W = ∨[ π’ͺ X ]-least † ‑
  where
   open PosetReasoning (poset-of (π’ͺ X))

   † : (U ≀[ poset-of (π’ͺ X) ] (V ∨[ π’ͺ X ] W)) holds
   † = U β‰€βŸ¨ p ⟩ V β‰€βŸ¨ ∨[ π’ͺ X ]-upper₁ V W ⟩ V ∨[ π’ͺ X ] W β– 

   ‑ : (W ≀[ poset-of (π’ͺ X) ] (V ∨[ π’ͺ X ] W)) holds
   ‑ = ∨[ π’ͺ X ]-upperβ‚‚ V W

 𝕔𝕠𝕧₁=𝕔𝕠𝕧₂ : (𝒿 : Perfect-Nucleus-on-X) β†’ ⋁ₙ (𝕔𝕠𝕧₁ 𝒿) = ⋁ₙ (𝕔𝕠𝕧₂ 𝒿)
 𝕔𝕠𝕧₁=𝕔𝕠𝕧₂ 𝒿@(j , _) = ≀-is-antisymmetric (poset-of (π’ͺ Patch-X)) † ‑
  where

   Ξ²β€² : cofinal-in (π’ͺ Patch-X) (𝕔𝕠𝕧₁ 𝒿) (𝕔𝕠𝕧₂ 𝒿) holds
   Ξ²β€² ((k , l) , p) = ∣ l , β€» ∣
    where
     open PosetReasoning (poset-of (π’ͺ Patch-X))

     β™  : ((𝔠 k ∧[ π’ͺ Patch-X ] 𝔬 l)
          ≀[ poset-of (π’ͺ Patch-X) ]
          (β€˜ j (ℬ [ l ]) ’ ∧[ π’ͺ Patchβ‚›-X ] 𝔬 l)) holds
     β™  = ∧[ π’ͺ Patch-X ]-left-monotone (β€˜β€™-is-monotone (ℬ [ k ]) (j (ℬ [ l ])) p)

     β€» : ((𝕔𝕠𝕧₁ 𝒿 [ (k , l) , p ]) ≀[ poset-of (π’ͺ Patch-X) ] ((𝕔𝕠𝕧₂ 𝒿) [ l ])) holds
     β€» = 𝕔𝕠𝕧₁ 𝒿 [ (k , l) , p ]                =⟨ refl βŸ©β‚š
         𝔠 k ∧[ π’ͺ Patch-X ] 𝔬 l                β‰€βŸ¨ β™  ⟩
         β€˜ j (ℬ [ l ]) ’ ∧[ π’ͺ Patchβ‚›-X ] 𝔬 l   =⟨ refl βŸ©β‚š
         𝕔𝕠𝕧₂ 𝒿 [ l ]                          β– 

   † : (⋁ₙ (𝕔𝕠𝕧₁ 𝒿) β‰Ό ⋁ₙ (𝕔𝕠𝕧₂ 𝒿)) holds
   † = cofinal-implies-join-covered (π’ͺ Patch-X) (𝕔𝕠𝕧₁ 𝒿) (𝕔𝕠𝕧₂ 𝒿) Ξ²β€²

   ‑ : (⋁ₙ (𝕔𝕠𝕧₂ 𝒿) ≀[ poset-of (π’ͺ Patch-X) ] (⋁ₙ (𝕔𝕠𝕧₁ 𝒿))) holds
   ‑ = ⋁[ π’ͺ Patch-X ]-least (𝕔𝕠𝕧₂ 𝒿) (⋁ₙ (𝕔𝕠𝕧₁ 𝒿) , β€»)
    where
     open Joins (Ξ» x y β†’ x ≀[ poset-of (π’ͺ Patch-X) ] y)
     open PosetReasoning (poset-of (π’ͺ X))


     β€» : (⋁ₙ (𝕔𝕠𝕧₁ 𝒿) is-an-upper-bound-of (𝕔𝕠𝕧₂ 𝒿)) holds
     β€» i U =
      (𝕔𝕠𝕧₂ 𝒿 [ i ]) $ U                                                  =⟨ refl βŸ©β‚š
      π•œβ€² 𝒿 i $ U                                                          =⟨ refl βŸ©β‚š
      (β€˜ j (ℬ [ i ]) ’ ∧[ π’ͺ Patchβ‚›-X ] 𝔬 i) $ U                           =⟨ β…     βŸ©β‚š
      (β€˜ ⋁[ π’ͺ X ] ⁅ ℬ [ l ] ∣ l Ξ΅ β„’ ⁆ ’ ∧[ π’ͺ Patchβ‚›-X ] 𝔬 i) $ U          =⟨ β…‘    βŸ©β‚š
      ((⋁[ π’ͺ Patchβ‚›-X ] ⁅ β€˜ ℬ [ l ] ’ ∣ l Ξ΅ β„’ ⁆) ∧[ π’ͺ Patchβ‚›-X ] 𝔬 i) $ U =⟨ β…’    βŸ©β‚š
      ((⋁[ π’ͺ Patchβ‚›-X ] ⁅ β€˜ ℬ [ l ] ’ ∧[ π’ͺ Patchβ‚›-X ] 𝔬 i ∣ l Ξ΅ β„’ ⁆) $ U) β‰€βŸ¨ β™₯     ⟩
      ⋁ₙ (𝕔𝕠𝕧₁ 𝒿) $ U                                                     β– 
       where
        β„’ : Fam 𝓀 (index ℬ)
        β„’ = cover-indexβ‚› X Οƒα΄° (𝒿 $ (ℬ [ i ]))

        p : j (ℬ [ i ]) = ⋁[ π’ͺ X ] ⁅ ℬ [ l ] ∣ l Ξ΅ β„’ ⁆
        p = (⋁[ π’ͺ X ]-unique ⁅ ℬ [ l ] ∣ l Ξ΅ β„’ ⁆
               (j (ℬ [ i ]))
               (basisβ‚›-covers-do-cover X Οƒα΄° (j (ℬ [ i ]))))

        β…  = ap (Ξ» - β†’ (β€˜ - ’ ∧[ π’ͺ Patchβ‚›-X ] 𝔬 i) $ U) p
        β…‘ = ap
             (Ξ» - β†’ (- ∧[ π’ͺ Patchβ‚›-X ] 𝔬 i) $ U)
             (⋁[ π’ͺ Patchβ‚›-X ]-unique
               ⁅ β€˜ ℬ [ l ] ’ ∣ l Ξ΅ β„’ ⁆
               _
               (Ο΅-preserves-⋁ ⁅ ℬ [ l ] ∣ l Ξ΅ β„’ ⁆))
        β…’ = ap (Ξ» - β†’ - $ U) (distributivityβ€²-right _ _ _)

        ♣ : (l : index β„’)
          β†’ ((β€˜ ℬ [ β„’ [ l ] ] ’ ∧[ π’ͺ Patchβ‚›-X ] 𝔬 i) ≀[ poset-of (π’ͺ Patchβ‚›-X) ] (⋁[ π’ͺ Patchβ‚›-X ] 𝕔𝕠𝕧₁ 𝒿)) holds
        ♣ l = ⋁[ π’ͺ Patchβ‚›-X ]-upper (𝕔𝕠𝕧₁ 𝒿) ((β„’ [ l ] , i) , Ξ³)
         where
          Ξ³ : ((ℬ [ β„’ [ l ] ]) ≀[ poset-of (π’ͺ X) ] j (ℬ [ i ])) holds
          Ξ³ = ℬ [ β„’ [ l ] ]                  β‰€βŸ¨ ⋁[ π’ͺ X ]-upper ⁅ ℬ [ l ] ∣ l Ξ΅ β„’ ⁆ l ⟩
              ⋁[ π’ͺ X ] ⁅ ℬ [ l ] ∣ l Ξ΅ β„’ ⁆   =⟨ p ⁻¹ βŸ©β‚š
              j (ℬ [ i ])                    β– 

        β™  = ⋁[ π’ͺ Patchβ‚›-X ]-least
             ⁅ β€˜ ℬ [ l ] ’ ∧[ π’ͺ Patchβ‚›-X ] 𝔬 i ∣ l Ξ΅ β„’ ⁆
             ((⋁[ π’ͺ Patchβ‚›-X ] 𝕔𝕠𝕧₁ 𝒿) , ♣)

        β™₯ = ≼ᡏ-implies-β‰Ό _ _ β™  U

\end{code}

We first prove that this forms a basis.

\begin{code}

 main-covering-lemma : (𝒿 : Perfect-Nucleus-on-X) β†’ 𝒿 = ⋁[ π’ͺ Patch-X ] (𝕔𝕠𝕧₁ 𝒿)
 main-covering-lemma 𝒿 =
  𝒿                          =⟨ lemma-johnstone 𝒿 ⟩
  ⋁[ π’ͺ Patch-X ] (𝕔𝕠𝕧₂ 𝒿)    =⟨ (𝕔𝕠𝕧₁=𝕔𝕠𝕧₂ 𝒿) ⁻¹  ⟩
  ⋁[ π’ͺ Patch-X ] (𝕔𝕠𝕧₁ 𝒿)    ∎

 ℬ-is-basis-for-patch : is-basis-for (π’ͺ Patch-X) ℬ-patch
 ℬ-is-basis-for-patch 𝒿 = (basic-below 𝒿 , proj 𝒿) , β€»
  where
   open Joins _β‰Ό_

   β€» : (𝒿 is-lub-of (𝕔𝕠𝕧₁ 𝒿)) holds
   β€» = transport
        (Ξ» - β†’ (- is-lub-of (𝕔𝕠𝕧₁ 𝒿)) holds)
        (main-covering-lemma 𝒿 ⁻¹)
        ((⋁[ π’ͺ Patch-X ]-upper (𝕔𝕠𝕧₁ 𝒿) , ⋁[ π’ͺ Patch-X ]-least (𝕔𝕠𝕧₁ 𝒿)))

 ℬ-is-basis-for-patchβ‚› : is-basis-for (π’ͺ Patchβ‚›-X) ℬ-patch
 ℬ-is-basis-for-patchβ‚› 𝒿 = (basic-below 𝒿 , proj 𝒿) , β€»
  where
   open Joins (Ξ» x y β†’ x ≀[ poset-of (π’ͺ Patchβ‚›-X) ] y)

   β€» : (𝒿 is-lub-of 𝕔𝕠𝕧₁ 𝒿) holds
   β€» = transport
        (Ξ» - β†’ (- is-lub-of (𝕔𝕠𝕧₁ 𝒿)) holds)
        (main-covering-lemma 𝒿 ⁻¹)
        (⋁[ π’ͺ Patchβ‚›-X ]-upper (𝕔𝕠𝕧₁ 𝒿) , ⋁[ π’ͺ Patchβ‚›-X ]-least (𝕔𝕠𝕧₁ 𝒿))

\end{code}

\begin{code}

module PatchStoneα΄° (X : Locale (𝓀 ⁺) 𝓀 𝓀) (Οƒα΄° : spectralα΄° X) where

 private
  Οƒ : is-spectral X holds
  Οƒ = spectralα΄°-gives-spectrality X Οƒα΄°

 ℬ↑ : Fam 𝓀 ⟨ π’ͺ X ⟩
 ℬ↑ = basisβ‚› X Οƒα΄°

 d : directed-basisα΄° (π’ͺ X)
 d = ℬ↑ , basisβ‚›-is-directed-basis X Οƒα΄°

 Ξ² : has-basis (π’ͺ X) holds
 Ξ² = ∣ spectralα΄°-implies-basisα΄° X Οƒα΄° ∣

 ΞΊ : consists-of-compact-opens X ℬ↑ holds
 ΞΊ = basisβ‚›-consists-of-compact-opens X Οƒα΄°

 sk : 𝒦 X is 𝓀 small
 sk = 𝒦-is-small X d ΞΊ (local-smallness X)

 open ClosedNucleus X Οƒ
 open OpenNucleus   X Οƒα΄°
 open SmallPatchConstruction X Οƒα΄° renaming (SmallPatch to Patchβ‚›-X)
 open PatchConstruction X Οƒ using (_β‰Ό_; ⋁ₙ) renaming (Patch to Patch-X)
 open Epsilon X Οƒα΄°

 open PerfectMaps Patchβ‚›-X X 𝒷

 X-is-compact : is-compact X holds
 X-is-compact = spectral-implies-compact X Οƒ

\end{code}

\begin{code}

 patchβ‚›-is-compact : is-compact Patchβ‚›-X holds
 patchβ‚›-is-compact = compact-codomain-of-perfect-map-implies-compact-domain
                      Ο΅
                      Ο΅-is-a-perfect-map
                      X-is-compact

 patch-is-compact : is-compact Patch-X holds
 patch-is-compact S Ξ΄ p = βˆ₯βˆ₯-rec βˆƒ-is-prop Ξ³ (patchβ‚›-is-compact S ΞΆ †)
  where
   Ξ³ : (Ξ£ i κž‰ index S , (𝟏[ π’ͺ Patchβ‚›-X ] ≼ᡏ (S [ i ])) holds)
     β†’ βˆƒ i κž‰ index S , (𝟏[ π’ͺ Patch-X ] β‰Ό (S [ i ])) holds
   Ξ³ (i , q) = ∣ i , ≼ᡏ-implies-β‰Ό 𝟏[ π’ͺ Patch-X ] (S [ i ]) q ∣

   ΞΆ : is-directed (π’ͺ Patchβ‚›-X) S holds
   ΞΆ = pr₁ Ξ΄ , †
    where
     † : (i j : index S) β†’ (Ǝ k κž‰ index S , (((S [ i ]) ≼ᡏ (S [ k ]))
                                           ∧ ((S [ j ]) ≼ᡏ (S [ k ]))) holds) holds
     † i j = βˆ₯βˆ₯-rec βˆƒ-is-prop ‑ (prβ‚‚ Ξ΄ i j)
      where
       ‑ : _
       ‑ (k , Ο† , ψ) = ∣ k
                       , β‰Ό-implies-≼ᡏ (S [ i ]) (S [ k ]) Ο†
                       , β‰Ό-implies-≼ᡏ (S [ j ]) (S [ k ]) ψ ∣

   † : (𝟏[ π’ͺ Patch-X ] ≼ᡏ ⋁ₙ S) holds
   † = β‰Ό-implies-≼ᡏ 𝟏[ π’ͺ Patch-X ] (⋁ₙ S) p

\end{code}

\begin{code}

 open BasisOfPatch X Οƒα΄°

 ℬ-patch-β↑ : directed-basis-forα΄° (π’ͺ Patch-X) ℬ-patch-↑
 ℬ-patch-β↑ U = pr₁ Ξ£-assoc (β↑ U , Ξ΄)
  where
   β↑ : is-basis-for (π’ͺ Patch-X) (directify (π’ͺ Patch-X) ℬ-patch)
   β↑ = directified-basis-is-basis (π’ͺ Patch-X) ℬ-patch ℬ-is-basis-for-patch

   Ξ΄ : is-directed (π’ͺ Patch-X) ⁅ ℬ-patch-↑ [ j ] ∣ j Ξ΅ pr₁ (β↑ U) ⁆ holds
   Ξ΄ = covers-of-directified-basis-are-directed
        (π’ͺ Patch-X)
        ℬ-patch
        ℬ-is-basis-for-patch
        U

 ℬ-patchβ‚›-β↑ : directed-basis-forα΄° (π’ͺ Patchβ‚›-X) ℬ-patch-↑
 ℬ-patchβ‚›-β↑ U = pr₁ Ξ£-assoc (β↑ U , Ξ΄)
  where
   β↑ : is-basis-for (π’ͺ Patchβ‚›-X) (directify (π’ͺ Patchβ‚›-X) ℬ-patch)
   β↑ = directified-basis-is-basis (π’ͺ Patchβ‚›-X) ℬ-patch ℬ-is-basis-for-patchβ‚›

   Ξ΄ : is-directed (π’ͺ Patchβ‚›-X) ⁅ ℬ-patch-↑ [ j ] ∣ j Ξ΅ pr₁ (β↑ U) ⁆ holds
   Ξ΄ = covers-of-directified-basis-are-directed
        (π’ͺ Patchβ‚›-X)
        ℬ-patch
        ℬ-is-basis-for-patchβ‚›
        U

 patch-zero-dimensionalα΄° : zero-dimensionalα΄° (π’ͺ Patch-X)
 patch-zero-dimensionalα΄° = ℬ-patch-↑ , ℬ-patch-β↑ , †
  where
   †  : consists-of-clopens (π’ͺ Patch-X) ℬ-patch-↑ holds
   † []       = 𝟎-is-clopen (π’ͺ Patch-X)
   † (i ∷ is) = clopens-are-closed-under-∨ (π’ͺ Patch-X) (ℬ-patch [ i ]) (ℬ-patch-↑ [ is ]) (ℬ-patch-consists-of-clopens i) († is)

 patch-zero-dimensional : is-zero-dimensional (π’ͺ Patch-X) holds
 patch-zero-dimensional = ∣ patch-zero-dimensionalᴰ ∣

 ℬ-patch-↑-is-directed-basisβ‚› : is-directed-basis (π’ͺ Patchβ‚›-X) ℬ-patch-↑
 ℬ-patch-↑-is-directed-basisβ‚› =
  Ξ²β€² , covers-of-directified-basis-are-directed (π’ͺ Patchβ‚›-X) ℬ-patch ℬ-is-basis-for-patchβ‚›
   where
    Ξ²β€² : is-basis-for (π’ͺ Patchβ‚›-X) ℬ-patch-↑
    Ξ²β€² = directified-basis-is-basis (π’ͺ Patchβ‚›-X) ℬ-patch ℬ-is-basis-for-patchβ‚›

 patchβ‚›-zero-dimensionalα΄° : zero-dimensionalα΄° (π’ͺ Patchβ‚›-X)
 patchβ‚›-zero-dimensionalα΄° = ℬ-patch-↑ , ℬ-patchβ‚›-β↑ , Ξ³
  where
   Ξ²β€² : is-basis-for (π’ͺ Patchβ‚›-X) ℬ-patch-↑
   Ξ²β€² = directified-basis-is-basis (π’ͺ Patchβ‚›-X) ℬ-patch ℬ-is-basis-for-patchβ‚›

   Ξ³ : consists-of-clopens (π’ͺ Patchβ‚›-X) ℬ-patch-↑ holds
   Ξ³ []       = 𝟎-is-clopen (π’ͺ Patchβ‚›-X)
   γ (i ∷ is) = clopens-are-closed-under-∨
                 (π’ͺ Patchβ‚›-X)
                 (ℬ-patch [ i ])
                 (ℬ-patch-↑ [ is ])
                 (ℬ-patchβ‚›-consists-of-clopens i)
                 (Ξ³ is)

 patchβ‚›-is-stone : is-stone Patchβ‚›-X holds
 patchβ‚›-is-stone =
  stoneα΄°-implies-stone Patchβ‚›-X (patchβ‚›-is-compact , patchβ‚›-zero-dimensionalα΄°)

 patchβ‚›-spectralα΄° : spectralα΄° Patchβ‚›-X
 patchβ‚›-spectralα΄° = stoneα΄°-implies-spectralα΄°
                     Patchβ‚›-X
                     (patchβ‚›-is-compact , patchβ‚›-zero-dimensionalα΄°)

 patchβ‚›-is-spectral : is-spectral Patchβ‚›-X holds
 patchβ‚›-is-spectral =
  spectralα΄°-gives-spectrality Patchβ‚›-X patchβ‚›-spectralα΄°

\end{code}

\begin{code}


{--

module PatchStone (X : Locale (𝓀 ⁺) 𝓀 𝓀) (Οƒ : is-spectral X holds) where

 open PatchConstruction X Οƒ renaming (Patch to Patch-X)

 patch-is-stone : is-stone Patch-X holds
 patch-is-stone = βˆ₯βˆ₯-rec (holds-is-prop (is-stone (π’ͺ Patch-X))) Ξ³ Οƒ
  where
   Ξ³ : spectralα΄° X β†’ is-stone Patch-X holds
   Ξ³ Οƒα΄° = let
           open PatchStoneα΄° X Οƒα΄°
          in
           patch-is-compact , patch-zero-dimensional

 patch-is-spectral : is-spectral (π’ͺ Patch-X) holds
 patch-is-spectral = stone-locales-are-spectral (π’ͺ Patch-X) patch-is-stone

--}


\end{code}

\begin{code}

module OpenMeetClosedLemmata (X  : Locale (𝓀 ⁺) 𝓀 𝓀) (Οƒα΄° : spectralα΄° X) (sk : 𝒦 X is 𝓀 small) where

 private
  Οƒ : is-spectral X holds
  Οƒ = spectralα΄°-gives-spectrality X Οƒα΄°

  Ξ² : has-basis (π’ͺ X) holds
  Ξ² = ∣ spectralα΄°-implies-basisα΄° X Οƒα΄° ∣

 open ClosedNucleus X Οƒ
 open OpenNucleus   X Οƒα΄° sk
 open SmallPatchConstruction X Οƒα΄° using    (𝟎-is-id)
                                  renaming (SmallPatch to Patchβ‚›-X)
 open PatchConstruction X Οƒ
 open HeytingImplicationConstruction X Ξ²

 closed-meet-open-𝟎-lemma : (C D : ⟨ π’ͺ X ⟩)
                          β†’ (ΞΊ : is-compact-open X D holds)
                          β†’ (β€˜ C ’ ∧[ π’ͺ Patchβ‚›-X ] Β¬β€˜ (D , ΞΊ) ’) = 𝟎[ π’ͺ Patchβ‚›-X ]
                          β†’ (C ≀[ poset-of (π’ͺ X) ] D) holds
 closed-meet-open-𝟎-lemma C D ΞΊ p = connecting-lemma₃ (π’ͺ X) (‑ ⁻¹)
  where
   † : (C ∨[ π’ͺ X ] D) ∧[ π’ͺ X ] (D ==> D) = 𝟎[ π’ͺ Patchβ‚›-X ] $ D
   † =
    perfect-nuclei-eq-inverse
     (β€˜ C ’ ∧[ π’ͺ Patchβ‚›-X ] Β¬β€˜ D , ΞΊ ’)
     𝟎[ π’ͺ Patchβ‚›-X ]
     p
     D

   ‑ : C ∨[ π’ͺ X ] D = D
   ‑ = C ∨[ π’ͺ X ] D                               =⟨ β…  ⟩
       (C ∨[ π’ͺ X ] D) ∧[ π’ͺ X ] 𝟏[ π’ͺ X ]           =⟨ β…‘ ⟩
       (C ∨[ π’ͺ X ] D) ∧[ π’ͺ X ] (D ==> D)          =⟨ β…’ ⟩
       𝟎[ π’ͺ Patchβ‚›-X ] $ D                        =⟨ β…£ ⟩
       D                                          ∎
        where
         β…  = 𝟏-right-unit-of-∧ (π’ͺ X) (C ∨[ π’ͺ X ] D) ⁻¹
         β…‘ = ap
              (Ξ» - β†’ (C ∨[ π’ͺ X ] D) ∧[ π’ͺ X ] -)
              (heyting-implication-identity D ⁻¹)
         β…’ = †
         β…£ = 𝟎-is-id D

module AdditionalLemmata (X : Locale (𝓀 ⁺) 𝓀 𝓀) where

 ∨-distributivity-over-⋁ : (S T : Fam 𝓀 ⟨ π’ͺ X ⟩)
                         β†’ βˆ₯ index S βˆ₯
                         β†’ βˆ₯ index T βˆ₯
                         β†’ (⋁[ π’ͺ X ] S) ∨[ π’ͺ X ] (⋁[ π’ͺ X ] T)
                         = ⋁[ π’ͺ X ] ⁅ (S [ i ]) ∨[ π’ͺ X ] (T [ j ])
                                      ∣ (i , j) ∢ (index S Γ— index T) ⁆
 ∨-distributivity-over-⋁ S T ∣i∣ ∣j∣ = ≀-is-antisymmetric (poset-of (π’ͺ X)) † ‑
  where
   open Joins (Ξ» x y β†’ x ≀[ poset-of (π’ͺ X) ] y)
   open PosetReasoning (poset-of (π’ͺ X))

   π“π’½π“ˆ = (⋁[ π’ͺ X ] S) ∨[ π’ͺ X ] (⋁[ π’ͺ X ] T)
   π“‡π’½π“ˆ = ⋁[ π’ͺ X ] ⁅ (S [ i ]) ∨[ π’ͺ X ] (T [ j ]) ∣ (i , j) ∢ (index S Γ— index T) ⁆

   † : (π“π’½π“ˆ ≀[ poset-of (π’ͺ X) ] π“‡π’½π“ˆ) holds
   † = ∨[ π’ͺ X ]-least †₁ †₂
    where
     ♣₁ : index T β†’ ((⋁[ π’ͺ X ] S) ≀[ poset-of (π’ͺ X) ] π“‡π’½π“ˆ) holds
     ♣₁ j = ⋁[ π’ͺ X ]-least S (π“‡π’½π“ˆ , β€»)
      where
       β€» : (π“‡π’½π“ˆ is-an-upper-bound-of S) holds
       β€» i =
        S [ i ]                         β‰€βŸ¨ ∨[ π’ͺ X ]-upper₁ (S [ i ]) (T [ j ]) ⟩
        (S [ i ]) ∨[ π’ͺ X ] (T [ j ])    β‰€βŸ¨ ⋁[ π’ͺ X ]-upper _ (i , j)            ⟩
        π“‡π’½π“ˆ                             β– 

     †₁ : ((⋁[ π’ͺ X ] S) ≀[ poset-of (π’ͺ X) ] π“‡π’½π“ˆ) holds
     †₁ = βˆ₯βˆ₯-rec (holds-is-prop ((⋁[ π’ͺ X ] S) ≀[ poset-of (π’ͺ X) ] π“‡π’½π“ˆ)) ♣₁ ∣j∣

     ♣₂ : index S β†’ ((⋁[ π’ͺ X ] T) ≀[ poset-of (π’ͺ X) ] π“‡π’½π“ˆ) holds
     ♣₂ i = ⋁[ π’ͺ X ]-least T (π“‡π’½π“ˆ , β€»)
      where
       β€» : (π“‡π’½π“ˆ is-an-upper-bound-of T) holds
       β€» j =
        T [ j ]                        β‰€βŸ¨ ∨[ π’ͺ X ]-upperβ‚‚ (S [ i ]) (T [ j ]) ⟩
        (S [ i ]) ∨[ π’ͺ X ] (T [ j ])   β‰€βŸ¨ ⋁[ π’ͺ X ]-upper _ (i , j)            ⟩
        π“‡π’½π“ˆ β– 

     †₂ : ((⋁[ π’ͺ X ] T) ≀[ poset-of (π’ͺ X) ] π“‡π’½π“ˆ) holds
     †₂ = βˆ₯βˆ₯-rec (holds-is-prop ((⋁[ π’ͺ X ] T) ≀[ poset-of (π’ͺ X) ] π“‡π’½π“ˆ)) ♣₂ ∣i∣

   ‑ : (π“‡π’½π“ˆ ≀[ poset-of (π’ͺ X) ] π“π’½π“ˆ) holds
   ‑ = ⋁[ π’ͺ X ]-least
        ⁅ (S [ i ]) ∨[ π’ͺ X ] (T [ j ]) ∣ (i , j) ∢ (index S Γ— index T) ⁆
        (π“π’½π“ˆ , β€»)
        where
         β€» : (π“π’½π“ˆ
               is-an-upper-bound-of
              ⁅ (S [ i ]) ∨[ π’ͺ X ] (T [ j ]) ∣ (i , j) ∢ (index S Γ— index T) ⁆)
             holds
         β€» (i , j) = (S [ i ])    ∨[ π’ͺ X ] (T [ j ])     β‰€βŸ¨ β…  ⟩
                     (⋁[ π’ͺ X ] S) ∨[ π’ͺ X ] (T [ j ])     β‰€βŸ¨ β…‘ ⟩
                     (⋁[ π’ͺ X ] S) ∨[ π’ͺ X ] (⋁[ π’ͺ X ] T)  β– 
                      where
                       β…  = ∨[ π’ͺ X ]-left-monotone (⋁[ π’ͺ X ]-upper S i)
                       β…‘ = ∨[ π’ͺ X ]-right-monotone (⋁[ π’ͺ X ]-upper T j)

module BasicComplements (X : Locale 𝓀 π“₯ 𝓦) (π•œ : is-compact X holds) (zα΄° : zero-dimensionalα΄° (π’ͺ X)) where

 private
  ℬ : Fam 𝓦 ⟨ π’ͺ X ⟩
  ℬ = pr₁ zα΄°

 𝕣 : is-regular (π’ͺ X) holds
 𝕣 = zero-dimensional-locales-are-regular (π’ͺ X) ∣ zα΄° ∣

 Β¬β‚“_ : Ξ£ c κž‰ ⟨ π’ͺ X ⟩ , is-compact-open X c holds β†’ ⟨ π’ͺ X ⟩
 Β¬β‚“_ (c , ΞΊ) = pr₁ (compacts-are-clopen-in-regular-frames X 𝕣 c ΞΊ)

 Β¬β‚“-gives-complement : (c : ⟨ π’ͺ X ⟩)
                     β†’ (ΞΊ : is-compact-open X c holds)
                     β†’ is-boolean-complement-of (π’ͺ X) (Β¬β‚“ (c , ΞΊ)) c holds
 Β¬β‚“-gives-complement c ΞΊ = prβ‚‚ (compacts-are-clopen-in-regular-frames X 𝕣 c ΞΊ)

module SomeOtherLemmata
        (A   X               : Locale (𝓀 ⁺) 𝓀 𝓀)
        (Οƒα΄°                  : spectralα΄° A)
        (π•œ                   : is-compact X holds)
        (𝕫ᴰ                  : zero-dimensionalα΄° (π’ͺ X))
        (𝒻                   : X ─cβ†’ A)
        (f-is-a-spectral-map : is-spectral-map A X 𝒻 holds)
         where

 open BasicComplements X π•œ 𝕫ᴰ
 open ContinuousMapNotation X A

 ℬA : Fam 𝓀 ⟨ π’ͺ A ⟩
 ℬA = basisβ‚› A Οƒα΄°

 ℬX : Fam 𝓀 ⟨ π’ͺ X ⟩
 ℬX = pr₁ 𝕫ᴰ

 ¬𝒻 : index ℬA β†’ ⟨ π’ͺ X ⟩
 ¬𝒻 i = Β¬β‚“ (𝒻 β‹†βˆ™ (ℬA [ i ]) , ΞΊ)
         where
          ΞΊ : is-compact-open X (𝒻 β‹†βˆ™ (ℬA [ i ])) holds
          ΞΊ = f-is-a-spectral-map (ℬA [ i ]) (pr₁ (prβ‚‚ (prβ‚‚ Οƒα΄°)) i)


 -- ¬𝒻-lemma : (i : index ℬA) (ℬᡒ′ : ⟨ π’ͺ A ⟩)
 --         β†’ is-complement-of (π’ͺ A) ℬᡒ′ (ℬA [ i ])
 --         β†’ ¬𝒻 i = 𝒻 β‹†βˆ™ ℬᡒ′
 -- ¬𝒻-lemma i ℬᡒ′ (p , q) =
 --  complements-are-unique (π’ͺ X) (𝒻 β‹†βˆ™ (ℬA [ i ])) (¬𝒻 i) (𝒻 β‹†βˆ™ ℬᡒ′) † ‑
 --   where
 --   † : is-complement-of (π’ͺ X) (¬𝒻 i) (𝒻 β‹†βˆ™ (ℬA [ i ]))
 --   † = Β¬β‚“-gives-complement (𝒻 β‹†βˆ™ (ℬA [ i ])) {!!}

 --   ‑₁ : ℬᡒ′ ∧[ π’ͺ A ] (ℬA [ i ]) = 𝟎[ π’ͺ A ]
 --   ‑₁ = ℬᡒ′     ∧[ π’ͺ A ] (ℬA [ i ]) =⟨ ∧[ π’ͺ A ]-is-commutative ℬᡒ′ (ℬA [ i ]) ⟩
 --         ℬA [ i ] ∧[ π’ͺ A ] ℬᡒ′      =⟨ p                                     ⟩
 --         𝟎[ π’ͺ A ]                   ∎

 --   ‑₂ : ℬᡒ′ ∨[ π’ͺ A ] (ℬA [ i ]) = 𝟏[ π’ͺ A ]
 --   ‑₂ = ℬᡒ′ ∨[ π’ͺ A ] (ℬA [ i ])     =⟨ ∨[ π’ͺ A ]-is-commutative ℬᡒ′ (ℬA [ i ]) ⟩
 --         (ℬA [ i ]) ∨[ π’ͺ A ] ℬᡒ′    =⟨ q ⟩
 --         𝟏[ π’ͺ A ]                   ∎

 --   ‑ : is-complement-of (π’ͺ X) (𝒻 β‹†βˆ™ ℬᡒ′) (𝒻 β‹†βˆ™ (ℬA [ i ]))
 --   ‑ = frame-homomorphisms-preserve-complements (π’ͺ A) (π’ͺ X) 𝒻 (‑₁ , ‑₂)

 -- ¬𝒻-antitone : (i j : index ℬA)
 --             β†’ ((ℬA [ i ]) ≀[ poset-of (π’ͺ A) ] (ℬA [ j ])) holds
 --             β†’ (¬𝒻 j ≀[ poset-of (π’ͺ X) ] ¬𝒻 i) holds
 -- ¬𝒻-antitone i j p = {!!}
 --  where
 --   open PosetReasoning (poset-of (π’ͺ X))

 --   ♣ : ((¬𝒻 j ∧[ π’ͺ X ] 𝒻 β‹†βˆ™ (ℬA [ j ])) ≀[ poset-of (π’ͺ X) ] 𝟎[ π’ͺ X ]) holds
 --   ♣ = ¬𝒻 j ∧[ π’ͺ X ] 𝒻 β‹†βˆ™ (ℬA [ j ])                   β‰€βŸ¨ {!!} ⟩
 --       𝒻 β‹†βˆ™ (Β¬β‚“ (ℬA [ i ])) ∧[ π’ͺ X ] 𝒻 β‹†βˆ™ (ℬA [ j ])   β‰€βŸ¨ {!!} ⟩
 --       𝟎[ π’ͺ X ]                                        β– 

-- module Hauptsatz (X : Locale (𝓀 ⁺) 𝓀 𝓀) (Οƒ : is-spectral (π’ͺ X) holds) where

--  open PatchConstruction X Οƒ

--  hauptsatz₁ : (U : ⟨ π’ͺ X ⟩) (j k : ⟨ π’ͺ X ⟩ β†’ ⟨ π’ͺ X ⟩)
--             β†’ is-nucleus (π’ͺ X) j holds
--             β†’ is-nucleus (π’ͺ X) k holds
--             β†’ cofinal-in
--                (π’ͺ X)
--                ⁅ Ξ± U     ∣ Ξ± Ξ΅ 𝔑𝔦𝔯 (binary-family 𝓀 j k) ⁆
--                ⁅ Ξ± (j U) ∣ Ξ± Ξ΅ 𝔑𝔦𝔯 (binary-family 𝓀 j k) ⁆
--               holds
--  hauptsatz₁ U j k Ο† ψ is = ∣ is , † ∣
--   where
--    S : Fam 𝓀 (⟨ π’ͺ X ⟩ β†’ ⟨ π’ͺ X ⟩)
--    S = ⁅ j , k ⁆

--    both-j-and-k-are-prenuclei : (b : (πŸ™ + πŸ™))
--                               β†’ is-prenucleus (π’ͺ X) (⁅ j , k ⁆ [ b ]) holds
--    both-j-and-k-are-prenuclei (inl ⋆) = prβ‚‚ (nucleus-pre (π’ͺ X) (j , Ο†))
--    both-j-and-k-are-prenuclei (inr ⋆) = prβ‚‚ (nucleus-pre (π’ͺ X) (k , ψ))

--    † : ((𝔑𝔦𝔯 (binary-family 𝓀 j k) [ is ]) U
--          ≀[ poset-of (π’ͺ X) ]
--         (𝔑𝔦𝔯 (binary-family 𝓀 j k) [ is ]) (j U)) holds
--    † = prenuclei-are-monotone
--         (π’ͺ X)
--         ( 𝔑𝔦𝔯 (binary-family 𝓀 j k) [ is ]
--         , 𝔑𝔦𝔯-prenuclei (binary-family 𝓀 j k) both-j-and-k-are-prenuclei is)
--         (U , j U)
--         (𝓃₁ (π’ͺ X) (j , Ο†) U)

--  hauptsatzβ‚‚ : (U : ⟨ π’ͺ X ⟩) (j k : ⟨ π’ͺ X ⟩ β†’ ⟨ π’ͺ X ⟩)
--             β†’ is-nucleus (π’ͺ X) j holds
--             β†’ cofinal-in
--                (π’ͺ X)
--                ⁅ Ξ± (j U) ∣ Ξ± Ξ΅ 𝔑𝔦𝔯 (binary-family 𝓀 j k) ⁆
--                ⁅ Ξ± U     ∣ Ξ± Ξ΅ 𝔑𝔦𝔯 (binary-family 𝓀 j k) ⁆
--               holds
--  hauptsatzβ‚‚ U j k Ο† is = ∣ (inl ⋆ ∷ is) , † ∣
--   where
--    † : ((𝔑𝔦𝔯 (binary-family 𝓀 j k) [ is ]) (j U)
--          ≀[ poset-of (π’ͺ X) ]
--         ((𝔑𝔦𝔯 (binary-family 𝓀 j k) [ inl ⋆ ∷ is ]) U)) holds
--    † = ≀-is-reflexive (poset-of (π’ͺ X)) ((𝔑𝔦𝔯 (binary-family 𝓀 j k) [ is ]) (j U))

--  lemma₁ : (j k : ⟨ π’ͺ X ⟩ β†’ ⟨ π’ͺ X ⟩)
--         β†’ is-prenucleus (π’ͺ X) j holds
--         β†’ is-prenucleus (π’ͺ X) k holds
--         β†’ (j β‰Όβ‚€ (j ∘ k)) holds
--  lemma₁ j k (jn₁ , jnβ‚‚) (kn₁ , knβ‚‚) x =
--   prenuclei-are-monotone (π’ͺ X) (j , jn₁ , jnβ‚‚) (x , k x) (kn₁ x)

--  lemmaβ‚‚ : (j k : ⟨ π’ͺ X ⟩ β†’ ⟨ π’ͺ X ⟩)
--         β†’ is-prenucleus (π’ͺ X) j holds
--         β†’ is-prenucleus (π’ͺ X) k holds
--         β†’ (k β‰Όβ‚€ (j ∘ k)) holds
--  lemmaβ‚‚ j k (jn₁ , jnβ‚‚) (kn₁ , knβ‚‚) x = jn₁ (k x)

\end{code}

The following lemma was proved by Igor Arrieta for the purpose of solving the
binary join preservation problem that arose when proving the universal property
of Patch.

\begin{code}

module IgorsLemma (X Y : Locale (𝓀 ⁺) 𝓀 𝓀) (𝒷 : has-basis (π’ͺ Y) holds) where

 open ContinuousMapNotation X Y
 open HeytingImplicationConstruction Y 𝒷

 igors-lemma-β‡’ : (f : X ─cβ†’ Y) (U V : ⟨ π’ͺ Y ⟩) (W : ⟨ π’ͺ X ⟩)
               β†’ ((f β‹†βˆ™ U) ≀[ poset-of (π’ͺ X) ] (W ∨[ π’ͺ X ] (f β‹†βˆ™ V))) holds
               β†’ (T : ⟨ π’ͺ Y ⟩)
               β†’ ((f β‹†βˆ™ (U ∨[ π’ͺ Y ] T) ∧[ π’ͺ X ] (f β‹†βˆ™ (V ==> T)))
                  ≀[ poset-of (π’ͺ X) ]
                  (W ∨[ π’ͺ X ] f β‹†βˆ™ T))
                 holds
 igors-lemma-β‡’ f U V W p T =
  f β‹†βˆ™ (U ∨[ π’ͺ Y ] T) ∧[ π’ͺ X ] f β‹†βˆ™ (V ==> T)                                        =⟨ β…  βŸ©β‚š
  (f β‹†βˆ™ U ∨[ π’ͺ X ] f β‹†βˆ™ T) ∧[ π’ͺ X ] f β‹†βˆ™ (V ==> T)                                   β‰€βŸ¨ β…‘  ⟩
  ((W ∨[ π’ͺ X ] (f β‹†βˆ™ V)) ∨[ π’ͺ X ] f β‹†βˆ™ T) ∧[ π’ͺ X ] f β‹†βˆ™ (V ==> T)                    =⟨ β…’ βŸ©β‚š
  (W ∨[ π’ͺ X ] ((f β‹†βˆ™ V) ∨[ π’ͺ X ] f β‹†βˆ™ T)) ∧[ π’ͺ X ] f β‹†βˆ™ (V ==> T)                    =⟨ β…£ βŸ©β‚š
  (W ∨[ π’ͺ X ] (f β‹†βˆ™ (V ∨[ π’ͺ Y ] T))) ∧[ π’ͺ X ] f β‹†βˆ™ (V ==> T)                         =⟨ β…€ βŸ©β‚š
  f β‹†βˆ™ (V ==> T) ∧[ π’ͺ X ] (W ∨[ π’ͺ X ] (f β‹†βˆ™ (V ∨[ π’ͺ Y ] T)))                         =⟨ β…₯ βŸ©β‚š
  ((f β‹†βˆ™ (V ==> T)) ∧[ π’ͺ X ] W) ∨[ π’ͺ X ] (f β‹†βˆ™ (V ==> T) ∧[ π’ͺ X ] f β‹†βˆ™ (V ∨[ π’ͺ Y ] T)) β‰€βŸ¨ β…§ ⟩
  W ∨[ π’ͺ X ] (f β‹†βˆ™ (V ==> T) ∧[ π’ͺ X ] f β‹†βˆ™ (V ∨[ π’ͺ Y ] T))                           =⟨ β…¨ βŸ©β‚š
  W ∨[ π’ͺ X ] (f β‹†βˆ™ ((V ==> T) ∧[ π’ͺ Y ] (V ∨[ π’ͺ Y ] T)))                              =⟨ ♣ βŸ©β‚š
  W ∨[ π’ͺ X ] (f β‹†βˆ™ T)                                                                β– 
   where
    open PosetReasoning (poset-of (π’ͺ X))

    β…  = ap
         (Ξ» - β†’ - ∧[ π’ͺ X ] f β‹†βˆ™ (V ==> T))
         (frame-homomorphisms-preserve-binary-joins (π’ͺ Y) (π’ͺ X) f U T)
    β…‘ = ∧[ π’ͺ X ]-left-monotone (∨[ π’ͺ X ]-left-monotone p)
    β…’ = ap
         (Ξ» - β†’ - ∧[ π’ͺ X ] f β‹†βˆ™ (V ==> T))
         (∨[ π’ͺ X ]-assoc W (f β‹†βˆ™ V) (f β‹†βˆ™ T))
    β…£ = ap
         (Ξ» - β†’ (W ∨[ π’ͺ X ] -) ∧[ π’ͺ X ] (f β‹†βˆ™ (V ==> T)))
         (frame-homomorphisms-preserve-binary-joins (π’ͺ Y) (π’ͺ X) f V T ⁻¹)

    β…€ = ∧[ π’ͺ X ]-is-commutative
         (W ∨[ π’ͺ X ] (f β‹†βˆ™ (V ∨[ π’ͺ Y ] T)))
         (f β‹†βˆ™ (V ==> T))

    β…₯ = binary-distributivity (π’ͺ X) (f β‹†βˆ™ (V ==> T)) W (f β‹†βˆ™ (V ∨[ π’ͺ Y ] T))

    β…§ = ∨[ π’ͺ X ]-left-monotone (∧[ π’ͺ X ]-lowerβ‚‚ (f β‹†βˆ™ (V ==> T)) W)

    β…¨ = ap
         (Ξ» - β†’ W ∨[ π’ͺ X ] -)
         (frame-homomorphisms-preserve-meets (π’ͺ Y) (π’ͺ X) f (V ==> T) (V ∨[ π’ͺ Y ] T) ⁻¹)

    ♣₀ = f β‹†βˆ™ ((V ==> T) ∧[ π’ͺ Y ] (V ∨[ π’ͺ Y ] T))  =⟨ ap (Ξ» - β†’ f β‹†βˆ™ ((V ==> T) ∧[ π’ͺ Y ] -)) (∨[ π’ͺ Y ]-is-commutative V T) ⟩
         f β‹†βˆ™ ((V ==> T) ∧[ π’ͺ Y ] (T ∨[ π’ͺ Y ] V))  =⟨ ap (f β‹†βˆ™_) (∧[ π’ͺ Y ]-is-commutative (V ==> T) (T ∨[ π’ͺ Y ] V)) ⟩
         f β‹†βˆ™ ((T ∨[ π’ͺ Y ] V) ∧[ π’ͺ Y ]  (V ==> T)) =⟨ ap (f β‹†βˆ™_) (Hβ‚ˆ T V ⁻¹) ⟩
         (f β‹†βˆ™ T) ∎

    ♣ = ap (Ξ» - β†’ W ∨[ π’ͺ X ] -) ♣₀

 igors-lemma-⇐ : (f : X ─cβ†’ Y) (U V : ⟨ π’ͺ Y ⟩) (W : ⟨ π’ͺ X ⟩)
               β†’ ((T : ⟨ π’ͺ Y ⟩)
                  β†’ ((f β‹†βˆ™ (U ∨[ π’ͺ Y ] T) ∧[ π’ͺ X ] (f β‹†βˆ™ (V ==> T)))
                      ≀[ poset-of (π’ͺ X) ]
                     (W ∨[ π’ͺ X ] f β‹†βˆ™ T)) holds)
               β†’ ((f β‹†βˆ™ U) ≀[ poset-of (π’ͺ X) ] (W ∨[ π’ͺ X ] (f β‹†βˆ™ V))) holds
 igors-lemma-⇐ f U V W Ο† =
  f β‹†βˆ™ U                           β‰€βŸ¨ I  ⟩
  W ∨[ π’ͺ X ] f β‹†βˆ™ (U ∧[ π’ͺ Y ] V)   β‰€βŸ¨ II ⟩
  W ∨[ π’ͺ X ] f β‹†βˆ™ V                β– 
   where
    open PosetReasoning (poset-of (π’ͺ X))

    ♣ : ((f β‹†βˆ™ (U ∨[ π’ͺ Y ] (V ∧[ π’ͺ Y ] U)) ∧[ π’ͺ X ] f β‹†βˆ™ (V ==> (V ∧[ π’ͺ Y ] U)))
            ≀[ poset-of (π’ͺ X) ]
           (W ∨[ π’ͺ X ] f β‹†βˆ™ (V ∧[ π’ͺ Y ] U))) holds
    ♣ = Ο† (V ∧[ π’ͺ Y ] U)

    II : ((W ∨[ π’ͺ X ] (f β‹†βˆ™ (U ∧[ π’ͺ Y ] V)))
           ≀[ poset-of (π’ͺ X) ]
          (W ∨[ π’ͺ X ] f β‹†βˆ™ V)) holds
    II = ∨[ π’ͺ X ]-right-monotone
          (frame-morphisms-are-monotonic
            (π’ͺ Y)
            (π’ͺ X)
            (f .pr₁)
            (f .prβ‚‚)
            (_ , _)
            (∧[ π’ͺ Y ]-lowerβ‚‚ U V))

    I : ((f β‹†βˆ™ U) ≀[ poset-of (π’ͺ X) ] (W ∨[ π’ͺ X ] f β‹†βˆ™ (U ∧[ π’ͺ Y ] V))) holds
    I =
     f β‹†βˆ™ U                                                                  β‰€βŸ¨ 𝕒 ⟩
     f β‹†βˆ™ (U ∧[ π’ͺ Y ] (V ==> U))                                             =⟨ 𝕓 βŸ©β‚š
     (f β‹†βˆ™ U) ∧[ π’ͺ X ] (f β‹†βˆ™ (V ==> U))                                      =⟨ 𝕔 βŸ©β‚š
     (f β‹†βˆ™ U) ∧[ π’ͺ X ] (f β‹†βˆ™ (V ==> (V ∧[ π’ͺ Y ] U)))                         β‰€βŸ¨ 𝕕 ⟩
     f β‹†βˆ™ (U ∨[ π’ͺ Y ] (V ∧[ π’ͺ Y ] U)) ∧[ π’ͺ X ] f β‹†βˆ™ (V ==> (V ∧[ π’ͺ Y ] U))   β‰€βŸ¨ 𝕖 ⟩
     W ∨[ π’ͺ X ] f β‹†βˆ™ (V ∧[ π’ͺ Y ] U)                                          =⟨ 𝕗 βŸ©β‚š
     W ∨[ π’ͺ X ] f β‹†βˆ™ (U ∧[ π’ͺ Y ] V)                                          β– 
      where
       𝕒 = frame-morphisms-are-monotonic
            (π’ͺ Y)
            (π’ͺ X)
            (f .pr₁)
            (f .prβ‚‚)
            (_ , _)
            (∧[ π’ͺ Y ]-greatest _ _ _
              (≀-is-reflexive (poset-of (π’ͺ Y)) U) (weakening V U))
       𝕓 = frame-homomorphisms-preserve-meets (π’ͺ Y) (π’ͺ X) f U (V ==> U)
       𝕔 = ap (Ξ» - β†’ f β‹†βˆ™ U ∧[ π’ͺ X ] (f β‹†βˆ™ -)) (heyting-implication-lawβ‚„ V U)
       𝕕 = ∧[ π’ͺ X ]-left-monotone
            (frame-morphisms-are-monotonic
              (π’ͺ Y)
              (π’ͺ X)
              (f .pr₁)
              (f .prβ‚‚)
              (_ , _)
              (∨[ π’ͺ Y ]-upper₁ U (V ∧[ π’ͺ Y ] U)))
       𝕖 = ♣
       𝕗 = ap (Ξ» - β†’ W ∨[ π’ͺ X ] (f β‹†βˆ™ -)) (∧[ π’ͺ Y ]-is-commutative V U)

\end{code}