---
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}