Ayberk Tosun, 19 August 2023

The module contains the definitions of

  (1) a compact open of a locale, and
  (2) a compact locale.

These used to live in the `CompactRegular` module which is now deprecated and
will be broken down into smaller modules.

\begin{code}[hide]

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

open import MLTT.Spartan hiding (J)
open import UF.Base
open import UF.Classifiers
open import UF.FunExt
open import UF.PropTrunc
open import UF.Sets
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.Subsingletons-Properties
open import UF.SubtypeClassifier

module Locales.Compactness.Definition
        (pt : propositional-truncations-exist)
        (fe : Fun-Ext)
       where

open import Fin.Kuratowski pt
open import Fin.Type
open import Locales.Frame     pt fe
open import Locales.WayBelowRelation.Definition  pt fe
open import MLTT.List using (member; []; _∷_; List; in-head; in-tail; length)
open import Slice.Family
open import Taboos.FiniteSubsetTaboo pt fe
open import UF.Equiv hiding (_β– )
open import UF.EquivalenceExamples
open import UF.ImageAndSurjection pt
open import UF.Logic
open import UF.Powerset-Fin pt
open import UF.Powerset-MultiUniverse
open import UF.Sets-Properties

open PropositionalTruncation pt
open AllCombinators pt fe

open Locale

\end{code}

An open `U : π’ͺ(X)` of a locale `X` is called compact if it is way below itself.

\begin{code}

is-compact-open : (X : Locale 𝓀 π“₯ 𝓦) β†’ ⟨ π’ͺ X ⟩ β†’ Ξ© (𝓀 βŠ” π“₯ βŠ” 𝓦 ⁺)
is-compact-open X U = U β‰ͺ[ π’ͺ X ] U

\end{code}

A locale `X` is called compact if its top element `𝟏` is compact.

\begin{code}

is-compact : Locale 𝓀 π“₯ 𝓦 β†’ Ξ© (𝓀 βŠ” π“₯ βŠ” 𝓦 ⁺)
is-compact X = is-compact-open X 𝟏[ π’ͺ X ]

\end{code}

We also define the type `𝒦 X` expressing the type of compact opens of a locale
`X`.

\begin{code}

𝒦 : Locale 𝓀 π“₯ 𝓦 β†’ 𝓀 βŠ” π“₯ βŠ” 𝓦 ⁺  Μ‡
𝒦 X = Ξ£ U κž‰ ⟨ π’ͺ X ⟩ , is-compact-open X U holds

𝒦-is-set : (X : Locale 𝓀 π“₯ 𝓦) β†’ is-set (𝒦 X)
𝒦-is-set X {(K₁ , κ₁)} {(Kβ‚‚ , ΞΊβ‚‚)} =
 Ξ£-is-set
  carrier-of-[ poset-of (π’ͺ X) ]-is-set
  (Ξ» U β†’ props-are-sets (holds-is-prop (is-compact-open X U)))

to-𝒦-= : (X : Locale 𝓀 π“₯ 𝓦) {K₁ Kβ‚‚ : ⟨ π’ͺ X ⟩}
        β†’ (κ₁ : is-compact-open X K₁ holds)
        β†’ (ΞΊβ‚‚ : is-compact-open X Kβ‚‚ holds)
        β†’ K₁ = Kβ‚‚
        β†’ (K₁ , κ₁) = (Kβ‚‚ , ΞΊβ‚‚)
to-𝒦-= X κ₁ ΞΊβ‚‚ = to-subtype-= (holds-is-prop ∘ is-compact-open X)

\end{code}

Using this, we could define a family giving the compact opens of a locale `X`:

\begin{code}

ℬ-compact : (X : Locale 𝓀 π“₯ 𝓦) β†’ Fam (𝓀 βŠ” π“₯ βŠ” 𝓦 ⁺) ⟨ π’ͺ X ⟩
ℬ-compact X = 𝒦 X , pr₁

\end{code}

