--------------------------------------------------------------------------------
title:          Frame isomorphisms
author:         Ayberk Tosun
date-started:   2024-04-11
date-completed: 2024-04-18
--------------------------------------------------------------------------------

Various formulations of the notion of frame isomorphism, and proofs of their
equivalences.

\begin{code}[hide]

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

open import MLTT.Spartan hiding (𝟚; ; )
open import UF.FunExt
open import UF.PropTrunc

module Locales.ContinuousMap.FrameIsomorphism-Definition
        (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 UF.Equiv
open import UF.Equiv-FunExt
open import UF.Logic
open import UF.Retracts
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.SubtypeClassifier

open AllCombinators pt fe
open FrameHomomorphismProperties
open FrameHomomorphisms

\end{code}

We work in a module parameterized by two frames `F` and `G`.

\begin{code}

module FrameIsomorphisms (F : Frame 𝓤 𝓥 𝓦) (G : Frame 𝓤' 𝓥' 𝓦) where

\end{code}

We start with the record-based definition of the notion of frame isomorphism.

\begin{code}

 record Isomorphismᵣ : 𝓤  𝓤'  𝓥  𝓥'  𝓦   ̇ where
  field
   𝓈 : F ─f→ G
   𝓇 : G ─f→ F

  s :  F    G 
  s = fun F G 𝓈

  r :  G    F 
  r = fun G F 𝓇

  s-is-homomorphism : is-a-frame-homomorphism F G s holds
  s-is-homomorphism = fun-is-a-frame-homomorphism F G 𝓈

  r-is-homomorphism : is-a-frame-homomorphism G F r holds
  r-is-homomorphism = fun-is-a-frame-homomorphism G F 𝓇

  field
   𝓇-cancels-𝓈 : r  s  id
   𝓈-cancels-𝓇 : s  r  id

\end{code}

We now show the equivalence of this to a Σ-based definition.

Given a frame homomorphism `F ─f→ G`, its type of homomorphic inverses is a
proposition.

\begin{code}

 homomorphic-inverse : (F ─f→ G)  𝓤  𝓤'  𝓥  𝓦   ̇
 homomorphic-inverse s =
  Σ r  (G ─f→ F) , fun F G s  fun G F r  id
                  × fun G F r  fun F G s  id

 homomorphic-inverse-is-prop : (h : F ─f→ G)  is-prop (homomorphic-inverse h)
 homomorphic-inverse-is-prop h (r , φ , ψ) (r′ , φ′ , ψ′) =
  to-subtype-=  (to-frame-homomorphism-= G F r r′ )
   where
     : (h′ : G ─f→ F)
       is-prop (fun F G h  fun G F h′  id × fun G F h′  fun F G h  id)
     h′ = ×-is-prop
            (Π-is-prop fe  _  carrier-of-[ poset-of G ]-is-set))
            (Π-is-prop fe  _  carrier-of-[ poset-of F ]-is-set))

    ϑ : fun F G h  fun G F r  fun F G h  fun G F r′
    ϑ y = fun F G h (fun G F r y)   =⟨  
          y                         =⟨  
          fun F G h (fun G F r′ y)  
           where
             = φ y
             = φ′ y ⁻¹

    ξ : left-cancellable (fun F G h)
    ξ = sections-are-lc (fun F G h) (fun G F r , ψ)

     : (y :  G )  fun G F r y  fun G F r′ y
     y = ξ (ϑ y)

\end{code}

To say that a frame homomorphism is an isomorphism is to say that its type
of homomorphic inverses is inhabited.

