Ayberk Tosun, 10 March 2021.

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

\begin{code}[hide]

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

open import MLTT.Spartan hiding (๐Ÿš)
open import UF.FunExt
open import UF.PropTrunc

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

open import Locales.ContinuousMap.FrameHomomorphism-Definition pt fe
open import Locales.ContinuousMap.FrameHomomorphism-Properties pt fe
open import Locales.Frame pt fe
open import Slice.Family
open import UF.Logic
open import UF.Sets
open import UF.Subsingletons
open import UF.SubtypeClassifier

open AllCombinators pt fe

\end{code}

\section{The underlying poset}

We start with the partial ordering on `ฮฉ`:

\begin{code}

_โŠ‘_ : ฮฉ ๐“ฅ โ†’ ฮฉ ๐“ฆ โ†’ ฮฉ (๐“ฅ โŠ” ๐“ฆ)
P โŠ‘ Q = P โ‡’ Q

โŠ‘-is-reflexive : is-reflexive {A = ฮฉ ๐“ค} _โŠ‘_ holds
โŠ‘-is-reflexive P = id

โŠ‘-is-transitive : is-transitive {A = ฮฉ ๐“ค} _โŠ‘_ holds
โŠ‘-is-transitive _ _ _ p q = q โˆ˜ p

โŠ‘-is-antisymmetric : {๐“ค : Universe} โ†’ propext ๐“ค โ†’ is-antisymmetric {A = ฮฉ ๐“ค} _โŠ‘_
โŠ‘-is-antisymmetric pe {P} {Q} ฯ† ฯˆ = ฮฉ-ext pe fe โ€  โ€ก
 where
  โ€  : P ๏ผ โŠค โ†’ Q ๏ผ โŠค
  โ€  = holds-gives-equal-โŠค pe fe Q โˆ˜ ฯ† โˆ˜ equal-โŠค-gives-true (P holds) (holds-is-prop P)

  โ€ก : Q ๏ผ โŠค โ†’ P ๏ผ โŠค
  โ€ก = holds-gives-equal-โŠค pe fe P โˆ˜ ฯˆ โˆ˜ equal-โŠค-gives-true (Q holds) (holds-is-prop Q)

โŠ‘-is-partial-order : {๐“ค : Universe} โ†’ propext ๐“ค โ†’ is-partial-order (ฮฉ ๐“ค) _โŠ‘_
โŠ‘-is-partial-order pe =
 (โŠ‘-is-reflexive , โŠ‘-is-transitive) , โŠ‘-is-antisymmetric pe

\end{code}

This gives us a poset structure at universe ๐“ค:

\begin{code}

๐ŸŽF-poset-str : {๐“ค : Universe} โ†’ propext ๐“ค โ†’ poset-structure ๐“ค (ฮฉ ๐“ค)
๐ŸŽF-poset-str pe = _โŠ‘_
                , (โŠ‘-is-reflexive , โŠ‘-is-transitive)
                , โŠ‘-is-antisymmetric pe

๐ŸŽF-poset : {๐“ค : Universe} โ†’ propext ๐“ค โ†’ Poset (๐“ค โบ) ๐“ค
๐ŸŽF-poset {๐“ค = ๐“ค} pe = ฮฉ ๐“ค , ๐ŸŽF-poset-str pe

\end{code}

\section{Definition of the initial frame}

\begin{code}

open propositional-truncations-exist pt

