--------------------------------------------------------------------------------
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}