\begin{code}

 is-isomorphism : (F ─f→ G)  Ω (𝓤  𝓤'  𝓥  𝓦 )
 is-isomorphism h = homomorphic-inverse h , homomorphic-inverse-is-prop h

\end{code}

We define the type of isomorphisms between frames `F` and `G` accordingly.

\begin{code}

 Isomorphism : 𝓤  𝓤'  𝓥  𝓥'  𝓦   ̇
 Isomorphism = Σ h  F ─f→ G , is-isomorphism h holds

\end{code}

It is immediate that `Isomorphism` and `Isomorphismᵣ` are equivalent types.

\begin{code}

 isomorphism-to-isomorphismᵣ : Isomorphism  Isomorphismᵣ
 isomorphism-to-isomorphismᵣ (𝓈 , 𝓇 , φ , ψ) =
  record
   { 𝓈           = 𝓈
   ; 𝓇           = 𝓇
   ; 𝓇-cancels-𝓈 = ψ
   ; 𝓈-cancels-𝓇 = φ
  }

 isomorphismᵣ-to-isomorphism : Isomorphismᵣ  Isomorphism
 isomorphismᵣ-to-isomorphism iso =
  let
   open Isomorphismᵣ iso
  in
   𝓈 , 𝓇 , 𝓈-cancels-𝓇 , 𝓇-cancels-𝓈

 isomorphism-equiv-to-isomorphismᵣ : Isomorphism  Isomorphismᵣ
 isomorphism-equiv-to-isomorphismᵣ = isomorphism-to-isomorphismᵣ
                                   , (isomorphismᵣ-to-isomorphism , λ _  refl)
                                   , (isomorphismᵣ-to-isomorphism , λ _  refl)

\end{code}

We now give an alternative definition of the same notion, which is more
convenient to use for the SIP.

The predicate `is-homomorphic` below expresses what it means for an equivalence
between the carrier sets of `F` and `G` to be homomorphic.

\begin{code}

 is-homomorphic : ( F    G )  Ω (𝓤  𝓥  𝓤'  𝓥'  𝓦 )
 is-homomorphic e = is-a-frame-homomorphism F G  e 
                   is-a-frame-homomorphism G F (e⁻¹ (⌜⌝-is-equiv e))
  where
   e⁻¹ = inverse  e 

\end{code}

The type of isomorphisms between `F` and `G` could alternatively be defined
as the type of homomorphic equivalences.

\begin{code}

 Isomorphism₀ : 𝓤  𝓤'  𝓥  𝓥'  𝓦   ̇
 Isomorphism₀ = Σ e   F    G  , is-homomorphic e holds

\end{code}

These two notions of frame isomorphism are equivalent.

\begin{code}

 isomorphismᵣ-to-isomorphism₀ : Isomorphismᵣ  Isomorphism₀
 isomorphismᵣ-to-isomorphism₀ iso = (s ,  , ) , φ , ψ
  where
   open Isomorphismᵣ iso

    : has-section s
    = r , 𝓈-cancels-𝓇

    : is-section s
    = r , 𝓇-cancels-𝓈

   φ : is-a-frame-homomorphism F G s holds
   φ = fun-is-a-frame-homomorphism F G 𝓈

   ψ : is-a-frame-homomorphism G F r holds
   ψ = fun-is-a-frame-homomorphism G F 𝓇

 isomorphism₀-to-isomorphismᵣ : Isomorphism₀  Isomorphismᵣ
 isomorphism₀-to-isomorphismᵣ (e , φ , ψ)  =
  record
   { 𝓈           =  e  , φ
   ; 𝓇           = inverse  e  (⌜⌝-is-equiv e) , ψ
   ; 𝓇-cancels-𝓈 = inverses-are-retractions  e  (⌜⌝-is-equiv e)
   ; 𝓈-cancels-𝓇 = inverses-are-sections  e  (⌜⌝-is-equiv e)
  }

 isomorphism-to-isomorphism₀ : Isomorphism  Isomorphism₀
 isomorphism-to-isomorphism₀ =
  isomorphismᵣ-to-isomorphism₀  isomorphism-to-isomorphismᵣ

 isomorphism₀-to-isomorphism : Isomorphism₀  Isomorphism
 isomorphism₀-to-isomorphism =
  isomorphismᵣ-to-isomorphism  isomorphism₀-to-isomorphismᵣ

 isomorphism-equivalent-to-isomorphism₀ : Isomorphism  Isomorphism₀
 isomorphism-equivalent-to-isomorphism₀ = isomorphism-to-isomorphism₀
                                        , (isomorphism₀-to-isomorphism , )
                                        , (isomorphism₀-to-isomorphism , )
  where
    : isomorphism-to-isomorphism₀  isomorphism₀-to-isomorphism  id
    (h , _) =
    to-subtype-=
     (holds-is-prop  is-homomorphic)
     (to-subtype-= (being-equiv-is-prop  𝓤 𝓥  fe {𝓤} {𝓥})) refl)

    : isomorphism₀-to-isomorphism  isomorphism-to-isomorphism₀  id
    iso = to-subtype-= (holds-is-prop  is-isomorphism) refl

 isomorphismᵣ-equivalent-to-isomorphism₀ : Isomorphismᵣ  Isomorphism₀
 isomorphismᵣ-equivalent-to-isomorphism₀ =
  Isomorphismᵣ   ≃⟨  
  Isomorphism    ≃⟨  
  Isomorphism₀   
   where
     = ≃-sym isomorphism-equiv-to-isomorphismᵣ
     = isomorphism-equivalent-to-isomorphism₀

