\begin{code}

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

open import MLTT.Spartan
open import UF.PropTrunc
open import UF.FunExt
open import UF.Logic
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.EquivalenceExamples
open import UF.Base

module Locales.ClassificationOfScottOpens
        (𝓀  : Universe)
        (pt : propositional-truncations-exist)
        (pe : propext 𝓀)
        (fe : Fun-Ext) where

open Universal fe
open Implication fe
open Existential pt
open Conjunction

open import DomainTheory.Basics.Dcpo pt fe 𝓀 renaming (⟨_⟩ to ⟨_βŸ©βˆ™)
open import DomainTheory.Topology.ScottTopology pt fe 𝓀
open import DomainTheory.Basics.Pointed pt fe 𝓀
open import DomainTheory.Lifting.LiftingSet pt fe
open import DomainTheory.Basics.Miscelanea pt fe 𝓀
open import Lifting.Construction 𝓀
open import UF.SubtypeClassifier
open import UF.Subsingletons-Properties
open import Slice.Family
open import UF.Equiv
open PropositionalTruncation pt

\end{code}

We first define the Sierpinski domain.

\begin{code}

π•Š : DCPOβŠ₯
π•Š = 𝓛-DCPOβŠ₯ 𝓀 pe (props-are-sets {X = πŸ™ {𝓀 ⁺}} πŸ™-is-prop)

\end{code}

\begin{code}

