---
title:          Equivalence of sharp elements and the points of patch
author:         Ayberk Tosun
date-started:   2024-08-04
date-completed: 2024-08-13
---

Joint work with Martín Escardó.

We prove that the sharp elements of a Scott domain `𝓓` are in bijection with the
points of `Patch(Scott(𝓓))`.

\begin{code}[hide]

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

open import MLTT.Spartan
open import UF.FunExt
open import UF.PropTrunc
open import UF.Size
open import UF.Subsingletons
open import UF.UA-FunExt
open import UF.Univalence

module Locales.LawsonLocale.PointsOfPatch
        (𝓤  : Universe)
        (ua : Univalence)
        (pt : propositional-truncations-exist)
        (sr : Set-Replacement pt)
       where

private
 fe : Fun-Ext
 fe {𝓤} {𝓥} = univalence-gives-funext' 𝓤 𝓥 (ua 𝓤) (ua (𝓤  𝓥))

 pe : Prop-Ext
 pe {𝓤} = univalence-gives-propext (ua 𝓤)

open import DomainTheory.BasesAndContinuity.ScottDomain pt fe 𝓤
open import DomainTheory.Basics.Dcpo pt fe 𝓤 renaming (⟨_⟩ to ⟨_⟩∙)
open import Locales.ContinuousMap.Definition pt fe
open import Locales.ContinuousMap.FrameHomomorphism-Properties pt fe
open import Locales.Frame pt fe
open import Locales.InitialFrame pt fe hiding (_⊑_)
open import Locales.LawsonLocale.CompactElementsOfPoint 𝓤 fe pe pt sr
open import Locales.LawsonLocale.SharpElementsCoincideWithSpectralPoints 𝓤 ua pt sr
open import Locales.PatchLocale pt fe sr
open import Locales.PatchProperties pt fe sr
open import Locales.PerfectMaps pt fe
open import Locales.Point.SpectralPoint-Definition pt fe pe
open import Locales.ScottLocale.ScottLocalesOfScottDomains pt fe sr 𝓤
open import Locales.SmallBasis pt fe sr
open import Locales.Spectrality.SpectralMap pt fe
open import Locales.Spectrality.SpectralityOfOmega pt fe sr 𝓤 pe
open import Locales.Stone pt fe sr
open import Locales.StoneImpliesSpectral pt fe sr
open import Locales.TerminalLocale.Properties pt fe sr
open import Locales.UniversalPropertyOfPatch pt fe sr
open import Locales.ZeroDimensionality pt fe sr
open import UF.Base
open import UF.Equiv
open import UF.Logic
open import UF.SubtypeClassifier renaming ( to ⊥ₚ)

open AllCombinators pt fe
open DefinitionOfScottDomain
open Locale
open PerfectMaps
open PropositionalTruncation pt hiding (_∨_)

\end{code}

In the module below, we show that points `𝟏 → Patch(Scott(𝓓))` are in
bijection with spectral points `𝟏 → Scott(𝓓)`. This is done by constructing
an equivalence
```
Point(Patch(Scott(𝓓))) ≃ Spectral-Point(Patch(Scott(𝓓))) ≃ Spectral-Point(Scott(𝓓))
```

We then use this equivalence to show that the sharp elements of `𝓓` are in
bijection with `Point(Patch(Scott(𝓓)))`.

\begin{code}

module sharp-elements-and-points-of-patch
        (𝓓  : DCPO {𝓤 } {𝓤})
        (hl : has-least (underlying-order 𝓓))
        (sd : is-scott-domain 𝓓 holds)
        (dc : decidability-condition 𝓓)
       where

 zd : zero-dimensionalᴰ {𝓤 } (𝒪 (𝟏Loc pe))
 zd = 𝟏-zero-dimensionalᴰ pe

 open SpectralScottLocaleConstruction₂ 𝓓 ua hl sd dc pe renaming (σ⦅𝓓⦆ to Scott⦅𝓓⦆)

\end{code}

Some more module opening bureaucracy.

\begin{code}

 open ClosedNucleus Scott⦅𝓓⦆ scott-locale-is-spectral
 open ContinuousMaps
 open Epsilon Scott⦅𝓓⦆ scott-locale-spectralᴰ
 open Notion-Of-Spectral-Point
 open PatchStoneᴰ Scott⦅𝓓⦆ scott-locale-spectralᴰ
 open Preliminaries
 open SmallPatchConstruction Scott⦅𝓓⦆ scott-locale-spectralᴰ
 open UniversalProperty Scott⦅𝓓⦆ (𝟏Loc pe) scott-locale-spectralᴰ zd 𝟎Frm-is-compact