\end{code}

Some nice syntax for frame isomorphisms.

\begin{code}

Isomorphismᵣ-Syntax : Frame 𝓤 𝓥 𝓦  Frame 𝓤' 𝓥' 𝓦  𝓤  𝓤'  𝓥  𝓥'  𝓦   ̇
Isomorphismᵣ-Syntax = FrameIsomorphisms.Isomorphismᵣ

infix 0 Isomorphismᵣ-Syntax
syntax Isomorphismᵣ-Syntax F G = F ≅f≅ G

\end{code}

Added on 2024-04-14.

We denote by `𝔦𝔡` the identity equivalence on the carrier set of a frame.

\begin{code}

𝔦𝔡 : (L : Frame 𝓤 𝓥 𝓦)   L    L 
𝔦𝔡 L = ≃-refl  L 

\end{code}

The proof that `𝔦𝔡` preserves the top element and meets is definitional.

\begin{code}

𝔦𝔡-preserves-top : (L : Frame 𝓤 𝓥 𝓦)  preserves-top L L  𝔦𝔡 L  holds
𝔦𝔡-preserves-top L = refl

𝔦𝔡-preserves-binary-meets : (L : Frame 𝓤 𝓥 𝓦)
                           preserves-binary-meets L L  𝔦𝔡 L  holds
𝔦𝔡-preserves-binary-meets _ _ _ = refl

\end{code}

The fact that it preserves joins is also direct.

\begin{code}

𝔦𝔡-preserves-joins : (L : Frame 𝓤 𝓥 𝓦)  preserves-joins L L  𝔦𝔡 L  holds
𝔦𝔡-preserves-joins L S =  , 
 where
  open Joins  x y  x ≤[ poset-of L ] y)

   : ((⋁[ L ] S) is-an-upper-bound-of S) holds
   = ⋁[ L ]-upper S

   : ((u , _) : upper-bound S)  ((⋁[ L ] S) ≤[ poset-of L ] u) holds
   = ⋁[ L ]-least S

\end{code}

We package these up together into the proof `𝔦𝔡-is-frame-homomorphism`,
and denote this frame homomorphism by `𝔦𝔡ₕ`.

\begin{code}

𝔦𝔡-is-frame-homomorphism : (L : Frame 𝓤 𝓥 𝓦)
                          is-a-frame-homomorphism L L  𝔦𝔡 L  holds
𝔦𝔡-is-frame-homomorphism L = 𝔦𝔡-preserves-top L
                           , 𝔦𝔡-preserves-binary-meets L
                           , 𝔦𝔡-preserves-joins L

𝔦𝔡ₕ : (L : Frame 𝓤 𝓥 𝓦)  L ─f·→ L
𝔦𝔡ₕ L =
 frame-homomorphism-to-frame-homomorphismᵣ
  L
  L
  ( 𝔦𝔡 L  , 𝔦𝔡-is-frame-homomorphism L)

\end{code}

Finally, we record the fact that the identity equivalence is a homomorphic
equivalence.

\begin{code}

𝔦𝔡-is-homomorphic : (L : Frame 𝓤 𝓥 𝓦)
                   FrameIsomorphisms.is-homomorphic L L (𝔦𝔡 L) holds
𝔦𝔡-is-homomorphic L =
 𝔦𝔡-is-frame-homomorphism L , 𝔦𝔡-is-frame-homomorphism L

\end{code}