but the index of this family lives in `𝓀 βŠ” π“₯ βŠ” 𝓦 ⁺`. This is to say that, if one
starts with a large and locally small locale, the resulting family would live in
`𝓀 ⁺` which means it would be *too big*.

\begin{code}

ℬ-compactβ‚€ : (X : Locale (𝓀 ⁺) 𝓀 𝓀) β†’ Fam (𝓀 ⁺) ⟨ π’ͺ X ⟩
ℬ-compactβ‚€ = ℬ-compact

\end{code}

\section{Properties of compactness}

\begin{code}

𝟎-is-compact : (X : Locale 𝓀 π“₯ 𝓦) β†’ is-compact-open X 𝟎[ π’ͺ X ] holds
𝟎-is-compact X S (∣i∣ , _) p = βˆ₯βˆ₯-rec βˆƒ-is-prop † ∣i∣
 where
  † : index S β†’ βˆƒ i κž‰ index S , (𝟎[ π’ͺ X ] ≀[ poset-of (π’ͺ X) ] S [ i ]) holds
  † i = ∣ i , 𝟎-is-bottom (π’ͺ X) (S [ i ]) ∣

πŸŽβ‚–[_] : (X : Locale 𝓀 π“₯ 𝓦) β†’ 𝒦 X
πŸŽβ‚–[_] X = 𝟎[ π’ͺ X ] , 𝟎-is-compact X

\end{code}

The binary join of two compact opens is compact.

\begin{code}

compact-opens-are-closed-under-∨ : (X : Locale 𝓀 π“₯ 𝓦) (K₁ Kβ‚‚ : ⟨ π’ͺ X ⟩)
                                 β†’ is-compact-open X K₁ holds
                                 β†’ is-compact-open X Kβ‚‚ holds
                                 β†’ is-compact-open X (K₁ ∨[ π’ͺ X ] Kβ‚‚) holds
compact-opens-are-closed-under-∨ X U V κ₁ ΞΊβ‚‚ S Ξ΄ p =
 βˆ₯βˆ₯-recβ‚‚ βˆƒ-is-prop † (κ₁ S Ξ΄ Ο†) (ΞΊβ‚‚ S Ξ΄ ψ)
  where
   open PosetNotation  (poset-of (π’ͺ X)) using (_≀_)
   open PosetReasoning (poset-of (π’ͺ X))

   † : Ξ£ i₁ κž‰ index S , (U ≀[ poset-of (π’ͺ X) ] S [ i₁ ]) holds
     β†’ Ξ£ iβ‚‚ κž‰ index S , (V ≀[ poset-of (π’ͺ X) ] S [ iβ‚‚ ]) holds
     β†’ βˆƒ i₃ κž‰ index S  , ((U ∨[ π’ͺ X ] V) ≀ S [ i₃ ]) holds
   † (i₁ , p₁) (iβ‚‚ , pβ‚‚) = βˆ₯βˆ₯-rec βˆƒ-is-prop ‑ (prβ‚‚ Ξ΄ i₁ iβ‚‚)
    where
     ‑ : Ξ£ i₃ κž‰ index S , (S [ i₁ ] ≀ S [ i₃ ]) holds
                        Γ— (S [ iβ‚‚ ] ≀ S [ i₃ ]) holds
       β†’ βˆƒ i₃ κž‰ index S  , ((U ∨[ π’ͺ X ] V) ≀ S [ i₃ ]) holds
     ‑ (i₃ , q , r) = ∣ i₃ , ∨[ π’ͺ X ]-least β™  ♣ ∣
      where
       β™  : (U ≀[ poset-of (π’ͺ X) ] (S [ i₃ ])) holds
       β™  = U β‰€βŸ¨ p₁ ⟩ S [ i₁ ] β‰€βŸ¨ q ⟩ S [ i₃ ] β– 

       ♣ : (V ≀[ poset-of (π’ͺ X) ] (S [ i₃ ])) holds
       ♣ = V β‰€βŸ¨ pβ‚‚ ⟩ S [ iβ‚‚ ] β‰€βŸ¨ r ⟩ S [ i₃ ] β– 

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

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

\end{code}