\end{code}

We define an alias for Patch(Scott(𝓓)).

\begin{code}

 Patch⦅Scott⦅𝓓⦆⦆ : Locale (𝓤 ) 𝓤 𝓤
 Patch⦅Scott⦅𝓓⦆⦆ = SmallPatch

 Patch⦅Scott⦅𝓓⦆⦆-stoneᴰ : stoneᴰ Patch⦅Scott⦅𝓓⦆⦆
 Patch⦅Scott⦅𝓓⦆⦆-stoneᴰ = patchₛ-is-compact , patchₛ-zero-dimensionalᴰ

\end{code}

We now instantiate the universal property of `Patch⦅Scott⦅𝓓⦆⦆` to points `𝟏 →
Scott⦅𝓓⦆`.

\begin{code}

 patch-ump : (𝓅@(p , _) : 𝟏Loc pe ─c→ Scott⦅𝓓⦆)
            is-spectral-map Scott⦅𝓓⦆ (𝟏Loc pe) 𝓅 holds
            let
              open ContinuousMapNotation (𝟏Loc pe) Patch⦅Scott⦅𝓓⦆⦆
             in
              ∃! 𝒻⁻  𝟏Loc pe ─c→ Patch⦅Scott⦅𝓓⦆⦆ ,
               ((U :  𝒪 Scott⦅𝓓⦆ )  p U   𝒻⁻ ⋆∙  U  )
 patch-ump = ump-of-patch
              Scott⦅𝓓⦆
              scott-locale-is-spectral
              scott-locale-has-small-𝒦
              (𝟏Loc pe)
              (𝟏-is-stone pe)

\end{code}

This universal property immediately gives us a map from the spectral points of
`Scott⦅𝓓⦆` into the spectral points of `Patch⦅Scott⦅𝓓⦆⦆`. We call this map
`to-patch-point`.

\begin{code}

 to-patch-point : Spectral-Point Scott⦅𝓓⦆  Spectral-Point Patch⦅Scott⦅𝓓⦆⦆
 to-patch-point  = to-spectral-point Patch⦅Scott⦅𝓓⦆⦆ (𝓅 , )
  where
   open Spectral-Point  renaming (point to F; point-preserves-compactness to 𝕤)
   open continuous-maps-of-stone-locales (𝟏Loc pe) Patch⦅Scott⦅𝓓⦆⦆

   𝓅 : 𝟏Loc pe ─c→ Patch⦅Scott⦅𝓓⦆⦆
   𝓅 = ∃!-witness (patch-ump F 𝕤)

    : is-spectral-map Patch⦅Scott⦅𝓓⦆⦆ (𝟏Loc pe) 𝓅 holds
    = continuous-maps-between-stone-locales-are-spectral
        (𝟏-stoneᴰ pe)
        Patch⦅Scott⦅𝓓⦆⦆-stoneᴰ
        𝓅

\end{code}

Recall that the map `ϵ` denotes the continuous map given by the frame
homomorphism `x ↦ ‘ x ’`.

\begin{code}

 ϵ-is-a-spectral-map : is-spectral-map Scott⦅𝓓⦆ Patch⦅Scott⦅𝓓⦆⦆ ϵ holds
 ϵ-is-a-spectral-map =
  perfect-maps-are-spectral
   Patch⦅Scott⦅𝓓⦆⦆
   Scott⦅𝓓⦆
    spectralᴰ-implies-basisᴰ Scott⦅𝓓⦆ scott-locale-spectralᴰ 
   ϵ
   ϵ-is-a-perfect-map

\end{code}

TODO: The proof above should be placed in a more appropriate place.

We now define the inverse of `to-patch-point`: given a spectral point `𝟏 →
Patch⦅Scott⦅𝓓⦆⦆`, we can compose this with `ϵ : Patch⦅Scott⦅𝓓⦆⦆ → Scott⦅𝓓⦆` to
obtain a spectral point `𝟏 → Scott⦅𝓓⦆`. We call this map `to-scott-point`.

\begin{code}

 to-scott-point : Spectral-Point Patch⦅Scott⦅𝓓⦆⦆  Spectral-Point Scott⦅𝓓⦆
 to-scott-point 𝓅 = to-spectral-point Scott⦅𝓓⦆ (𝓅₀ , 𝕤)
  where
   open Spectral-Point 𝓅 renaming (point to 𝓅⋆)

   𝓅₀ : 𝟏Loc pe ─c→ Scott⦅𝓓⦆
   𝓅₀ = cont-comp (𝟏Loc pe) Patch⦅Scott⦅𝓓⦆⦆ Scott⦅𝓓⦆ ϵ 𝓅⋆

   𝕤 : is-spectral-map Scott⦅𝓓⦆ (𝟏Loc pe) 𝓅₀ holds
   𝕤 K κ = point-preserves-compactness  K  (ϵ-is-a-spectral-map K κ)