๐ŸŽ-๐”ฝ๐•ฃ๐•ž : {๐“ค : Universe} โ†’ propext ๐“ค โ†’ Frame (๐“ค โบ) ๐“ค ๐“ค
๐ŸŽ-๐”ฝ๐•ฃ๐•ž {๐“ค = ๐“ค} pe = ฮฉ ๐“ค , (_โŠ‘_ , โŠค {๐“ค} , _โˆง_ , โ‹_)
      , โŠ‘-is-partial-order pe , top , meet , join , dist
 where
  โ‹_ : Fam ๐“ค (ฮฉ ๐“ค) โ†’ ฮฉ ๐“ค
  โ‹ U = ฦŽ i ๊ž‰ index U , ((U [ i ]) holds)

  open Meets _โŠ‘_ renaming (is-top to is-the-top)

  top : is-the-top (โŠค {๐“ค}) holds
  top _ _ = โ‹†

  meet : (โฑฏ (P , Q) , (P โˆง Q) is-glb-of (P , Q)) holds
  meet (P , Q) = ฮฒ , ฮณ
   where
    ฮฒ : ((P โˆง Q) is-a-lower-bound-of (P , Q)) holds
    ฮฒ = prโ‚ , prโ‚‚

    ฮณ : (โฑฏ (R , _) ๊ž‰ lower-bound (P , Q ) , R โŠ‘ (P โˆง Q)) holds
    ฮณ (R , ฯ• , ฯˆ) r = ฯ• r , ฯˆ r

  open Joins        _โŠ‘_
  open JoinNotation โ‹_

  join : (โฑฏ U ๊ž‰ Fam ๐“ค (ฮฉ ๐“ค) , ((โ‹ U) is-lub-of U)) holds
  join U = (ฮป i u โ†’ โˆฃ i , u โˆฃ) , ฮณ
   where
    ฮณ : (โฑฏ (P , _) ๊ž‰ upper-bound U , (โ‹ U) โŠ‘ P) holds
    ฮณ ((A , A-prop) , q) r = โˆฅโˆฅ-rec A-prop (uncurry q) r

  abstract
   iss : is-set (ฮฉ ๐“ค)
   iss = carrier-of-[ ๐ŸŽF-poset pe ]-is-set

   dist : (โฑฏ(P , U) ๊ž‰ ฮฉ ๐“ค ร— Fam ๐“ค (ฮฉ ๐“ค) ,
           (P โˆง (โ‹ U) ๏ผ[ iss ]๏ผ  โ‹โŸจ i โŸฉ P โˆง U [ i ])) holds
   dist (P , U) = โ‰ค-is-antisymmetric (๐ŸŽF-poset pe) ฮฒ ฮณ
    where
     ฮฒ : (P โˆง โ‹ U โ‡’ (โ‹โŸจ i โŸฉ (P โˆง U [ i ]))) holds
     ฮฒ (p , u) = โˆฅโˆฅ-rec (holds-is-prop (โ‹โŸจ i โŸฉ (P โˆง U [ i ]))) ฮฑ u
      where
       ฮฑ : ฮฃ i ๊ž‰ index U , (U [ i ]) holds โ†’ (โ‹โŸจ i โŸฉ P โˆง U [ i ]) holds
       ฮฑ (i , uแตข) = โˆฃ i , p , uแตข โˆฃ

     ฮณ : ((โ‹โŸจ i โŸฉ P โˆง U [ i ]) โ‡’ P โˆง โ‹ U) holds
     ฮณ p = โˆฅโˆฅ-rec (holds-is-prop (P โˆง (โ‹ U))) ฮด p
      where
       ฮด : Sigma (index (index U , (ฮป i โ†’ P โˆง U [ i ])))
             (ฮป i โ†’ ((index U , (ฮป iโ‚ โ†’ P โˆง U [ iโ‚ ])) [ i ]) holds) โ†’
             (P โˆง (โ‹ U)) holds
       ฮด (i , q , uแตข) = q , โˆฃ i , uแตข โˆฃ

\end{code}

\begin{code}
๐ŸŽ-of-IF-is-โŠฅ : {๐“ฆ : Universe} โ†’ (pe : propext ๐“ฆ) โ†’ ๐ŸŽ[ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe ] ๏ผ โŠฅ
๐ŸŽ-of-IF-is-โŠฅ pe =
 โ‰ค-is-antisymmetric (poset-of (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe)) ฮณ ฮป ()
 where
  ฮณ : (๐ŸŽ[ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe ] โ‰ค[ poset-of (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe) ]  โŠฅ) holds
  ฮณ x = โˆฅโˆฅ-rec ๐Ÿ˜-is-prop (ฮป ()) x
\end{code}

\section{Proof of initiality}

\begin{code}

f : {๐“ฆ : Universe} โ†’ (pe : propext ๐“ฆ) โ†’ (A : Frame ๐“ค ๐“ฅ ๐“ฆ) โ†’ โŸจ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe โŸฉ โ†’ โŸจ A โŸฉ
f pe A P = โ‹[ A ] โ… ๐Ÿ[ A ] โˆฃ x โˆถ P holds โ†

\end{code}

\begin{code}

f-respects-โŠค : {๐“ฆ : Universe} (pe : propext ๐“ฆ) (A : Frame ๐“ค ๐“ฅ ๐“ฆ)
             โ†’ f pe A ๐Ÿ[ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe ] ๏ผ ๐Ÿ[ A ]