module _ {𝓓 : DCPOβŠ₯ {𝓀 ⁺} {𝓀}} where

 to-predicateβ‚€ : DCPOβŠ₯[ 𝓓 , π•Š ] β†’ (βŸͺ 𝓓 ⟫ β†’ Ξ© 𝓀)
 to-predicateβ‚€ (f , p) x = is-defined (f x) , being-defined-is-prop (f x)

 open DefnOfScottTopology (𝓓 ⁻) 𝓀

 predicate-is-upwards-closed : (𝒻 : DCPOβŠ₯[ 𝓓 , π•Š ])
                             β†’ is-upwards-closed (to-predicateβ‚€ 𝒻) holds
 predicate-is-upwards-closed 𝒻@(f , Ο…) x y p q =
  transport is-defined (ΞΌ x y q p) p
   where
    ΞΌ : is-monotone (𝓓 ⁻) (π•Š ⁻) f
    ΞΌ = monotone-if-continuous (𝓓 ⁻) (π•Š ⁻) 𝒻

 ⋁ₛ_ : (Ξ£ S κž‰ Fam 𝓀 βŸͺ π•Š ⟫ , is-Directed (π•Š ⁻) (S .prβ‚‚)) β†’ βŸͺ π•Š ⟫
 ⋁ₛ (S , Ξ΄) = the-sup
               (underlying-order (π•Š ⁻))
               (directed-completeness (π•Š ⁻) (index S) (S [_]) Ξ΄)

 image-on-directed-set-is-directed : {I : 𝓀  Μ‡ }(𝒻 : DCPOβŠ₯[ 𝓓 , π•Š ])
                                   β†’ (Ξ± : I β†’ βŸͺ 𝓓 ⟫)
                                   β†’ is-Directed (𝓓 ⁻) Ξ±
                                   β†’ is-Directed (π•Š ⁻) (𝒻 .pr₁ ∘ Ξ±)
 image-on-directed-set-is-directed {I = I} 𝒻@(f , _) Ξ± (∣i∣ , Ο…) = ∣i∣ , †
  where
   ΞΌ : is-monotone (𝓓 ⁻) (π•Š ⁻) f
   ΞΌ = monotone-if-continuous (𝓓 ⁻) (π•Š ⁻) 𝒻

   † : is-semidirected (underlying-order (π•Š ⁻)) (𝒻 .pr₁ ∘ Ξ±)
   † i j = βˆ₯βˆ₯-rec βˆƒ-is-prop Ξ³ (Ο… i j)
    where
     Ξ³ : Ξ£ k κž‰ I , Ξ± i βŠ‘βŸ¨ 𝓓 ⁻ ⟩ Ξ± k Γ— Ξ± j βŠ‘βŸ¨ 𝓓 ⁻ ⟩ Ξ± k
       β†’ βˆƒ k κž‰ I , f (Ξ± i) βŠ‘βŸ¨ π•Š ⁻ ⟩ f (Ξ± k) Γ— f (Ξ± j) βŠ‘βŸ¨ π•Š ⁻ ⟩ f (Ξ± k)
     Ξ³ (k , p₁ , pβ‚‚) = ∣ k , ΞΌ (Ξ± i) (Ξ± k) p₁ , ΞΌ (Ξ± j) (Ξ± k) pβ‚‚ ∣

 predicate-is-ibdj : (𝒻 : DCPOβŠ₯[ 𝓓 , π•Š ])
                   β†’ is-inaccessible-by-directed-joins (to-predicateβ‚€ 𝒻) holds
 predicate-is-ibdj 𝒻@(f , ΞΆ) (S , (δ₁ , Ξ΄β‚‚)) p = βˆ₯βˆ₯-rec βˆƒ-is-prop ‑ †
  where
   ΞΌ : is-monotone (𝓓 ⁻) (π•Š ⁻) f
   ΞΌ = monotone-if-continuous (𝓓 ⁻) (π•Š ⁻) 𝒻

   Ξ΄β€² : is-Directed (π•Š ⁻) (⁅ f x ∣ x Ξ΅ S ⁆ [_])
   Ξ΄β€² = image-on-directed-set-is-directed 𝒻 (S .prβ‚‚) (δ₁ , Ξ΄β‚‚)

   d : has-sup (underlying-order (π•Š ⁻)) (⁅ f x ∣ x Ξ΅ S ⁆ [_])
   d = directed-completeness (π•Š ⁻) (index S) (⁅ f x ∣ x Ξ΅ S ⁆ [_]) Ξ΄β€²

   ♣ : f (∐ (𝓓 ⁻) (δ₁ , Ξ΄β‚‚)) = the-sup (underlying-order (π•Š ⁻)) d
   ♣ = sups-are-unique
        (underlying-order (π•Š ⁻))
        (pr₁ (axioms-of-dcpo (π•Š ⁻)))
        (⁅ f x ∣ x Ξ΅ S ⁆ [_])
        (ΞΆ (index S) (S [_]) (δ₁ , Ξ΄β‚‚))
        (sup-property
         (underlying-order (π•Š ⁻))
         (directed-completeness (π•Š ⁻) (index S) (⁅ f x ∣ x Ξ΅ S ⁆ .prβ‚‚) Ξ΄β€²))

   † : is-defined (⋁ₛ (⁅ f x ∣ x Ξ΅ S ⁆ , Ξ΄β€²))
   † = transport is-defined ♣ p

   ‑ : Ξ£ i κž‰ index S , is-defined (f (S [ i ]))
     β†’ βˆƒ i κž‰ index S , to-predicateβ‚€ 𝒻 (S [ i ]) holds
   ‑ (i , p) = ∣ i , p ∣

 to-predicate : DCPOβŠ₯[ 𝓓 , π•Š ] β†’ π’ͺβ‚›
 to-predicate 𝒻@(f , _) = to-predicateβ‚€ 𝒻
                        , predicate-is-upwards-closed 𝒻
                        , predicate-is-ibdj 𝒻

 to-π•Š-mapβ‚€ : (βŸͺ 𝓓 ⟫ β†’ Ξ© 𝓀) β†’ (βŸͺ 𝓓 ⟫ β†’ βŸͺ π•Š ⟫)
 to-π•Š-mapβ‚€ P x = P x holds , (Ξ» _ β†’ ⋆) , holds-is-prop (P x)

 to-π•Š-map : π’ͺβ‚› β†’ DCPOβŠ₯[ 𝓓 , π•Š ]
 to-π•Š-map (P , Ο… , ΞΉ) = to-π•Š-mapβ‚€ P , c
  where
   c : is-continuous (𝓓 ⁻) (π•Š ⁻) (to-π•Š-mapβ‚€ P)
   c I Ξ± Ξ΄ = †
    where
     u = sup-property
          (underlying-order (𝓓 ⁻))
          (directed-completeness (𝓓 ⁻) (index (I , Ξ±)) Ξ± Ξ΄)

     † : is-sup
          (underlying-order (π•Š ⁻))
          (to-π•Š-mapβ‚€ P (⋁ ((I , Ξ±) , Ξ΄)))
          (to-π•Š-mapβ‚€ P ∘ Ξ±)
     † = †₀ , †₁
      where
       †₀ : (i : I)
          β†’ to-π•Š-mapβ‚€ P (Ξ± i) βŠ‘βŸ¨ π•Š ⁻ ⟩ to-π•Š-mapβ‚€ P (⋁ ((I , Ξ±) , Ξ΄))
       †₀ i p = to-subtype-= β™  ♣
        where
         q : (Ξ± i βŠ‘βŸ¨ 𝓓 ⁻ βŸ©β‚š (⋁ ((I , Ξ±) , Ξ΄))) holds
         q = sup-is-upperbound (underlying-order (𝓓 ⁻)) u i

         β…  : P (Ξ± i) holds = πŸ™
         β…  = pr₁ (pr₁ (prβ‚‚ (πŸ™-=-≃ (P (Ξ± i) holds) fe pe (holds-is-prop (P (Ξ± i)))))) p ⁻¹

         β…‘ : πŸ™ = P (⋁ ((I , Ξ±) , Ξ΄)) holds
         β…‘ = pr₁
              (pr₁ (prβ‚‚ (πŸ™-=-≃ (P (⋁ ((I , Ξ±) , Ξ΄)) holds) fe pe (holds-is-prop _))))
              (Ο… (Ξ± i) (⋁ ((I , Ξ±) , Ξ΄)) p q)

         β™  : (P : 𝓀  Μ‡ ) β†’ is-prop ((P β†’ πŸ™) Γ— is-prop P)
         β™  _ = Γ—-is-prop (Ξ -is-prop fe (Ξ» _ β†’ πŸ™-is-prop)) (being-prop-is-prop fe)

         ♣ : P (Ξ± i) holds = P (⋁ ((I , Ξ±) , Ξ΄)) holds
         ♣ = P (Ξ± i) holds =⟨ β…  ⟩ πŸ™ =⟨ β…‘ ⟩ P (⋁ ((I , Ξ±) , Ξ΄)) holds ∎

       †₁ : is-lowerbound-of-upperbounds
             (underlying-order (π•Š ⁻))
             (to-π•Š-mapβ‚€ P (⋁ ((I , Ξ±) , Ξ΄)))
             (to-π•Š-mapβ‚€ P ∘ Ξ±)
       †₁ 𝒬@(Q , (h , p)) Ο† q =
        βˆ₯βˆ₯-rec (sethood (π•Š ⁻)) †₂ (ΞΉ ((I , Ξ±) , Ξ΄) q)
         where
          †₂ : Ξ£ i κž‰ I , P (Ξ± i) holds
             β†’ to-π•Š-mapβ‚€ P (⋁ ((I , Ξ±) , Ξ΄)) = 𝒬
          †₂ (i , r) = to-subtype-= β™  ♣
           where
            β™  : (Q : 𝓀  Μ‡ ) (x y : Ξ  (Ξ» _ β†’ πŸ™) Γ— is-prop Q) β†’ x = y
            β™  _ = Γ—-is-prop
                   (Ξ -is-prop fe (Ξ» _ β†’ πŸ™-is-prop))
                   (being-prop-is-prop fe)

            eq : P (α i) holds = Q
            eq = pr₁ (from-Ξ£-= (Ο† i r))

            upper : (Ξ± i βŠ‘βŸ¨ 𝓓 ⁻ βŸ©β‚š (⋁ ((I , Ξ±) , Ξ΄))) holds
            upper = sup-is-upperbound (underlying-order (𝓓 ⁻)) u i

            pβ‚‚ : P (⋁ ((I , Ξ±) , Ξ΄)) holds
            pβ‚‚ = Ο… (Ξ± i) (⋁ ((I , Ξ±) , Ξ΄)) r upper

            Q-holds : Q
            Q-holds = transport id eq r

            ♣ : P (⋁ ((I , Ξ±) , Ξ΄)) holds = Q
            ♣ = pe (holds-is-prop _) p (Ξ» _ β†’ Q-holds) (Ξ» _ β†’ pβ‚‚)

 section : (U : π’ͺβ‚›) β†’ to-predicate (to-π•Š-map U) = U
 section U =
  to-subtype-= (holds-is-prop ∘ is-scott-open) (dfunext fe Ξ» _ β†’ refl)

 retract : (f : DCPOβŠ₯[ 𝓓 , π•Š ]) β†’ to-π•Š-map (to-predicate f) = f
 retract f =
  to-subtype-= (being-continuous-is-prop (𝓓 ⁻) (π•Š ⁻)) (dfunext fe †)
   where
    † : (x : βŸͺ 𝓓 ⟫) β†’ to-π•Š-mapβ‚€ (to-predicate f .pr₁) x = f .pr₁ x
    † x = refl {x = f .pr₁ x}

 bijection : π’ͺβ‚› ≃ DCPOβŠ₯[ 𝓓 , π•Š ]
 bijection = to-π•Š-map , ((to-predicate , retract) , to-predicate , section)

\end{code}