---
title: The discrete locale
author: Ayberk Tosun
date-started: 2024-03-04
date-completed: 2024-03-04
---
We define the discrete locale (i.e. the frame of opens of the discrete topology)
over a set `X`.
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import UF.PropTrunc
open import UF.FunExt
open import UF.Subsingletons
module Locales.DiscreteLocale.Definition
(fe : Fun-Ext)
(pe : Prop-Ext)
(pt : propositional-truncations-exist)
where
open import Locales.Frame pt fe
open import MLTT.Spartan
open import Slice.Family
open import UF.Logic
open import UF.Sets
open import UF.Powerset
open import UF.SubtypeClassifier
open AllCombinators pt fe renaming (_∧_ to _∧ₚ_; _∨_ to _∨ₚ_)
open PropositionalSubsetInclusionNotation fe
open PropositionalTruncation pt hiding (_∨_)
\end{code}
We work with a fixed set `X` in this module.
\begin{code}
module DefnOfDiscreteLocale (X : 𝓤 ̇ ) (σ : is-set X) where
\end{code}
We start by writing down the poset of subsets of `X`.
\begin{code}
_⊆ᵖ_ : 𝓟 X → 𝓟 X → Ω 𝓤
P ⊆ᵖ Q = P ⊆ₚ Q
infix 30 _⊆ᵖ_
⊆-partial-order : is-partial-order (𝓟 X) _⊆ₚ_
⊆-partial-order = (⊆-refl , ⊆-trans') , subset-extensionality pe fe
poset-of-subsets : Poset (𝓤 ⁺) 𝓤
poset-of-subsets = 𝓟 X
, _⊆ₚ_
, (⊆-refl , ⊆-trans')
, subset-extensionality pe fe
\end{code}
The top element is the full subset, denoted `full`.
\begin{code}
full-is-top : (P : 𝓟 X) → (P ⊆ₚ full) holds
full-is-top I x = λ _ → ⋆
\end{code}
Binary meets are set intersection.
\begin{code}
open Meets _⊆ᵖ_
∩-gives-glb : ((P , Q) : 𝓟 X × 𝓟 X) → ((P ∩ Q) is-glb-of (P , Q)) holds
∩-gives-glb (P , Q) = ((λ _ → pr₁) , (λ _ → pr₂))
, λ (_ , φ , ψ) x r → φ x r , ψ x r
\end{code}
Small joins are given by set union, defined as:
\begin{code}
⋁ₚ_ : Fam 𝓤 (𝓟 X) → 𝓟 X
⋁ₚ S = λ x → Ǝ k ꞉ index S , x ∈ (S [ k ])
infix 32 ⋁ₚ_
open Joins _⊆ᵖ_
⋁ₚ-gives-an-upper-bound : (S : Fam 𝓤 (𝓟 X))
→ ((⋁ₚ S) is-an-upper-bound-of S) holds
⋁ₚ-gives-an-upper-bound S i _ μ = ∣ i , μ ∣
⋁ₚ-is-least : (S : Fam 𝓤 (𝓟 X)) (U : 𝓟 X)
→ (U is-an-upper-bound-of S) holds
→ (⋁ₚ S) ⊆ U
⋁ₚ-is-least S U υ x = ∥∥-rec (holds-is-prop (x ∈ₚ U)) †
where
† : Σ i ꞉ index S , x ∈ (S [ i ]) → U x holds
† (i , μ) = υ i x μ
⋁ₚ-gives-lub : (S : Fam 𝓤 (𝓟 X)) → ((⋁ₚ S) is-lub-of S) holds
⋁ₚ-gives-lub S = ⋁ₚ-gives-an-upper-bound S
, λ { (U , υ) → ⋁ₚ-is-least S U υ}
\end{code}
Finally, the distributivity law.
\begin{code}
distributivityₚ : (P : 𝓟 X) (S : Fam 𝓤 (𝓟 X))
→ P ∩ (⋁ₚ S) = ⋁ₚ ⁅ P ∩ Q ∣ Q ε S ⁆
distributivityₚ P S = subset-extensionality pe fe † ‡
where
† : (P ∩ ⋁ₚ S) ⊆ᵖ ⋁ₚ ⁅ P ∩ Q ∣ Q ε S ⁆ holds
† x (p , e) = ∥∥-rec ∥∥-is-prop (λ { (i , q) → ∣ i , (p , q) ∣}) e
‡ : ⋁ₚ ⁅ P ∩ Q ∣ Q ε S ⁆ ⊆ᵖ (P ∩ ⋁ₚ S) holds
‡ x = ∥∥-rec (holds-is-prop (x ∈ₚ (P ∩ ⋁ₚ S))) γ
where
γ : Σ i ꞉ index S , x ∈ (P ∩ (S [ i ])) → x ∈ (P ∩ (⋁ₚ S))
γ (i , p , q) = p , ∣ i , q ∣
\end{code}
We package these up into a frame that we call `frame-of-subsets`.
\begin{code}
frame-of-subsets-structure : frame-structure 𝓤 𝓤 (𝓟 X)
frame-of-subsets-structure = (_⊆ₚ_ , full , _∩_ , ⋁ₚ_)
, ⊆-partial-order
, full-is-top
, ∩-gives-glb
, ⋁ₚ-gives-lub
, λ (P , Q) → distributivityₚ P Q
frame-of-subsets : Frame (𝓤 ⁺) 𝓤 𝓤
frame-of-subsets = 𝓟 X , frame-of-subsets-structure
\end{code}
The discrete locale on set `X` is the locale given by the frame of subsets of
`X`.
\begin{code}
discrete-locale : (X : 𝓤 ̇ ) → is-set X → Locale (𝓤 ⁺) 𝓤 𝓤
discrete-locale X σ =
record
{ ⟨_⟩ₗ = 𝓟 X
; frame-str-of = DefnOfDiscreteLocale.frame-of-subsets-structure X σ
}
\end{code}