f-respects-โŠค pe A = โ‰ค-is-antisymmetric (poset-of A) ฮฑ ฮฒ
 where
  open PosetNotation (poset-of A) renaming (_โ‰ค_ to _โ‰คA_)

  ฮฑ : (f pe A ๐Ÿ[ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe ] โ‰คA ๐Ÿ[ A ]) holds
  ฮฑ = ๐Ÿ-is-top A (f pe A ๐Ÿ[ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe ])

  ฮฒ : (๐Ÿ[ A ] โ‰คA f pe A ๐Ÿ[ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe ]) holds
  ฮฒ = โ‹[ A ]-upper (โ… ๐Ÿ[ A ] โˆฃ x โˆถ โŠค holds โ†) โ‹†

\end{code}

\begin{code}

f-respects-โˆง : {๐“ฆ : Universe} (pe : propext ๐“ฆ)
             โ†’ (A : Frame ๐“ค ๐“ฅ ๐“ฆ)
             โ†’ (P Q : ฮฉ ๐“ฆ)
             โ†’ f pe A (P โˆง Q) ๏ผ (f pe A P) โˆง[ A ] (f pe A Q)
f-respects-โˆง pe A P Q =
 f pe A (P โˆง Q)                                      ๏ผโŸจ refl โŸฉ
 โ‹[ A ] โ… ๐Ÿ[ A ] โˆฃ _ โˆถ (P โˆง Q) holds โ†               ๏ผโŸจ i    โŸฉ
 โ‹[ A ] โ… ๐Ÿ[ A ] โˆง[ A ] ๐Ÿ[ A ] โˆฃ _ โˆถ (P โˆง Q) holds โ† ๏ผโŸจ ii   โŸฉ
 (f pe A P) โˆง[ A ] (f pe A Q)                        โˆŽ
 where
  i  = ap (ฮป - โ†’ โ‹[ A ] โ… - โˆฃ _ โˆถ _ โ†) (โˆง[ A ]-is-idempotent ๐Ÿ[ A ])
  ii = distributivity+ A โ… ๐Ÿ[ A ] โˆฃ _ โˆถ P holds โ† โ… ๐Ÿ[ A ] โˆฃ _ โˆถ Q holds โ† โปยน

\end{code}

\begin{code}

f-respects-โ‹ : {๐“ฆ : Universe} โ†’ (pe : propext ๐“ฆ)
             โ†’ (A : Frame ๐“ค ๐“ฅ ๐“ฆ) (U : Fam ๐“ฆ (ฮฉ ๐“ฆ))
             โ†’ let open Joins (ฮป x y โ†’ x โ‰ค[ poset-of A ] y) in
               ((f pe A (โ‹[ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe ] U)) is-lub-of โ… f pe A x โˆฃ x ฮต U โ†) holds
f-respects-โ‹ pe A U = ฮฒ , ฮณ
 where
  open Joins (ฮป x y โ†’ x โ‰ค[ poset-of A ] y)
  open PosetReasoning (poset-of A) renaming (_โ–  to _QED)
  open PosetNotation (poset-of A)

  ฮฒ : ((f pe A (โ‹[ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe ] U))
       is-an-upper-bound-of
       โ… f pe A x โˆฃ x ฮต U โ†) holds
  ฮฒ i = โ‹[ A ]-least
         โ… ๐Ÿ[ A ] โˆฃ _ โˆถ (U [ i ]) holds โ†
         (_ , ฮป p โ†’ โ‹[ A ]-upper _ โˆฃ i , p โˆฃ)

  ฮณ : (โฑฏ (x , _) ๊ž‰ upper-bound โ… f pe A u โˆฃ u ฮต U โ† ,
        f pe A (โ‹[ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe ] U) โ‰ค x) holds
  ฮณ (x , p) =
   โ‹[ A ]-least _ (_ , โˆฅโˆฅ-rec (holds-is-prop (_ โ‰ค _)) ฮน)
   where
    ฮน : (ฮฃ i ๊ž‰ index U , (U [ i ]) holds) โ†’ (๐Ÿ[ A ] โ‰ค x) holds
    ฮน (i , uแตข) = ๐Ÿ[ A ] โ‰คโŸจ โ‹[ A ]-upper _ uแตข โŸฉ _ โ‰คโŸจ p i โŸฉ x QED


\end{code}

\begin{code}

open FrameHomomorphisms
open FrameHomomorphismProperties

