---
title:          Equivalence of sharp elements with spectral points
author:         Ayberk Tosun
date-started:   2024-05-22
date-completed: 2024-05-28
dates-updated:  [2024-06-03]
---

This module contains the proof of equivalence between the sharp elements of a
Scott domain and the “spectral points” of its Scott locale. This equivalence was
conjectured by Martín Escardó and proved by Ayberk Tosun on 2024-03-15.

The formalization of the proof was completed on 2024-05-28.

\begin{code}[hide]

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

open import MLTT.List hiding ([_])
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.SharpElementsCoincideWithSpectralPoints
        (𝓤  : 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.Bases pt fe 𝓤
open import DomainTheory.BasesAndContinuity.Continuity pt fe 𝓤
open import DomainTheory.BasesAndContinuity.ScottDomain pt fe 𝓤
open import DomainTheory.Basics.Dcpo pt fe 𝓤 renaming (⟨_⟩ to ⟨_⟩∙)
open import DomainTheory.Basics.WayBelow pt fe 𝓤
open import DomainTheory.Topology.ScottTopology pt fe 𝓤
open import DomainTheory.Topology.ScottTopologyProperties pt fe 𝓤
open import Locales.Compactness.Definition pt fe hiding (is-compact)
open import Locales.ContinuousMap.FrameHomomorphism-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.Point.SpectralPoint-Definition pt fe
open import Locales.ScottLocale.Properties pt fe 𝓤
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.TerminalLocale.Properties pt fe sr
open import NotionsOfDecidability.Decidable
open import Slice.Family
open import UF.Equiv
open import UF.Logic
open import UF.Subsingletons-FunExt
open import UF.SubtypeClassifier renaming (⊥ to ⊥ₚ)

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

\end{code}

\section{Preliminaries}

We define a version of the predicate `is-compact` that is packaged up with the
proof that it is a proposition.

\begin{code}

is-compactₚ : (𝓓 : DCPO {𝓤 ⁺} {𝓤}) → ⟨ 𝓓 ⟩∙ → Ω (𝓤 ⁺)
is-compactₚ 𝓓 x = is-compact 𝓓 x , being-compact-is-prop 𝓓 x

\end{code}

Similarly, we define a version of the predicate `is-decidable` that is packaged
up with the proof that it is a proposition.

\begin{code}

is-decidableₚ : Ω 𝓤 → Ω 𝓤
is-decidableₚ P =
 is-decidable (P holds) , decidability-of-prop-is-prop fe (holds-is-prop P)

\end{code}

\section{Introduction}

We work in a module parameterized by

 - a large and locally small Scott domain `𝓓`,
 - assumed to satisfy the `decidability-condition` which says that upper
   boundedness of its compact elements is a decidable property.

\begin{code}

module Sharp-Element-Spectral-Point-Equivalence
        (𝓓    : DCPO {𝓤 ⁺} {𝓤})
        (hl   : has-least (underlying-order 𝓓))
        (sd   : is-scott-domain 𝓓 holds)
        (dc   : decidability-condition 𝓓)
       where

 open Construction 𝓓 ua hl sd dc
 open DefinitionOfBoundedCompleteness hiding (_⊑_)

\end{code}

The following is a bit of preparation for the proofs. We open up relevant
modules and define abbreviations for constructions that we use for the sake of
readability and self-containment.

\begin{code}

 𝒷₀ : has-unspecified-small-compact-basis 𝓓
 𝒷₀ = pr₁ sd

\end{code}

We denote by `Scott⦅𝓓⦆` the Scott locale of domain `𝓓`.

\begin{code}

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

\end{code}

For the frame of opens of the Scott locale `Scott⦅𝓓⦆`, we reserve the notation
`σ⦅𝓓⦆`. This notation differs from other uses in TypeTopology, but it should be
the standard one and the notation elsewhere should be updated to use this one.

\begin{code}

 σ⦅𝓓⦆ : Frame (𝓤 ⁺) 𝓤 𝓤
 σ⦅𝓓⦆ = 𝒪 Scott⦅𝓓⦆

 open SpectralScottLocaleConstruction  𝓓 hl hscb dc bc pe hiding (scb; σᴰ)

 open ScottLocaleProperties 𝓓 hl hscb pe renaming (⊤-is-compact to Scott⦅𝓓⦆-is-compact)
 open is-small-compact-basis scb
 open structurally-algebraic

 σᴰ : spectralᴰ Scott⦅𝓓⦆
 σᴰ = scott-locale-spectralᴰ

\end{code}

The family `basis` given below is the basis of the Scott locale of domain `𝓓`.

\begin{code}

 basis : Fam 𝓤 ⟨ 𝒪 Scott⦅𝓓⦆ ⟩
 basis = basisₛ Scott⦅𝓓⦆ σᴰ

 Bσ : 𝓤  ̇
 Bσ = index basis

 βσ : Bσ → ⟨ 𝒪 Scott⦅𝓓⦆ ⟩
 βσ = basis [_]

 κσ : (i : Bσ) → is-compact-open Scott⦅𝓓⦆ (βσ i) holds
 κσ = basisₛ-consists-of-compact-opens Scott⦅𝓓⦆ σᴰ

\end{code}

We define a version of the order of `𝓓` that is packaged up with the proof that
it is a proposition (called `prop-valuedness` in the domain theory development).

\begin{code}

 _⊑_ : ⟨ 𝓓 ⟩∙ → ⟨ 𝓓 ⟩∙ → Ω 𝓤
 x ⊑ y = (x ⊑⟨ 𝓓 ⟩ y) , prop-valuedness 𝓓 x y

\end{code}

\section{Definition of sharpness}

We now define what it means for an element to be _sharp_, following the work of
de Jong [1].

\begin{code}

 is-sharp : ⟨ 𝓓 ⟩∙ → Ω (𝓤 ⁺)
 is-sharp x = Ɐ c ꞉ ⟨ 𝓓 ⟩∙ , is-compactₚ 𝓓 c ⇒ is-decidableₚ (c ⊑ x)

\end{code}

This definition of the notion of sharpness is a predicate with large truth
values as it quantifies over the compact opens. Because we are working with an
algebraic dcpo, however, we can define a small version which we denote
`is-sharp⁻`.

\begin{code}

 is-sharp⁻ : ⟨ 𝓓 ⟩∙ → Ω 𝓤
 is-sharp⁻ x = Ɐ i ꞉ index B𝓓 , is-decidableₚ ((B𝓓 [ i ]) ⊑ x)

\end{code}

These two are equivalent.

\begin{code}

 sharp-implies-sharp⁻ : (Ɐ x ꞉ ⟨ 𝓓 ⟩∙ , is-sharp x ⇒ is-sharp⁻ x) holds
 sharp-implies-sharp⁻ x 𝕤 i = 𝕤 (B𝓓 [ i ]) (basis-is-compact i)

 sharp⁻-implies-sharp : (Ɐ x ꞉ ⟨ 𝓓 ⟩∙ , is-sharp⁻ x ⇒ is-sharp x) holds
 sharp⁻-implies-sharp x 𝕤 c χ =
  ∥∥-rec (holds-is-prop (is-decidableₚ (c ⊑ x))) † μ
   where
    μ : ∃ i ꞉ index B𝓓 , B𝓓 [ i ] ＝ c
    μ = small-compact-basis-contains-all-compact-elements 𝓓 (B𝓓 [_]) scb c χ

    † : Σ i ꞉ index B𝓓 , B𝓓 [ i ] ＝ c → is-decidableₚ (c ⊑ x) holds
    † (i , p) = transport (λ - → is-decidableₚ (- ⊑ x) holds) p (𝕤 i)

 sharp-is-equivalent-to-sharp⁻ : (Ɐ x ꞉ ⟨ 𝓓 ⟩∙ , is-sharp x ⇔ is-sharp⁻ x) holds
 sharp-is-equivalent-to-sharp⁻ x =
  sharp-implies-sharp⁻ x , sharp⁻-implies-sharp x

\end{code}

We now define the type `♯𝓓` of sharp elements of the Scott domain `𝓓`.

\begin{code}

 ♯𝓓 : 𝓤 ⁺  ̇
 ♯𝓓 = Σ x ꞉ ⟨ 𝓓 ⟩∙ , is-sharp x holds

\end{code}

We usually pattern match on the inhabitants of `♯𝓓` to refer to the first
component. But if the need arises, we denote the underlying element of a sharp
element `𝓍` by `⦅ 𝓍 ⦆`.

\begin{code}

 ⦅_⦆ : ♯𝓓 → ⟨ 𝓓 ⟩∙
 ⦅_⦆ (x , _) = x

 abstract
  to-sharp-＝ : (𝓍 𝓎 : ♯𝓓) → pr₁ 𝓍 ＝ pr₁ 𝓎 → 𝓍 ＝ 𝓎
  to-sharp-＝ 𝓍 𝓎 = to-subtype-＝ (holds-is-prop ∘ is-sharp)

 open Preliminaries
 open Locale
 open DefnOfScottTopology 𝓓 𝓤

\end{code}

\section{Characterization of sharp elements}

In this section, we give a characterization of sharp elements which we use
when constructing the equivalence (in the next section).

We define the following predicate expressing that an element `x` has decidable
membership in compact Scott opens.

\begin{code}

 open Properties 𝓓

 admits-decidable-membership-in-compact-scott-opens : ⟨ 𝓓 ⟩∙ → Ω (𝓤 ⁺)
 admits-decidable-membership-in-compact-scott-opens x =
  Ɐ 𝒦 ꞉ ⟨ 𝒪 Scott⦅𝓓⦆ ⟩ , is-compact-open Scott⦅𝓓⦆ 𝒦 ⇒ is-decidableₚ (x ∈ₛ 𝒦)

\end{code}

Every sharp element admits decidable membership in compact Scott opens.

\begin{code}

 sharp-implies-admits-decidable-membership-in-compact-scott-opens
  : (x : ⟨ 𝓓 ⟩∙)
  → (is-sharp x ⇒ admits-decidable-membership-in-compact-scott-opens x) holds
 sharp-implies-admits-decidable-membership-in-compact-scott-opens x 𝓈𝒽 𝒦 𝕜 =
  ∥∥-rec (holds-is-prop (is-decidableₚ (x ∈ₛ 𝒦))) (uncurry ‡) ♢
   where
    ♢ : is-basic Scott⦅𝓓⦆ 𝒦 (spectralᴰ-implies-directed-basisᴰ Scott⦅𝓓⦆ σᴰ) holds
    ♢ = compact-opens-are-basic
         Scott⦅𝓓⦆
         (spectralᴰ-implies-directed-basisᴰ Scott⦅𝓓⦆ σᴰ)
         𝒦
         𝕜

    lemma : (xs : List (index B𝓓)) → is-decidableₚ (x ∈ₛ βσ xs) holds
    lemma []       = inr 𝟘-elim
    lemma (i ∷ is) =
     ∨-preserves-decidability pt (x ∈ₛ ↑ˢ[ βₖ i ]) (x ∈ₛ 𝜸 is) † IH
      where
       † : is-decidableₚ (x ∈ₛ ↑ˢ[ βₖ i ]) holds
       † = 𝓈𝒽 (β i) (basis-is-compact i)

       IH : is-decidableₚ (x ∈ₛ 𝜸 is) holds
       IH = lemma is

    ‡ : (xs : List (index B𝓓)) → βσ xs ＝ 𝒦 → is-decidableₚ (x ∈ₛ 𝒦) holds
    ‡ xs p = transport (λ - → is-decidableₚ (x ∈ₛ -) holds) p (lemma xs)

\end{code}

The converse also holds meaning elements that admit decidable membership in
compact Scott opens are _exactly_ the sharp elements.

\begin{code}

 admits-decidable-membership-in-compact-scott-opens-implies-is-sharp
  : (x : ⟨ 𝓓 ⟩∙)
  → admits-decidable-membership-in-compact-scott-opens x holds
  → is-sharp x holds
 admits-decidable-membership-in-compact-scott-opens-implies-is-sharp x φ c 𝕜 =
  φ ↑ˢ[ (c , 𝕜) ] (principal-filter-is-compact₀ c 𝕜)

 characterization-of-sharp-elements
  : (x : ⟨ 𝓓 ⟩∙)
  → (admits-decidable-membership-in-compact-scott-opens x ⇔ is-sharp x) holds
 characterization-of-sharp-elements x = † , ‡
  where
   † = admits-decidable-membership-in-compact-scott-opens-implies-is-sharp x
   ‡ = sharp-implies-admits-decidable-membership-in-compact-scott-opens x

\end{code}

\section{The equivalence}

We now start constructing an equivalence between the type
`Spectral-Point Scott⦅𝓓⦆` and the type `♯𝓓`.

This equivalence consists of the maps:

  1. `𝓅𝓉[_] : ♯𝓓 → Spectral-Point Scott⦅𝓓⦆`, and
  2. `sharp : Spectral-Point Scott⦅𝓓⦆ → ♯𝓓`.

We now construct these maps in this order.

\subsection{Definition of the map `𝓅𝓉`}

We follow our usual convention of distinguishing the preliminary version of the
construction of interest using the subscript `₀`, which we then package up with
the proof that it satisfies some property.

\begin{code}

 pt₀[_] : ⟨ 𝓓 ⟩∙ → ⟨ 𝒪 Scott⦅𝓓⦆ ⟩ → Ω 𝓤
 pt₀[_] x U = x ∈ₛ U

 open FrameHomomorphismProperties (𝒪 Scott⦅𝓓⦆) (𝟎-𝔽𝕣𝕞 pe)
 open FrameHomomorphisms

 pt[_] : ♯𝓓 → Point Scott⦅𝓓⦆
 pt[_] 𝓍@(x , 𝕤) = pt₀[ x ] , †
  where
   ‡ : preserves-joins (𝒪 Scott⦅𝓓⦆) (𝟎-𝔽𝕣𝕞 pe) pt₀[ x ] holds
   ‡ S = ⋁[ 𝟎-𝔽𝕣𝕞 pe ]-upper ⁅ pt₀[ x ] y ∣ y ε S ⁆
       , ⋁[ 𝟎-𝔽𝕣𝕞 pe ]-least ⁅ pt₀[ x ] y ∣ y ε S ⁆

   † : is-a-frame-homomorphism (𝒪 Scott⦅𝓓⦆) (𝟎-𝔽𝕣𝕞 pe) pt₀[ x ] holds
   † = refl , (λ _ _ → refl) , ‡

 open BottomLemma 𝓓 𝕒 hl

\end{code}

Given any sharp element `𝓍`, the point `pt 𝓍` is a spectral map.

\begin{code}

 pt-is-spectral : (𝓍 : ♯𝓓) → is-spectral-map Scott⦅𝓓⦆ (𝟏Loc pe) pt[ 𝓍 ] holds
 pt-is-spectral 𝓍@(x , 𝓈𝒽) 𝒦@(K , σ) 𝕜 = decidable-implies-compact pe (x ∈ₛ 𝒦) †
  where
   † : is-decidableₚ (x ∈ₛ (K , σ)) holds
   † = sharp-implies-admits-decidable-membership-in-compact-scott-opens x 𝓈𝒽 𝒦 𝕜

 open Notion-Of-Spectral-Point pe

\end{code}

We package `pt[_]` up with this proof of spectrality and denote it `𝓅𝓉[_]`.

\begin{code}

 𝓅𝓉[_] : ♯𝓓 → Spectral-Point Scott⦅𝓓⦆
 𝓅𝓉[_] 𝓍 = to-spectral-point Scott⦅𝓓⦆ ℱ
  where
   ℱ : Spectral-Map (𝟏Loc pe) Scott⦅𝓓⦆
   ℱ = pt[ 𝓍 ] , pt-is-spectral 𝓍

\end{code}

\subsection{Definition of the map `sharp`}

We now define the map `sharp` going in the opposite direction.

\begin{code}

 sharp₀ : Point Scott⦅𝓓⦆ → ⟨ 𝓓 ⟩∙
 sharp₀ ℱ = ∐ 𝓓 (𝒦-in-point-is-directed ℱ)

\end{code}

The following lemma says if `sharp(ℱ) ∈ 𝔘` then `U ∈ ℱ`, for every point `ℱ` and
every Scott open `𝔘`.

\begin{code}

 open PropertiesAlgebraic 𝓓 𝕒 hiding (is-compactₚ)

 sharp-in-scott-open-implies-in-point
  : (𝔘 : ⟨ 𝒪 Scott⦅𝓓⦆ ⟩)
  → (ℱ@(F , _) : Point Scott⦅𝓓⦆)
  → (sharp₀ ℱ ∈ₛ 𝔘 ⇒ F 𝔘) holds
 sharp-in-scott-open-implies-in-point 𝔘 ℱ@(F , 𝒽) = †
  where
   open 𝒪ₛᴿ (to-𝒪ₛᴿ 𝔘)

   † : (sharp₀ ℱ ∈ₛ 𝔘 ⇒ F 𝔘) holds
   † p = ∥∥-rec (holds-is-prop (F 𝔘)) ‡ γ
    where
     ‡ : Σ (i , _) ꞉ index (𝒦-in-point ℱ) , ((B𝓓 [ i ]) ∈ₛ 𝔘) holds
       → F 𝔘 holds
     ‡ ((a , b) , c) = frame-morphisms-are-monotonic F 𝒽 (↑ˢ[ βₖ a ] , 𝔘) q b
      where
       q : (↑ˢ[ βₖ a ] ≤[ poset-of (𝒪 Scott⦅𝓓⦆) ] 𝔘) holds
       q x = pred-is-upwards-closed (B𝓓 [ a ]) (B𝓓 [ x ]) c

     γ : ∥ Σ (i , _) ꞉ index (𝒦-in-point ℱ) , ((B𝓓 [ i ]) ∈ₛ 𝔘) holds ∥
     γ = pred-is-inaccessible-by-dir-joins (𝒦-in-point↑ ℱ) p

\end{code}

As an immediate special case of this lemma, we obtain the following.

\begin{code}

 below-sharp-implies-in-point
  : (ℱ@(F , _) : Point Scott⦅𝓓⦆)
  → (c : ⟨ 𝓓 ⟩∙)
  → (𝕜 : is-compact 𝓓 c)
  → c ⊑⟨ 𝓓 ⟩ sharp₀ ℱ
  → F ↑ˢ[ c , 𝕜 ] holds
 below-sharp-implies-in-point ℱ@(F , 𝒽) c 𝕜 =
  sharp-in-scott-open-implies-in-point ↑ˢ[ 𝔠 ] ℱ
   where
    𝔠 = (c , 𝕜)

\end{code}

The converse of this special case also holds. In fact, the converse holds
for _all_ compact Scott opens.

\begin{code}

 in-point-implies-contains-sharp⋆
  : (ks : List (index B𝓓))
  → (ℱ@(F , _) : Point Scott⦅𝓓⦆)
  → (F (𝜸 ks) ⇒ sharp₀ ℱ ∈ₛ 𝜸 ks) holds
 in-point-implies-contains-sharp⋆ [] ℱ@(F , _) p = 𝟘-elim Ⅰ
  where
   φ : F 𝟎[ 𝒪 Scott⦅𝓓⦆ ] holds
   φ = transport (λ - → (F -) holds) (𝜸-equal-to-𝜸₁ []) p

   Ⅱ : 𝟎[ 𝟎-𝔽𝕣𝕞 pe ] holds
   Ⅱ = transport _holds (frame-homomorphisms-preserve-bottom ℱ) φ

   Ⅰ : ⊥ₚ holds
   Ⅰ = transport (λ - → - holds) (𝟎-is-⊥ pe ⁻¹) Ⅱ

 in-point-implies-contains-sharp⋆ (k ∷ ks) ℱ@(F , _) p =
  ∥∥-rec (holds-is-prop ((sharp₀ ℱ ∈ₛ 𝜸 (k ∷ ks)))) ‡ (transport _holds ♠ p)
   where
    ♠ : F (𝜸 (k ∷ ks)) ＝ F ↑ᵏ[ k ] ∨ F (𝜸 ks)
    ♠ = F (𝜸 (k ∷ ks))                     ＝⟨ Ⅰ ⟩
        F (𝜸₁ (k ∷ ks))                    ＝⟨ Ⅱ ⟩
        F ↑ᵏ[ k ] ∨[ 𝟎-𝔽𝕣𝕞 pe ] F (𝜸₁ ks)  ＝⟨ Ⅲ ⟩
        F ↑ᵏ[ k ] ∨[ 𝟎-𝔽𝕣𝕞 pe ] F (𝜸 ks)   ＝⟨ Ⅳ ⟩
        F ↑ᵏ[ k ] ∨ F (𝜸 ks)               ∎
         where
          Ⅰ = ap F (𝜸-equal-to-𝜸₁ (k ∷ ks))
          Ⅱ = frame-homomorphisms-preserve-binary-joins ℱ _ _
          Ⅲ = ap (λ - → F ↑ᵏ[ k ] ∨[ 𝟎-𝔽𝕣𝕞 pe ] F -) (𝜸-equal-to-𝜸₁ ks ⁻¹)
          Ⅳ = binary-join-is-disjunction pe (F ↑ᵏ[ k ]) (F (𝜸 ks))

    ‡ : F ↑ᵏ[ k ] holds + F (𝜸 ks) holds → (sharp₀ ℱ ∈ₛ 𝜸 (k ∷ ks)) holds
    ‡ (inl p) = ∣ inl (∐-is-upperbound 𝓓 (𝒦-in-point-is-directed ℱ) (k , p)) ∣
    ‡ (inr q) = ∣ inr (in-point-implies-contains-sharp⋆ ks ℱ q) ∣

\end{code}

We can reformulate this more concisely to say the same thing for any compact
Scott open `K` since a Scott open is compact iff it is a finite join of
principal filters on compact opens.

\begin{code}

 in-point-implies-contains-sharp
  : (ℱ@(F , _) : Point Scott⦅𝓓⦆)
  → (K : ⟨ σ⦅𝓓⦆ ⟩)
  → (𝕜 : is-compact-open Scott⦅𝓓⦆ K holds)
  → (F K ⇒ sharp₀ ℱ ∈ₛ K) holds
 in-point-implies-contains-sharp ℱ@(F , ψ) K 𝕜 χ =
  ∥∥-rec (holds-is-prop (sharp₀ ℱ ∈ₛ K)) † γ
   where
    ℬ↑ : directed-basisᴰ (𝒪 Scott⦅𝓓⦆)
    ℬ↑ = spectralᴰ-implies-directed-basisᴰ Scott⦅𝓓⦆ σᴰ

    γ : is-basic Scott⦅𝓓⦆ K (spectralᴰ-implies-directed-basisᴰ Scott⦅𝓓⦆ σᴰ) holds
    γ = compact-opens-are-basic Scott⦅𝓓⦆ ℬ↑ K 𝕜

    † : Σ i ꞉ Bσ , βσ i ＝ K → (sharp₀ ℱ ∈ₛ K) holds
    † (i , p) = transport (λ - → (sharp₀ ℱ ∈ₛ -) holds) p ‡
     where
      μ : F (𝜸 i) holds
      μ = transport (λ - → F - holds) (p ⁻¹) χ

      ‡ : (sharp₀ (F , ψ) ∈ₛ βσ i) holds
      ‡ = in-point-implies-contains-sharp⋆ i ℱ μ

\end{code}

We now prove that the map `sharp₀` always gives sharp elements.

\begin{code}

 sharp₀-gives-sharp-elements : (F : Point Scott⦅𝓓⦆)
                             → is-spectral-map Scott⦅𝓓⦆ (𝟏Loc pe) F holds
                             → is-sharp (sharp₀ F) holds
 sharp₀-gives-sharp-elements ℱ@(F , _) σ c 𝕜 = cases case₁ case₂ γ
  where
   χ : is-compact-open (𝟏Loc pe) (F ↑ˢ[ c , 𝕜 ]) holds
   χ = σ ↑ˢ[ c , 𝕜 ] (principal-filter-is-compact₀ c 𝕜 )

   γ : is-decidableₚ (F ↑ˢ[ c , 𝕜 ]) holds
   γ = compact-implies-boolean pe (F ↑ˢ[ c , 𝕜 ]) χ

   κ : is-compact-open Scott⦅𝓓⦆ ↑ˢ[ c , 𝕜 ] holds
   κ = principal-filter-is-compact₀ c 𝕜

   case₁ : F ↑ˢ[ c , 𝕜 ] holds → is-decidableₚ (c ⊑ sharp₀ ℱ) holds
   case₁ = inl ∘ in-point-implies-contains-sharp ℱ ↑ˢ[ (c , 𝕜) ] κ

   case₂ : ¬ (F ↑ˢ[ c , 𝕜 ] holds) → is-decidableₚ (c ⊑ sharp₀ ℱ) holds
   case₂ χ = inr (χ ∘ below-sharp-implies-in-point ℱ c 𝕜)

\end{code}

We denote by `sharp` the version of `sharp₀` that is packaged up with the proof
that it always gives sharp elements.

\begin{code}

 sharp : Spectral-Point Scott⦅𝓓⦆ → ♯𝓓
 sharp ℱ = sharp₀ F· , sharp₀-gives-sharp-elements F· σ
  where
   open Spectral-Point Scott⦅𝓓⦆ ℱ
    renaming (point-fn to F; point to F·; point-preserves-compactness to σ)

\end{code}

\subsection{A useful lemma}

We now prove a lemma which we use when showing that these two maps form an
equivalence.

Given a sharp element `𝓍`, the element `sharp (pt 𝓍)` is exactly the join of
the compact approximants of `𝓍`.

\begin{code}

 sharp-equal-to-join-of-covering-family
  : (𝓍 : ♯𝓓)
  → ∐ 𝓓 (↓ᴮₛ-is-directed ⦅ 𝓍 ⦆) ＝ sharp₀ pt[ 𝓍 ]
 sharp-equal-to-join-of-covering-family (x , 𝕤) =
  antisymmetry 𝓓 (∐ 𝓓 (↓ᴮₛ-is-directed x)) (⋁ 𝒦-in-point↑ pt[ (x , 𝕤) ]) † ‡
   where
    γ : ((i , _) : ↓ᴮₛ x) → (sharp₀ pt[ x , 𝕤 ] ∈ₛ ↑ˢ[ βₖ i ]) holds
    γ (i , q) = in-point-implies-contains-sharp
                 pt[ x , 𝕤 ]
                 ↑ˢ[ βₖ i ]
                 (principal-filter-is-compact i)
                 (⊑ᴮₛ-to-⊑ᴮ q)

    δ : is-upperbound
         (underlying-order 𝓓)
         (∐ 𝓓 (↓ᴮₛ-is-directed x))
         (𝒦-in-point pt[ x , 𝕤 ] [_])
    δ (i , q) = ∐-is-upperbound 𝓓 (↓ᴮₛ-is-directed x) (i , ⊑ᴮ-to-⊑ᴮₛ q)

    † : (∐ 𝓓 (↓ᴮₛ-is-directed x)) ⊑⟨ 𝓓 ⟩ (⋁ 𝒦-in-point↑ pt[ (x , 𝕤) ])
    † = ∐-is-lowerbound-of-upperbounds
         𝓓
         (↓ᴮₛ-is-directed x)
         (⋁ 𝒦-in-point↑ pt[ x , 𝕤 ])
         γ

    ‡ : ((⋁ 𝒦-in-point↑ pt[ (x , 𝕤) ]) ⊑⟨ 𝓓 ⟩ ∐ 𝓓 (↓ᴮₛ-is-directed x))
    ‡ = sup-is-lowerbound-of-upperbounds
         (underlying-order 𝓓)
         (⋁-is-sup (𝒦-in-point↑ pt[ (x , 𝕤) ]))
         (∐ 𝓓 (↓ᴮₛ-is-directed x))
         δ

\end{code}

\subsection{The equivalence proof}

The fact that `sharp` is a retraction of `𝓅𝓉[_]` follows easily from the lemma
`sharp-equal-to-join-of-covering-family` above.

\begin{code}

 sharp-cancels-pt : (𝓍 : ♯𝓓) → sharp 𝓅𝓉[ 𝓍 ] ＝ 𝓍
 sharp-cancels-pt 𝓍 = to-sharp-＝ (sharp 𝓅𝓉[ 𝓍 ]) 𝓍 †
  where
   † : ⦅ sharp 𝓅𝓉[ 𝓍 ] ⦆ ＝ ⦅ 𝓍 ⦆
   † = ⦅ sharp 𝓅𝓉[ 𝓍 ] ⦆           ＝⟨ Ⅰ ⟩
       ∐ 𝓓 (↓ᴮₛ-is-directed ⦅ 𝓍 ⦆) ＝⟨ Ⅱ ⟩
       ⦅ 𝓍 ⦆                       ∎
        where
         Ⅰ = sharp-equal-to-join-of-covering-family 𝓍 ⁻¹
         Ⅱ = ↓ᴮₛ-∐-＝ ⦅ 𝓍 ⦆

\end{code}

The map `𝓅𝓉[_]` is a retraction of the map `sharp`.

\begin{code}

 pt-cancels-sharp : (ℱ : Spectral-Point Scott⦅𝓓⦆) → 𝓅𝓉[ sharp ℱ ] ＝ ℱ
 pt-cancels-sharp ℱ =
  to-spectral-point-＝ Scott⦅𝓓⦆ 𝓅𝓉[ sharp ℱ ] ℱ (dfunext fe †)
   where
    open Spectral-Point Scott⦅𝓓⦆ ℱ renaming (point-fn to F; point to ℱ₀)

    † : (𝔘 : ⟨ 𝒪 Scott⦅𝓓⦆ ⟩) → (sharp₀ ℱ₀ ∈ₛ 𝔘) ＝ F 𝔘
    † 𝔘@(U , s) = transport (λ - → (sharp₀ ℱ₀ ∈ₛ -) ＝ F -) (q ⁻¹) ‡
     where
      S : Fam 𝓤 ⟨ 𝒪 Scott⦅𝓓⦆ ⟩
      S = covering-familyₛ Scott⦅𝓓⦆ σᴰ 𝔘

      q : 𝔘 ＝ ⋁[ 𝒪 Scott⦅𝓓⦆ ] S
      q = basisₛ-covers-do-cover-eq Scott⦅𝓓⦆ σᴰ 𝔘

      ‡₁ : cofinal-in (𝟎-𝔽𝕣𝕞 pe) ⁅ sharp₀ ℱ₀ ∈ₛ 𝔘 ∣ 𝔘 ε S ⁆ ⁅ F 𝔘 ∣ 𝔘 ε S ⁆ holds
      ‡₁ k = ∣ k , sharp-in-scott-open-implies-in-point (S [ k ]) ℱ₀ ∣

      ‡₂ : cofinal-in (𝟎-𝔽𝕣𝕞 pe) ⁅ F 𝔘 ∣ 𝔘 ε S ⁆ ⁅ sharp₀ ℱ₀ ∈ₛ 𝔘 ∣ 𝔘 ε S ⁆ holds
      ‡₂ (ks , p) = ∣ (ks , p) , in-point-implies-contains-sharp⋆ ks ℱ₀ ∣

      ‡ : sharp₀ ℱ₀ ∈ₛ (⋁[ 𝒪 Scott⦅𝓓⦆ ] S) ＝ F (⋁[ 𝒪 Scott⦅𝓓⦆ ] S)
      ‡ = sharp₀ ℱ₀ ∈ₛ (⋁[ 𝒪 Scott⦅𝓓⦆ ] S)               ＝⟨ refl ⟩
          pt₀[ sharp₀ ℱ₀ ] (⋁[ 𝒪 Scott⦅𝓓⦆ ] S)           ＝⟨ Ⅰ    ⟩
          ⋁[ 𝟎-𝔽𝕣𝕞 pe ] ⁅ pt₀[ sharp₀ ℱ₀ ] 𝔘 ∣ 𝔘  ε S ⁆  ＝⟨ refl ⟩
          ⋁[ 𝟎-𝔽𝕣𝕞 pe ] ⁅ sharp₀ ℱ₀ ∈ₛ 𝔘 ∣ 𝔘 ε S ⁆       ＝⟨ Ⅱ    ⟩
          ⋁[ 𝟎-𝔽𝕣𝕞 pe ] ⁅ F 𝔘 ∣ 𝔘 ε S ⁆                  ＝⟨ Ⅲ    ⟩
          F (⋁[ 𝒪 Scott⦅𝓓⦆ ] S)                          ∎
           where
            Ⅰ = frame-homomorphisms-preserve-all-joins′
                 (𝒪 Scott⦅𝓓⦆)
                 (𝟎-𝔽𝕣𝕞 pe)
                 pt[ sharp ℱ ]
                 S
            Ⅱ = bicofinal-implies-same-join
                 (𝟎-𝔽𝕣𝕞 pe)
                 ⁅ sharp₀ ℱ₀ ∈ₛ 𝔘 ∣ 𝔘 ε S ⁆
                 ⁅ F 𝔘 ∣ 𝔘 ε S ⁆
                 ‡₁
                 ‡₂
            Ⅲ = frame-homomorphisms-preserve-all-joins′
                 (𝒪 Scott⦅𝓓⦆)
                 (𝟎-𝔽𝕣𝕞 pe)
                 ℱ₀
                 S ⁻¹

\end{code}

Finally, we conclude this development by giving the equivalence between the
sharp elements and the spectral points.

\begin{code}

 ♯𝓓-equivalent-to-spectral-points-of-Scott⦅𝓓⦆ : ♯𝓓 ≃ Spectral-Point Scott⦅𝓓⦆
 ♯𝓓-equivalent-to-spectral-points-of-Scott⦅𝓓⦆ = 𝓅𝓉[_] , qinvs-are-equivs 𝓅𝓉[_] †
  where
   † : qinv 𝓅𝓉[_]
   † = sharp , sharp-cancels-pt , pt-cancels-sharp

\end{code}

\section{Acknowledgements}

I am grateful to Tom de Jong for his comments on a write-up of the proof
formalized in this module.

\section{References}

- [1]: Tom de Jong. *Apartness, sharp elements, and the Scott topology of
  domains*.

  Mathematical Structures in Computer Science, vol. 33, no. 7,
  pp 573-604, August 2023. doi:10.1017/S0960129523000282

  https://doi.org/10.1017/S0960129523000282