\end{code}

We now proceed to show that these maps form a section-retraction pair.

The fact that `to-scott-point` is a retraction of `to-patch-point` follows
directly from the existence part of the universal property.

\begin{code}

 to-scott-point-cancels-to-patch-point : to-scott-point  to-patch-point  id
 to-scott-point-cancels-to-patch-point 𝓅 =
  to-spectral-point-= Scott⦅𝓓⦆ (to-scott-point (to-patch-point 𝓅)) 𝓅 
   where
    open Spectral-Point 𝓅
     using ()
     renaming (point to 𝓅⋆; point-fn to p⋆; point-preserves-compactness to 𝕤)

    𝓅′ : Spectral-Point Scott⦅𝓓⦆
    𝓅′ = to-scott-point (to-patch-point 𝓅)

    open Spectral-Point 𝓅′ using () renaming (point to 𝓅′⋆; point-fn to p′⋆)

     : p′⋆  p⋆
     U = pr₂ (description (patch-ump 𝓅⋆ 𝕤)) U ⁻¹

     : p′⋆  p⋆
     = dfunext fe 

\end{code}

The fact that it is a section follows from the uniqueness.

\begin{code}

 to-patch-point-cancels-to-scott-point : to-patch-point  to-scott-point  id
 to-patch-point-cancels-to-scott-point 𝓅 =
  to-spectral-point-=' Patch⦅Scott⦅𝓓⦆⦆ 𝓅′ 𝓅 
   where
    open Spectral-Point 𝓅
     using ()
     renaming (point to 𝓅⋆; point-fn to p⋆; point-preserves-compactness to 𝕤)
    open ContinuousMapNotation (𝟏Loc pe) Patch⦅Scott⦅𝓓⦆⦆

    𝓅′ : Spectral-Point Patch⦅Scott⦅𝓓⦆⦆
    𝓅′ = to-patch-point (to-scott-point 𝓅)

    𝓅₀ : 𝟏Loc pe ─c→ Scott⦅𝓓⦆
    𝓅₀ = cont-comp (𝟏Loc pe) Patch⦅Scott⦅𝓓⦆⦆ Scott⦅𝓓⦆ ϵ 𝓅⋆

    p₀ :  𝒪 Scott⦅𝓓⦆    𝒪 (𝟏Loc pe) 
    p₀ = pr₁ 𝓅₀

    𝕤₀ : is-spectral-map Scott⦅𝓓⦆ (𝟏Loc pe) 𝓅₀ holds
    𝕤₀ K κ = 𝕤  K  (ϵ-is-a-spectral-map K κ)

    open Spectral-Point 𝓅′ using () renaming (point to 𝓅′⋆; point-fn to p′⋆)

    υ : ∃! 𝓅₀⁻  𝟏Loc pe ─c→ Patch⦅Scott⦅𝓓⦆⦆ ,
         ((U :  𝒪 Scott⦅𝓓⦆ )  p₀ U  𝓅₀⁻ ⋆∙  U )
    υ = patch-ump 𝓅₀ 𝕤₀

    r : (U :  𝒪 Scott⦅𝓓⦆ )  p₀ U  p⋆  U 
    r = λ _  refl

     : 𝓅′⋆  𝓅⋆
     = pr₁ (from-Σ-= (∃!-uniqueness υ 𝓅⋆ r))

\end{code}

We package these up into a proof that `to-patch-point` and `to-scott-point` form
an equivalence.

\begin{code}

 to-patch-point-is-invertible : invertible to-patch-point
 to-patch-point-is-invertible = to-scott-point ,  , 
  where
    : to-scott-point  to-patch-point  id
    = to-scott-point-cancels-to-patch-point

    : to-patch-point  to-scott-point  id
    = to-patch-point-cancels-to-scott-point

 spectral-points-of-patch-are-equivalent-to-spectral-points-of-scott
  : Spectral-Point Scott⦅𝓓⦆  Spectral-Point Patch⦅Scott⦅𝓓⦆⦆
 spectral-points-of-patch-are-equivalent-to-spectral-points-of-scott =
  to-patch-point , qinvs-are-equivs to-patch-point to-patch-point-is-invertible

