-------------------------------------------------------------------------------- title: Frame homomorphisms author: Ayberk Tosun date-started: 2024-04-10 -------------------------------------------------------------------------------- Originally written as part of Ayberk Tosun's MSc thesis on 2020-02-23. Ported to TypeTopology as part of the `Locales.Frame` module on 2021-03-09. Factored out from the `Locales.Frame` module into this module on 2024-04-10. \begin{code}[hide] {-# OPTIONS --safe --without-K #-} open import MLTT.Spartan hiding (𝟚; ₀; ₁) open import UF.FunExt open import UF.PropTrunc module Locales.ContinuousMap.FrameHomomorphism-Definition (pt : propositional-truncations-exist) (fe : Fun-Ext) where open import Locales.Frame pt fe open import Slice.Family open import UF.Equiv open import UF.Logic open import UF.Sets open import UF.SubtypeClassifier open AllCombinators pt fe \end{code} We work in a module parameterized by two frames. \begin{code} module FrameHomomorphisms (F : Frame 𝓤 𝓥 𝓦) (G : Frame 𝓤' 𝓥' 𝓦) where \end{code} We denote by `σ` the proof that the carrier of frame `G` is a set. \begin{code} private σ : is-set ⟨ G ⟩ σ = carrier-of-[ poset-of G ]-is-set \end{code} The following predicate expresses what it means for a function between frames to preserve the top element. \begin{code} preserves-top : (⟨ F ⟩ → ⟨ G ⟩) → Ω 𝓤' preserves-top h = h 𝟏[ F ] =[ σ ]= 𝟏[ G ] \end{code} The following predicate expresses what it means for a function between frames to preserve binary meets. \begin{code} preserves-binary-meets : (⟨ F ⟩ → ⟨ G ⟩) → Ω (𝓤 ⊔ 𝓤') preserves-binary-meets h = Ɐ x ꞉ ⟨ F ⟩ , Ɐ y ꞉ ⟨ F ⟩ , h (x ∧[ F ] y) =[ σ ]= h x ∧[ G ] h y \end{code} The following predicate expresses what it means for a function between frames to preserve the small joins. \begin{code} open Joins (λ x y → x ≤[ poset-of G ] y) preserves-joins : (⟨ F ⟩ → ⟨ G ⟩) → Ω (𝓤 ⊔ 𝓤' ⊔ 𝓥' ⊔ 𝓦 ⁺) preserves-joins h = Ɐ S ꞉ Fam 𝓦 ⟨ F ⟩ , h (⋁[ F ] S) is-lub-of ⁅ h x ∣ x ε S ⁆ \end{code} We package these up into a predicate that express the notion of frame homomorphism: a function that preserves finite meets, and the small joins. \begin{code} is-a-frame-homomorphism : (⟨ F ⟩ → ⟨ G ⟩) → Ω (𝓤 ⊔ 𝓦 ⁺ ⊔ 𝓤' ⊔ 𝓥') is-a-frame-homomorphism h = α ∧ β ∧ γ where α = preserves-top h β = preserves-binary-meets h γ = preserves-joins h \end{code} Using this, we write down the type of frame homomorphisms between two frames. \begin{code} _─f→_ : 𝓤 ⊔ 𝓦 ⁺ ⊔ 𝓤' ⊔ 𝓥' ̇ _─f→_ = Σ f ꞉ (⟨ F ⟩ → ⟨ G ⟩) , is-a-frame-homomorphism f holds \end{code} We denote by `fun 𝒽` the underlying function of a frame homomorphism `𝒽`. \begin{code} fun : _─f→_ → ⟨ F ⟩ → ⟨ G ⟩ fun (h , _) = h fun-syntax : _─f→_ → ⟨ F ⟩ → ⟨ G ⟩ fun-syntax = fun infixr 3 fun-syntax syntax fun f x = f $ x fun-is-a-frame-homomorphism : (h : _─f→_) → is-a-frame-homomorphism (fun h) holds fun-is-a-frame-homomorphism (_ , φ) = φ \end{code} We also write down a record-based version of the same type and prove their equivalence. \begin{code} record _─f·→_ : 𝓤 ⊔ 𝓤' ⊔ 𝓥' ⊔ 𝓦 ⁺ ̇ where field h : ⟨ F ⟩ → ⟨ G ⟩ h-preserves-top : preserves-top h holds h-preserves-meets : preserves-binary-meets h holds h-preserves-joins : preserves-joins h holds frame-homomorphism-to-frame-homomorphismᵣ : _─f→_ → _─f·→_ frame-homomorphism-to-frame-homomorphismᵣ (h , α , β , γ) = record { h = h ; h-preserves-top = α ; h-preserves-meets = β ; h-preserves-joins = γ } frame-homomorphismᵣ-to-frame-homomorphism : _─f·→_ → _─f→_ frame-homomorphismᵣ-to-frame-homomorphism 𝒽 = let open _─f·→_ 𝒽 in h , h-preserves-top , h-preserves-meets , h-preserves-joins frame-homomorphism-equiv-to-frame-homomorphismᵣ : _─f→_ ≃ _─f·→_ frame-homomorphism-equiv-to-frame-homomorphismᵣ = s , (r , †) , r , ‡ where s : _─f→_ → _─f·→_ s = frame-homomorphism-to-frame-homomorphismᵣ r : _─f·→_ → _─f→_ r = frame-homomorphismᵣ-to-frame-homomorphism † : (s ∘ r) ∼ id † _ = refl ‡ : (r ∘ s) ∼ id ‡ _ = refl \end{code} For convenience, we also define some direct projections on the Σ-based type. \begin{code} frame-homomorphisms-preserve-top : (h : _─f→_) → preserves-top (fun h) holds frame-homomorphisms-preserve-top 𝒽 = let open _─f·→_ (frame-homomorphism-to-frame-homomorphismᵣ 𝒽) in h-preserves-top frame-homomorphisms-preserve-meets : (h : _─f→_) → preserves-binary-meets (fun h) holds frame-homomorphisms-preserve-meets 𝒽 = let open _─f·→_ (frame-homomorphism-to-frame-homomorphismᵣ 𝒽) in h-preserves-meets frame-homomorphisms-preserve-all-joins : (h : _─f→_) → preserves-joins (fun h) holds frame-homomorphisms-preserve-all-joins 𝒽 = let open _─f·→_ (frame-homomorphism-to-frame-homomorphismᵣ 𝒽) in h-preserves-joins frame-homomorphisms-preserve-all-joins′ : (h : _─f→_) → (S : Fam 𝓦 ⟨ F ⟩) → h $ (⋁[ F ] S) = ⋁[ G ] ⁅ h $ x ∣ x ε S ⁆ frame-homomorphisms-preserve-all-joins′ h S = ⋁[ G ]-unique ⁅ h $ x ∣ x ε S ⁆ (h $ (⋁[ F ] S)) (frame-homomorphisms-preserve-all-joins h S) \end{code}