๐’ป : {๐“ฆ : Universe} (pe : propext ๐“ฆ) (F : Frame ๐“ค ๐“ฅ ๐“ฆ)
  โ†’ (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe) โ”€fโ†’ F
๐’ป pe F = (f pe F)
       , f-respects-โŠค pe F
       , f-respects-โˆง pe F
       , f-respects-โ‹ pe F

\end{code}

\begin{code}

main-lemma : {๐“ฆ : Universe} (pe : propext ๐“ฆ) (P : ฮฉ ๐“ฆ)
           โ†’ (P โŠ‘ (โ‹[ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe ] โ… ๐Ÿ[ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe ] โˆฃ x โˆถ P holds โ†)) holds
main-lemma pe P p =
 โ‹[ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe ]-upper (โ… ๐Ÿ[ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe ] โˆฃ x โˆถ P holds โ†) p โ‹†

\end{code}

\begin{code}

๐’ป-is-unique : {๐“ฆ : Universe} (pe : propext ๐“ฆ) (F : Frame ๐“ค ๐“ฅ ๐“ฆ)
            โ†’ (โ„Š : (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe) โ”€fโ†’ F)
            โ†’ ๐’ป pe F ๏ผ โ„Š
๐’ป-is-unique pe F โ„Š@ (g , ฮถ@ (ฯ• , ฯ‡ , ฯˆ)) =
 to-subtype-๏ผ (holds-is-prop โˆ˜ is-a-frame-homomorphism (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe) F) ฮฒ
 where
  open Joins (ฮป x y โ†’ x โ‰ค[ poset-of F ] y)
  open PosetReasoning (poset-of F) renaming (_โ–  to _QED)

  g-is-monotonic : is-monotonic (๐ŸŽF-poset pe) (poset-of F) g holds
  g-is-monotonic =
   frame-morphisms-are-monotonic (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe) F g ฮถ

  ฮณ : f pe F โˆผ g
  ฮณ P = โ‹[ F ]-unique _ _ (ฮด , ฮต) โปยน
   where
    ฮด : (g P is-an-upper-bound-of (P holds , ฮป _ โ†’ ๐Ÿ[ F ])) holds
    ฮด p = ๐Ÿ[ F ] โ‰คโŸจ reflexivity+ (poset-of F) (ฯ• โปยน)  โŸฉ
          g โŠค   โ‰คโŸจ g-is-monotonic (โŠค , P) (ฮป _ โ†’ p) โŸฉ
          g P    QED


    ฮต : (โฑฏ (u , _) ๊ž‰ upper-bound (P holds , ฮป _ โ†’ ๐Ÿ[ F ]) ,
          g P โ‰ค[ poset-of F ] u) holds
    ฮต (u , q) =
     g P                                   โ‰คโŸจ i                      โŸฉ
     g (โ‹[ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe ] โ… โŠค โˆฃ _ โˆถ P holds โ†) โ‰คโŸจ ii                     โŸฉ
     โ‹[ F ] โ… g โŠค โˆฃ _ โˆถ P holds โ†          โ‰คโŸจ iii                    โŸฉ
     โ‹[ F ] โ… ๐Ÿ[ F ] โˆฃ _ โˆถ P holds โ†       โ‰คโŸจ โ‹[ F ]-least _ (u , q) โŸฉ
     u                                     QED
     where
      i  = g-is-monotonic
            (P , (โ‹[ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe ] โ… โŠค โˆฃ _ โˆถ (P holds) โ†))
            (main-lemma pe P)
      ii  = reflexivity+
             (poset-of F)
             ((โ‹[ F ]-unique _ _ (ฯˆ (โ… โŠค โˆฃ _ โˆถ (P holds) โ†))))
      iii = reflexivity+
             (poset-of F)
             (ap (ฮป - โ†’ โ‹[ F ] (P holds , -)) (dfunext fe ฯ…))
       where
        ฯ… : (ฮป _ โ†’ g โŠค) โˆผ (ฮป _ โ†’ ๐Ÿ[ F ])
        ฯ… _ = ฯ•

  ฮฒ : f pe F ๏ผ g
  ฮฒ = dfunext fe ฮณ

\end{code}

\begin{code}

๐ŸŽ-๐”ฝ๐•ฃ๐•ž-initial : {๐“ฆ : Universe} (pe : propext ๐“ฆ) (F : Frame ๐“ค ๐“ฅ ๐“ฆ)
              โ†’ is-singleton (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe โ”€fโ†’ F)
