--- title: Construction of a basis for the discrete locale author: Ayberk Tosun date-started: 2024-09-13 date-completed: 2024-09-17 --- \begin{code} {-# OPTIONS --safe --without-K #-} open import UF.FunExt open import UF.PropTrunc open import UF.Size open import UF.Subsingletons module Locales.DiscreteLocale.Basis (fe : Fun-Ext) (pe : Prop-Ext) (pt : propositional-truncations-exist) (sr : Set-Replacement pt) where open import Locales.DiscreteLocale.Definition fe pe pt open import Locales.Frame pt fe hiding (∅) open import Locales.SmallBasis pt fe sr open import MLTT.List hiding ([_]) open import MLTT.Spartan open import Slice.Family open import UF.Logic open import UF.Powerset open import UF.Sets open import UF.SubtypeClassifier open AllCombinators pt fe renaming (_∧_ to _∧ₚ_; _∨_ to _∨ₚ_) open PropositionalSubsetInclusionNotation fe open PropositionalTruncation pt hiding (_∨_) \end{code} We work in a module parameterized by a set `X`. \begin{code} module basis-for-the-discrete-locale (X : 𝓤 ̇) (σ : is-set X) where open binary-unions-of-subsets pt open singleton-subsets σ open DefnOfDiscreteLocale X σ 𝓟-Frm : Frame (𝓤 ⁺) 𝓤 𝓤 𝓟-Frm = frame-of-subsets \end{code} We define the function `finite-union` that gives the subset corresponding to membership in a list. \begin{code} finite-join : List X → 𝓟 X finite-join [] = ∅ finite-join (x ∷ xs) = ❴ x ❵ ∪ finite-join xs \end{code} This maps the concatenation operator `_++_` to binary union `_∪_`. \begin{code} finite-join-is-homomorphic : (xs ys : List X) → finite-join (xs ++ ys) = finite-join xs ∪ finite-join ys finite-join-is-homomorphic [] ys = finite-join ys =⟨ † ⟩ ∅ ∪ finite-join ys ∎ where † = ∅-left-neutral-for-∪ pe fe (finite-join ys) ⁻¹ finite-join-is-homomorphic (x ∷ xs) ys = finite-join ((x ∷ xs) ++ ys) =⟨ refl ⟩ finite-join (x ∷ xs ++ ys) =⟨ refl ⟩ ❴ x ❵ ∪ finite-join (xs ++ ys) =⟨ Ⅰ ⟩ ❴ x ❵ ∪ (finite-join xs ∪ finite-join ys) =⟨ Ⅱ ⟩ (❴ x ❵ ∪ finite-join xs) ∪ finite-join ys =⟨ refl ⟩ finite-join (x ∷ xs) ∪ finite-join ys ∎ where IH = finite-join-is-homomorphic xs ys Ⅰ = ap (λ - → ❴ x ❵ ∪ -) IH Ⅱ = ∪-assoc pe fe ❴ x ❵ (finite-join xs) (finite-join ys) ⁻¹ \end{code} Given a subset `S ⊆ 𝓟 X`, the index of the basic covering family for it is the type of lists whose finite join is included in `S`: \begin{code} Basic-Cover-Index : 𝓟 X → 𝓤 ̇ Basic-Cover-Index S = Σ xs ꞉ List X , finite-join xs ⊆ S \end{code} Using this, we define the covering families: \begin{code} lists-within : 𝓟 X → Fam 𝓤 (List X) lists-within S = Basic-Cover-Index S , pr₁ \end{code} It is easy to see that these covering families are directed: \begin{code} lists-within-is-directed : (S : 𝓟 X) → is-directed 𝓟-Frm ⁅ finite-join xs ∣ xs ε lists-within S ⁆ holds lists-within-is-directed S = ι , υ where open PosetReasoning (poset-of 𝓟-Frm) ι : ∥ Basic-Cover-Index S ∥ ι = ∣ [] , ∅-is-least S ∣ υ : ((xs , _) (ys , _) : Basic-Cover-Index S) → ∃ (zs , _) ꞉ Basic-Cover-Index S , finite-join xs ⊆ finite-join zs × finite-join ys ⊆ finite-join zs υ (xs , p) (ys , q) = ∣ ((xs ++ ys) , †) , φ , ψ ∣ where ‡ = ∪-is-lowerbound-of-upperbounds (finite-join xs) (finite-join ys) S p q † : finite-join (xs ++ ys) ⊆ S † = transport (λ - → - ⊆ S) (finite-join-is-homomorphic xs ys ⁻¹) ‡ φ : finite-join xs ⊆ finite-join (xs ++ ys) φ = transport (λ - → finite-join xs ⊆ -) (finite-join-is-homomorphic xs ys ⁻¹) (∪-is-upperbound₁ (finite-join xs) (finite-join ys)) ψ : finite-join ys ⊆ finite-join (xs ++ ys) ψ = transport (λ - → finite-join ys ⊆ -) (finite-join-is-homomorphic xs ys ⁻¹) (∪-is-upperbound₂ (finite-join xs) (finite-join ys)) \end{code} We conclude that the family `finite-join : List X → 𝓟(X)` forms a directed basis. \begin{code} list-forms-directed-basis : directed-basis-forᴰ 𝓟-Frm (List X , finite-join) list-forms-directed-basis S = lists-within S , γ , lists-within-is-directed S where open Joins (λ S T → S ≤[ poset-of 𝓟-Frm ] T) †₁ : S ⊆ (⋁[ 𝓟-Frm ] ⁅ finite-join xs ∣ xs ε lists-within S ⁆) †₁ x μ = ⋁[ 𝓟-Frm ]-upper ⁅ finite-join xs ∣ xs ε lists-within S ⁆ ((x ∷ []) , φ) x ∣ inl refl ∣ where φ : finite-join (x ∷ []) ⊆ S φ y p = transport (λ - → - ∈ S) q μ where q : y ∈ ❴ x ❵ q = transport (λ - → y ∈ -) (∅-right-neutral-for-∪ pe fe ❴ x ❵ ⁻¹) p †₂ : (⋁[ 𝓟-Frm ] ⁅ finite-join xs ∣ xs ε lists-within S ⁆) ⊆ S †₂ = ⋁[ 𝓟-Frm ]-least ⁅ finite-join xs ∣ xs ε lists-within S ⁆ (S , γ) where γ : (S is-an-upper-bound-of ⁅ finite-join xs ∣ xs ε lists-within S ⁆) holds γ (xs , p) = p † : S = ⋁[ 𝓟-Frm ] ⁅ finite-join xs ∣ xs ε lists-within S ⁆ † = ≤-is-antisymmetric (poset-of 𝓟-Frm) †₁ †₂ γ : (S is-lub-of ⁅ finite-join xs ∣ xs ε lists-within S ⁆) holds γ = transport (λ - → (- is-lub-of ⁅ finite-join xs ∣ xs ε lists-within S ⁆) holds) († ⁻¹) (⋁[ 𝓟-Frm ]-upper ⁅ finite-join xs ∣ xs ε lists-within S ⁆ , ⋁[ 𝓟-Frm ]-least ⁅ finite-join xs ∣ xs ε lists-within S ⁆) \end{code}