\end{code}

We now proceed to show that `Point⦅Patch⦅Scott⦅𝓓⦆⦆⦆` is equivalent to
`Spectral-Point⦅Patch⦅Scott⦅𝓓⦆⦆⦆`, since all points of `Patch⦅Scott⦅𝓓⦆⦆` are
_automatically_ spectral.

\begin{code}

 forget-spectrality : Spectral-Point Patch⦅Scott⦅𝓓⦆⦆  Point Patch⦅Scott⦅𝓓⦆⦆
 forget-spectrality = Spectral-Point.point

 to-spectral-point-of-patch : Point Patch⦅Scott⦅𝓓⦆⦆
                             Spectral-Point Patch⦅Scott⦅𝓓⦆⦆
 to-spectral-point-of-patch 𝓅 = to-spectral-point Patch⦅Scott⦅𝓓⦆⦆ (𝓅 , 𝕤)
  where
   open continuous-maps-of-stone-locales (𝟏Loc pe) Patch⦅Scott⦅𝓓⦆⦆

   𝕤 : is-spectral-map Patch⦅Scott⦅𝓓⦆⦆ (𝟏Loc pe) 𝓅 holds
   𝕤 = continuous-maps-between-stone-locales-are-spectral
        (𝟏-stoneᴰ pe)
        Patch⦅Scott⦅𝓓⦆⦆-stoneᴰ
        𝓅

 open FrameHomomorphismProperties

 forget-spectrality-is-invertible : invertible forget-spectrality
 forget-spectrality-is-invertible = to-spectral-point-of-patch ,  , 
  where
    : to-spectral-point-of-patch  forget-spectrality  id
    𝓅ₛ = to-spectral-point-= Patch⦅Scott⦅𝓓⦆⦆ 𝓅 𝓅ₛ refl
    where
     𝓅 : Spectral-Point Patch⦅Scott⦅𝓓⦆⦆
     𝓅 = to-spectral-point-of-patch (forget-spectrality 𝓅ₛ)

    : forget-spectrality  to-spectral-point-of-patch   id
    𝓅 =
    to-frame-homomorphism-= (𝒪 Patch⦅Scott⦅𝓓⦆⦆) (𝒪 (𝟏Loc pe)) 𝓅 𝓅′  _  refl)
     where
      𝓅′ : Point Patch⦅Scott⦅𝓓⦆⦆
      𝓅′ = forget-spectrality (to-spectral-point-of-patch 𝓅)

 spectral-points-of-patch-are-equivalent-to-points-of-patch
  : Spectral-Point Patch⦅Scott⦅𝓓⦆⦆  Point Patch⦅Scott⦅𝓓⦆⦆
 spectral-points-of-patch-are-equivalent-to-points-of-patch =
  forget-spectrality , e
   where
    e : is-equiv forget-spectrality
    e = qinvs-are-equivs forget-spectrality forget-spectrality-is-invertible

\end{code}

We combine these two equivalences to obtain an equivalence between the points of
`Patch⦅Scott⦅𝓓⦆⦆` and spectral points of `Scott⦅𝓓⦆`.

\begin{code}

 points-of-patch-are-spectral-points-of-scott
  : Point Patch⦅Scott⦅𝓓⦆⦆  Spectral-Point Scott⦅𝓓⦆
 points-of-patch-are-spectral-points-of-scott =
  Point Patch⦅Scott⦅𝓓⦆⦆              ≃⟨  
  Spectral-Point Patch⦅Scott⦅𝓓⦆⦆     ≃⟨  
  Spectral-Point Scott⦅𝓓⦆            
   where
     = ≃-sym spectral-points-of-patch-are-equivalent-to-points-of-patch
     = ≃-sym spectral-points-of-patch-are-equivalent-to-spectral-points-of-scott

\end{code}

Finally, we combine this equivalence with the equivalence between sharp elements
and spectral points.

\begin{code}

 open Sharp-Element-Spectral-Point-Equivalence 𝓓 hl sd dc

 points-of-patch-are-the-sharp-elements : ♯𝓓  Point Patch⦅Scott⦅𝓓⦆⦆
 points-of-patch-are-the-sharp-elements =
  ♯𝓓                         ≃⟨  
  Spectral-Point Scott⦅𝓓⦆    ≃⟨  
  Point Patch⦅Scott⦅𝓓⦆⦆      
   where
     = ♯𝓓-equivalent-to-spectral-points-of-Scott⦅𝓓⦆
     = ≃-sym points-of-patch-are-spectral-points-of-scott

\end{code}