๐ŸŽ-๐”ฝ๐•ฃ๐•ž-initial pe F = (๐’ป pe F) , ๐’ป-is-unique pe F

\end{code}

The initial frame is the terminal locale

\begin{code}

๐ŸLoc : {๐“ค : Universe} (pe : propext ๐“ค) โ†’ Locale (๐“ค โบ) ๐“ค ๐“ค
๐ŸLoc {๐“ค} pe = record { โŸจ_โŸฉโ‚— = ฮฉ ๐“ค ; frame-str-of = prโ‚‚ (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe) }

\end{code}

\section{Spectrality}

\begin{code}

module Spectrality-of-๐ŸŽ (๐“ค : Universe) (pe : propext ๐“ค) where

 โ„ฌ๐ŸŽ : Fam ๐“ค โŸจ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe โŸฉ
 โ„ฌ๐ŸŽ = ๐Ÿš ๐“ค , h
  where
   h : ๐Ÿš ๐“ค โ†’ โŸจ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe โŸฉ
   h (inl โ‹†) = โŠฅ
   h (inr โ‹†) = โŠค

\end{code}

\begin{code}

 ๐’ฎ : โŸจ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe โŸฉ โ†’ Fam ๐“ค (๐Ÿš ๐“ค)
 ๐’ฎ (P , p) = โ… inr โ‹† โˆฃ _ โˆถ P โ†

 โ„ฌ๐ŸŽ-is-basis-for-๐ŸŽ : is-basis-for (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe) โ„ฌ๐ŸŽ
 โ„ฌ๐ŸŽ-is-basis-for-๐ŸŽ (P , p) = ๐’ฎ (P , p) , ฮฒ , ฮณ
  where
   open Joins (ฮป x y โ†’ x โ‰ค[ poset-of (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe) ] y)

   ฮฒ : ((P , p) is-an-upper-bound-of โ… โ„ฌ๐ŸŽ [ b ] โˆฃ b ฮต ๐’ฎ (P , p) โ†) holds
   ฮฒ p โ‹† = p

   open PosetReasoning (poset-of (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe))

   ฮณ : ((u , _) : upper-bound โ… โ„ฌ๐ŸŽ [ b ] โˆฃ b ฮต ๐’ฎ (P , p) โ†)
     โ†’ ((P , p) โ‰ค[ poset-of (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe) ] u) holds
   ฮณ (U , q) p = q p โ‹†

 โ„ฌ๐ŸŽโ†‘ : Fam ๐“ค โŸจ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe โŸฉ
 โ„ฌ๐ŸŽโ†‘ = directify (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe) โ„ฌ๐ŸŽ

 โ„ฌ๐ŸŽโ†‘-is-basis : is-basis-for (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe) โ„ฌ๐ŸŽโ†‘
 โ„ฌ๐ŸŽโ†‘-is-basis = directified-basis-is-basis (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe) โ„ฌ๐ŸŽ โ„ฌ๐ŸŽ-is-basis-for-๐ŸŽ

 ๐’ฎโ†‘ : โŸจ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe โŸฉ โ†’ Fam ๐“ค โŸจ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe โŸฉ
 ๐’ฎโ†‘ U = โ… โ„ฌ๐ŸŽโ†‘ [ b ] โˆฃ b ฮต prโ‚ (โ„ฌ๐ŸŽโ†‘-is-basis U) โ†

\end{code}

\begin{code}

 โ„ฌ๐ŸŽ-is-directed-basis-for-๐ŸŽ : is-directed-basis (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe) โ„ฌ๐ŸŽโ†‘
 โ„ฌ๐ŸŽ-is-directed-basis-for-๐ŸŽ = โ„ฌ๐ŸŽโ†‘-is-basis , d
  where
   d : (U : โŸจ ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe โŸฉ) โ†’ is-directed (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe) (๐’ฎโ†‘ U) holds
   d = covers-of-directified-basis-are-directed (๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe) โ„ฌ๐ŸŽ โ„ฌ๐ŸŽ-is-basis-for-๐ŸŽ

\end{code}

Added on 2024-05-17.

It is sometimes conventient to refer to the initial frame as โ€œฮฉ viewed as a
frameโ€, and we add some notation to highlight this.

\begin{code}

 ฮฉ-Frm : Frame (๐“ค โบ) ๐“ค ๐“ค
 ฮฉ-Frm = ๐ŸŽ-๐”ฝ๐•ฃ๐•ž pe

\end{code}