Ayberk Tosun, 11 September 2023

\begin{code}[hide]

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

open import UF.FunExt
open import UF.PropTrunc

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

open import Locales.AdjointFunctorTheoremForFrames
open import Locales.Compactness.Definition pt fe
open import Locales.ContinuousMap.Definition pt fe
open import Locales.ContinuousMap.FrameHomomorphism-Properties pt fe
open import Locales.Frame pt fe
open import Locales.GaloisConnection pt fe
open import Locales.Spectrality.Properties     pt fe
open import Locales.Spectrality.SpectralLocale pt fe
open import Locales.WayBelowRelation.Definition pt fe
open import MLTT.Spartan hiding (𝟚)
open import Slice.Family
open import UF.Logic
open import UF.SubtypeClassifier

open AllCombinators pt fe
open ContinuousMaps
open FrameHomomorphismProperties
open Locale
open PropositionalTruncation pt

\end{code}

\begin{code}

module SpectralMaps (X : Locale 𝓀' π“₯ π“₯) (Y : Locale 𝓀 π“₯ π“₯) where

 is-spectral-map : (X ─cβ†’ Y) β†’ Ξ© (𝓀 βŠ” 𝓀' βŠ” π“₯ ⁺)
 is-spectral-map (f , _) =
  β±― U κž‰ ⟨ π’ͺ Y ⟩ , is-compact-open Y U  β‡’ is-compact-open X (f U)

module PerfectMaps (X : Locale 𝓀 π“₯ π“₯) (Y : Locale 𝓀' π“₯ π“₯)
                                      (𝒷 : has-basis (π’ͺ Y) holds) where

 open AdjointFunctorTheorem pt fe X Y 𝒷
 open ContinuousMapNotation X Y

\end{code}

A continuous map `f : X β†’ Y` is called *perfect* if its right adjoint is
Scott-continuous.

\begin{code}

 is-perfect-map : (X ─cβ†’ Y) β†’ Ξ© (𝓀 βŠ” 𝓀' βŠ” π“₯ ⁺)
 is-perfect-map f = is-scott-continuous (π’ͺ X) (π’ͺ Y) (pr₁ (right-adjoint-of f))

\end{code}

\begin{code}

\end{code}

Perfect maps preserve the way below relation.

\begin{code}

 perfect-preserves-way-below : (𝒻 : X ─cβ†’ Y)
                             β†’ is-perfect-map 𝒻 holds
                             β†’ (U V : ⟨ π’ͺ Y ⟩)
                             β†’ (U β‰ͺ[ π’ͺ Y ] V) holds
                             β†’ (𝒻 β‹†βˆ™ U β‰ͺ[ π’ͺ X ] 𝒻 β‹†βˆ™ V) holds
 perfect-preserves-way-below f Ο† U V Ο‘ S Ξ΄ p = Ξ³
  where
   open GaloisConnectionBetween (poset-of (π’ͺ Y)) (poset-of (π’ͺ X))
   open PosetReasoning (poset-of (π’ͺ Y))

   T : Fam π“₯ ⟨ π’ͺ Y ⟩
   T = ⁅ f ⁎· V ∣ V Ξ΅ S ⁆

   ΢₁ : (V ≀[ poset-of (π’ͺ Y) ] (f ⁎· (⋁[ π’ͺ X ] S))) holds
   ΢₁ = adjunction-inequality-forward f (join-of (π’ͺ X) S) V p

   ΞΆβ‚‚ : (V ≀[ poset-of (π’ͺ Y) ] (⋁[ π’ͺ Y ] ⁅ f ⁎· V ∣ V Ξ΅ S ⁆)) holds
   ΞΆβ‚‚ = V                             β‰€βŸ¨ ΢₁ ⟩
        f ⁎· (⋁[ π’ͺ X ] S)             =⟨ †  βŸ©β‚š
        ⋁[ π’ͺ Y ] ⁅ f ⁎· V ∣ V Ξ΅ S ⁆   β– 
         where
          † = scott-continuous-join-eq (π’ͺ X) (π’ͺ Y) (f ⁎·_) Ο† S Ξ΄

   T-is-directed : is-directed (π’ͺ Y) T holds
   T-is-directed =
    monotone-image-on-directed-family-is-directed (π’ͺ X) (π’ͺ Y) S Ξ΄ (f ⁎·_) ΞΌ
     where
      ΞΌ : is-monotonic (poset-of (π’ͺ X)) (poset-of (π’ͺ Y)) (f ⁎·_) holds
      ΞΌ = prβ‚‚ (right-adjoint-of f)

   Ξ³ : (Ǝ k κž‰ index S , ((f β‹†βˆ™ U) ≀[ poset-of (π’ͺ X) ] (S [ k ])) holds) holds
   Ξ³ = βˆ₯βˆ₯-rec βˆƒ-is-prop Ο΅ (Ο‘ T T-is-directed ΞΆβ‚‚)
    where
     Ο΅ : _
     Ο΅ (k , q) = ∣ k , † ∣
      where
       † : ((f β‹†βˆ™ U) ≀[ poset-of (π’ͺ X) ] (S [ k ])) holds
       † = adjunction-inequality-backward f (S [ k ]) U q

\end{code}

\begin{code}

 compact-codomain-of-perfect-map-implies-compact-domain : (𝒻 : X ─cβ†’ Y)
                                                        β†’ is-perfect-map 𝒻 holds
                                                        β†’ is-compact Y holds
                                                        β†’ is-compact X holds
 compact-codomain-of-perfect-map-implies-compact-domain 𝒻@(f , Ο† , _) p ΞΊ = Ξ³
  where
   Ξ² : (f 𝟏[ π’ͺ Y ] β‰ͺ[ π’ͺ X ] f 𝟏[ π’ͺ Y ]) holds
   Ξ² = perfect-preserves-way-below 𝒻 p 𝟏[ π’ͺ Y ] 𝟏[ π’ͺ Y ] ΞΊ

   Ξ³ : (𝟏[ π’ͺ X ] β‰ͺ[ π’ͺ X ] 𝟏[ π’ͺ X ]) holds
   Ξ³ = transport (Ξ» - β†’ (- β‰ͺ[ π’ͺ X ] -) holds) Ο† Ξ²

\end{code}

\begin{code}

 open SpectralMaps X Y

 perfect-maps-are-spectral : (f : X ─cβ†’ Y)
                           β†’ (is-perfect-map f β‡’ is-spectral-map f) holds
 perfect-maps-are-spectral 𝒻@(f , _) Ο† U ΞΊ =
  perfect-preserves-way-below 𝒻 Ο† U U ΞΊ

\end{code}

\begin{code}

 open Joins (Ξ» x y β†’ x ≀[ poset-of (π’ͺ Y) ] y)

 scott-continuous-join-eq⁻ : (h : ⟨ π’ͺ X ⟩ β†’ ⟨ π’ͺ Y ⟩)
                           β†’ ((S : Fam π“₯ ⟨ π’ͺ X ⟩)
                              β†’ is-directed (π’ͺ X) S holds
                              β†’ h (⋁[ π’ͺ X ] S) = ⋁[ π’ͺ Y ] ⁅ h V ∣ V Ξ΅ S ⁆)
                           β†’ is-scott-continuous (π’ͺ X) (π’ͺ Y) h holds
 scott-continuous-join-eq⁻ h Ο† S Ξ΄ =
  transport
   (Ξ» - β†’ (- is-lub-of ⁅ h V ∣ V Ξ΅ S ⁆) holds)
   (Ο† S Ξ΄ ⁻¹)
   (⋁[ π’ͺ Y ]-upper ⁅ h V ∣ V Ξ΅ S ⁆ , ⋁[ π’ͺ Y ]-least ⁅ h V ∣ V Ξ΅ S ⁆)

 open GaloisConnectionBetween (poset-of (π’ͺ Y)) (poset-of (π’ͺ X))

 spectral-maps-are-perfect : is-spectral Y holds
                           β†’ (f : X ─cβ†’ Y)
                           β†’ (is-spectral-map f β‡’ is-perfect-map f) holds
 spectral-maps-are-perfect 𝕀 f Οƒ S Ξ΄ = scott-continuous-join-eq⁻ fβ‚Š † S Ξ΄
  where
   open PosetNotation (poset-of (π’ͺ X))
   open PosetNotation (poset-of (π’ͺ Y)) renaming (_≀_ to _≀y_)

   infix -2 _β‰€βˆ™_
   _β‰€βˆ™_ = _≀y_

   fβ‚Šβ‚˜ : poset-of (π’ͺ X) ─mβ†’ poset-of (π’ͺ Y)
   fβ‚Šβ‚˜ = right-adjoint-of f

   f⁺ : ⟨ π’ͺ Y ⟩ β†’ ⟨ π’ͺ X ⟩
   f⁺ = f β‹†βˆ™_

   fβΊβ‚˜ : poset-of (π’ͺ Y) ─mβ†’ poset-of (π’ͺ X)
   fβΊβ‚˜ = f⁺ , frame-morphisms-are-monotonic (π’ͺ Y) (π’ͺ X) f⁺ (prβ‚‚ f)

   fβ‚Š : ⟨ π’ͺ X ⟩ β†’ ⟨ π’ͺ Y ⟩
   fβ‚Š = f ⁎·_

   𝕒 : (fβΊβ‚˜ ⊣ fβ‚Šβ‚˜) holds
   𝕒 = fβ‚Š-is-right-adjoint-of-f⁺ f

   † : (S : Fam π“₯ ⟨ π’ͺ X ⟩)
     β†’ is-directed (π’ͺ X) S holds
     β†’ f ⁎· (⋁[ π’ͺ X ] S) = ⋁[ π’ͺ Y ] ⁅ f ⁎· V ∣ V Ξ΅ S ⁆
   † S Ξ΄ = ≀-is-antisymmetric (poset-of (π’ͺ Y)) †₁ †₂
    where
     open PosetReasoning (poset-of (π’ͺ X))
     open PosetReasoning (poset-of (π’ͺ Y)) using    ()
                                          renaming (_β‰€βŸ¨_⟩_ to _β‰€βŸ¨_βŸ©βˆ™_;
                                                    _β–  to _π””π”ˆπ”‡)

     Ο‘ : ((f ⁎· (⋁[ π’ͺ X ] S)) ≀ₖ[ Y ] (⋁[ π’ͺ Y ] ⁅ f ⁎· V ∣ V Ξ΅ S ⁆)) holds
     Ο‘ (K , ΞΊ) p = βˆ₯βˆ₯Ξ©-rec β€» (ΞΊβ€² S Ξ΄ q)
      where
       ΞΊβ€² : is-compact-open X (f⁺ K) holds
       ΞΊβ€² = Οƒ K ΞΊ

       q : (f⁺ K ≀ (⋁[ π’ͺ X ] S)) holds
       q = adjunction-inequality-backward f (⋁[ π’ͺ X ] S) K p

       β€» : Ξ£ k κž‰ index S , (f⁺ K ≀ S [ k ]) holds
         β†’ (K β‰€βˆ™ ⋁[ π’ͺ Y ] ⁅ f ⁎· V ∣ V Ξ΅ S ⁆) holds
       β€» (k , p) =
        K                           β‰€βŸ¨ β…   βŸ©βˆ™
        f ⁎· (S [ k ])              β‰€βŸ¨ β…‘ βŸ©βˆ™
        ⋁[ π’ͺ Y ] ⁅ f ⁎· V ∣ V Ξ΅ S ⁆ π””π”ˆπ”‡
         where
          β…  = adjunction-inequality-forward f (S [ k ]) K p
          β…‘ = ⋁[ π’ͺ Y ]-upper ⁅ f ⁎· V ∣ V Ξ΅ S ⁆ k

     †₁ : (f ⁎· (⋁[ π’ͺ X ] S) β‰€βˆ™ ⋁[ π’ͺ Y ] ⁅ f ⁎· V ∣ V Ξ΅ S ⁆) holds
     †₁ =
      spectral-yoneda Y 𝕀 (f ⁎· (⋁[ π’ͺ X ] S)) (⋁[ π’ͺ Y ] ⁅ f ⁎· V ∣ V Ξ΅ S ⁆) Ο‘

     ‑₂ : (f β‹†βˆ™ (⋁[ π’ͺ Y ] ⁅ f ⁎· V ∣ V Ξ΅ S ⁆) ≀ (⋁[ π’ͺ X ] S)) holds
     ‑₂ =
      f β‹†βˆ™ (⋁[ π’ͺ Y ] ⁅ f ⁎· V ∣ V Ξ΅ S ⁆)       =⟨ β…  βŸ©β‚š
      ⋁[ π’ͺ X ] ⁅ f β‹†βˆ™ (f ⁎· V) ∣ V Ξ΅ S ⁆       β‰€βŸ¨ β…‘ ⟩
      ⋁[ π’ͺ X ] ⁅ V ∣ V Ξ΅ S ⁆                   β– 
       where
        β€» : cofinal-in (π’ͺ X) ⁅ f β‹†βˆ™ (f ⁎· V) ∣ V Ξ΅ S ⁆ S holds
        β€» i = ∣ i , counit fβΊβ‚˜ fβ‚Šβ‚˜ 𝕒 (S [ i ]) ∣

        β…  = continuity-of X Y f ⁅ f ⁎· V ∣ V Ξ΅ S ⁆
        β…‘ = cofinal-implies-join-covered
             (π’ͺ X)
             ⁅ f β‹†βˆ™ (f ⁎· V) ∣ V Ξ΅ S ⁆
             S
             β€»

     †₂ : (⋁[ π’ͺ Y ] ⁅ f ⁎· V ∣ V Ξ΅ S ⁆ β‰€βˆ™ f ⁎· (⋁[ π’ͺ X ] S)) holds
     †₂ = adjunction-inequality-forward
           f
           (⋁[ π’ͺ X ] S)
           (⋁[ π’ͺ Y ] ⁅ f ⁎· V ∣ V Ξ΅ S ⁆)
           ‑₂


\end{code}