---
title: Isomorphisms of distributive lattices
author: Ayberk Tosun
date-started: 2024-04-24
dates-updated: [2024-06-17, 2024-05-30, 2024-06-01]
---
This module contains the definition of the notion of distributive lattice
isomorphism.
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import UF.FunExt
open import UF.PropTrunc
module Locales.DistributiveLattice.Isomorphism
(fe : Fun-Ext)
(pt : propositional-truncations-exist)
where
open import Locales.AdjointFunctorTheoremForFrames pt fe
open import Locales.Adjunctions.Properties pt fe
open import Locales.Adjunctions.Properties-DistributiveLattice pt fe
open import Locales.DistributiveLattice.Definition fe pt
open import Locales.DistributiveLattice.Homomorphism fe pt
open import Locales.Frame pt fe
open import Locales.GaloisConnection pt fe
open import MLTT.Spartan
open import UF.Base
open import UF.Equiv
open import UF.Equiv-FunExt
open import UF.Logic
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.SubtypeClassifier
open AllCombinators pt fe renaming (_∧_ to _∧ₚ_)
\end{code}
We work in a module parameterized by a 𝓤-distributive-lattice `L₁` and a
𝓥-distributive-lattice `L₂`.
\begin{code}
module DistributiveLatticeIsomorphisms (L₁ : DistributiveLattice 𝓤)
(L₂ : DistributiveLattice 𝓥) where
\end{code}
The type `Isomorphismᵈᵣ L₁ L₂`, defined below, is the type of isomorphisms
between distributive lattices `L₁` and `L₂`.
\begin{code}
record Isomorphismᵈᵣ : (𝓤 ⊔ 𝓥) ⁺ ̇ where
field
𝓈 : L₁ ─d→ L₂
𝓇 : L₂ ─d→ L₁
s : ∣ L₁ ∣ᵈ → ∣ L₂ ∣ᵈ
s = Homomorphismᵈᵣ.h 𝓈
r : ∣ L₂ ∣ᵈ → ∣ L₁ ∣ᵈ
r = Homomorphismᵈᵣ.h 𝓇
s-is-homomorphism : is-homomorphismᵈ L₁ L₂ s holds
s-is-homomorphism = Homomorphismᵈᵣ.h-is-homomorphism 𝓈
r-is-homomorphism : is-homomorphismᵈ L₂ L₁ r holds
r-is-homomorphism = Homomorphismᵈᵣ.h-is-homomorphism 𝓇
field
r-cancels-s : r ∘ s ∼ id
s-cancels-r : s ∘ r ∼ id
\end{code}
Added on 2024-05-30.
Lemma for showing the equality two distributive lattice isomorphisms.
\begin{code}
open Isomorphismᵈᵣ
to-isomorphismᵈᵣ-= : (𝒾 𝒿 : Isomorphismᵈᵣ) → s 𝒾 ∼ s 𝒿 → r 𝒾 ∼ r 𝒿 → 𝒾 = 𝒿
to-isomorphismᵈᵣ-= 𝒾 𝒿 φ ψ = † p q
where
open DistributiveLattice
p : 𝓈 𝒾 = 𝓈 𝒿
p = to-homomorphismᵈ-= L₁ L₂ (𝓈 𝒾) (𝓈 𝒿) φ
q : 𝓇 𝒾 = 𝓇 𝒿
q = to-homomorphismᵈ-= L₂ L₁ (𝓇 𝒾) (𝓇 𝒿) ψ
g : (r 𝒾 ∘ s 𝒾) ∼ id → (s 𝒾 ∘ r 𝒾) ∼ id → Isomorphismᵈᵣ
g e₁ e₂ = record { 𝓈 = 𝓈 𝒾 ; 𝓇 = 𝓇 𝒾 ; r-cancels-s = e₁ ; s-cancels-r = e₂}
f : 𝓈 𝒾 = 𝓈 𝒿 → 𝓇 𝒾 = 𝓇 𝒿 → Isomorphismᵈᵣ
f refl refl =
record
{ 𝓈 = 𝓈 𝒾
; 𝓇 = 𝓇 𝒾
; r-cancels-s = r-cancels-s 𝒾
; s-cancels-r = s-cancels-r 𝒾
}
† : 𝓈 𝒾 = 𝓈 𝒿 → 𝓇 𝒾 = 𝓇 𝒿 → 𝒾 = 𝒿
† refl refl = ap₂ g β γ
where
β : r-cancels-s 𝒾 = r-cancels-s 𝒿
β = Π-is-prop fe (λ _ → X-is-set L₁) (r-cancels-s 𝒾) (r-cancels-s 𝒿)
γ : s-cancels-r 𝒾 = s-cancels-r 𝒿
γ = Π-is-prop fe (λ _ → X-is-set L₂) (s-cancels-r 𝒾) (s-cancels-r 𝒿)
\end{code}
End of addition.
Pretty syntax for `Isomorphismᵈᵣ`.
\begin{code}
Isomorphismᵈᵣ-Syntax : DistributiveLattice 𝓤
→ DistributiveLattice 𝓥
→ (𝓤 ⊔ 𝓥) ⁺ ̇
Isomorphismᵈᵣ-Syntax K L = DistributiveLatticeIsomorphisms.Isomorphismᵈᵣ K L
infix 0 Isomorphismᵈᵣ-Syntax
syntax Isomorphismᵈᵣ-Syntax K L = K ≅d≅ L
\end{code}
Added on 2024-05-17.
We now give an alternative definition of the notion of distributive lattice
homomorphism: an equivalence whose both sides are monotone.
\begin{code}
module HomomorphicEquivalences (K : DistributiveLattice 𝓤)
(L : DistributiveLattice 𝓤) where
is-homomorphic : (∣ K ∣ᵈ ≃ ∣ L ∣ᵈ) → Ω 𝓤
is-homomorphic e = is-monotonic (poset-ofᵈ K) (poset-ofᵈ L) ⌜ e ⌝
∧ₚ is-monotonic (poset-ofᵈ L) (poset-ofᵈ K) ⌜ e⁻¹ ⌝
where
e⁻¹ : ∣ L ∣ᵈ ≃ ∣ K ∣ᵈ
e⁻¹ = ≃-sym e
\end{code}
We denote by `Isomorphism₀` the type of isomorphisms given via this alternative
definition.
\begin{code}
Isomorphism₀ : 𝓤 ̇
Isomorphism₀ = Σ e ꞉ ∣ K ∣ᵈ ≃ ∣ L ∣ᵈ , is-homomorphic e holds
\end{code}
We now prove that this is equivalent to the categorical definition.
The part of the equivalence going from `Isomorphismᵈᵣ K L` to
`Isomorphism₀` is easy.
\begin{code}
open DistributiveLatticeIsomorphisms
open Some-Properties-Of-Posetal-Adjunctions
open Properties-Of-Posetal-Adjunctions-on-Distributive-Lattices
to-isomorphism₀ : Isomorphismᵈᵣ K L → Isomorphism₀
to-isomorphism₀ 𝒾 = e , 𝒽
where
open Isomorphismᵈᵣ 𝒾
using (s; 𝓈; 𝓇; r; s-cancels-r; r-cancels-s; s-is-homomorphism)
open Homomorphismᵈᵣ 𝓈
using ()
renaming (h-preserves-∧ to 𝓈-preserves-∧; h-is-monotone to 𝓈-is-monotone)
open Homomorphismᵈᵣ 𝓇
using ()
renaming (h-is-monotone to 𝓇-is-monotone)
open DistributiveLattice K
using ()
renaming (_∧_ to _∧₁_)
open DistributiveLattice L
using ()
renaming (_∧_ to _∧₂_)
e : ∣ K ∣ᵈ ≃ ∣ L ∣ᵈ
e = s , qinvs-are-equivs s (r , r-cancels-s , s-cancels-r)
𝒽 : is-homomorphic e holds
𝒽 = 𝓈-is-monotone , 𝓇-is-monotone
\end{code}
We now address the other direction.
Both parts of an equivalence are both a left adjoint and a right adjoint.
Therefore, they preserve finite meets and finite joins.
\begin{code}
open AdjointFunctorTheorem
open GaloisConnectionBetween (poset-ofᵈ L) (poset-ofᵈ K) renaming (_⊣_ to _⊣₁_)
open GaloisConnectionBetween (poset-ofᵈ K) (poset-ofᵈ L) renaming (_⊣_ to _⊣₂_)
to-isomorphismᵈᵣ : Isomorphism₀ → Isomorphismᵈᵣ K L
to-isomorphismᵈᵣ (e , (μ₁ , μ₂)) =
record
{ 𝓈 = 𝓈
; 𝓇 = 𝓇
; r-cancels-s = inverses-are-retractions' e
; s-cancels-r = inverses-are-sections' e
}
where
open DistributiveLattice L using () renaming (𝟏 to 𝟏L; 𝟎 to 𝟎L)
open DistributiveLattice K using () renaming (𝟏 to 𝟏K; 𝟎 to 𝟎K)
\end{code}
We have the monotone equivalence `e`, the forward and backward components of
which we denote by `s` and `r`:
\begin{code}
s = ⌜ e ⌝
r = ⌜ ≃-sym e ⌝
\end{code}
We denote by `sₘ` and `rₘ`, the versions of these packaged up with the proofs
that they are monotone.
\begin{code}
sₘ : poset-ofᵈ K ─m→ poset-ofᵈ L
sₘ = s , μ₁
rₘ : poset-ofᵈ L ─m→ poset-ofᵈ K
rₘ = r , μ₂
\end{code}
The map `s` is the left adjoint of `r` and vice versa.
\begin{code}
𝒶𝒹𝒿 : (rₘ ⊣₁ sₘ) holds
𝒶𝒹𝒿 = monotone-equivalences-are-adjoint
(poset-ofᵈ L)
(poset-ofᵈ K)
rₘ
sₘ
(inverses-are-retractions' e)
(inverses-are-sections' e)
𝒶𝒹𝒿' : (sₘ ⊣₂ rₘ) holds
𝒶𝒹𝒿' = monotone-equivalences-are-adjoint
(poset-ofᵈ K)
(poset-ofᵈ L)
sₘ
rₘ
(inverses-are-sections' e)
(inverses-are-retractions' e)
\end{code}
Because `r` is a right adjoint, it preserves `𝟏`.
\begin{code}
α₁ : preserves-𝟏 K L s holds
α₁ = right-adjoint-preserves-𝟏 L K rₘ sₘ 𝒶𝒹𝒿
\end{code}
Because `s` is a right adjoint, it preserves binary meets.
\begin{code}
β₁ : preserves-∧ K L s holds
β₁ = right-adjoint-preserves-∧ L K rₘ sₘ 𝒶𝒹𝒿
\end{code}
Because `s` is a left adjoint, it preserves the bottom element `𝟎`.
\begin{code}
γ₁ : preserves-𝟎 K L s holds
γ₁ = left-adjoint-preserves-𝟎 K L sₘ rₘ 𝒶𝒹𝒿'
\end{code}
Because `s` is a left adjoint, it preserves binary joins.
\begin{code}
δ₁ : preserves-∨ K L s holds
δ₁ = left-adjoint-preserves-∨ K L sₘ rₘ 𝒶𝒹𝒿'
\end{code}
Because `r` is a right adjoint, it preserves the top element `𝟏`.
\begin{code}
α₂ : preserves-𝟏 L K r holds
α₂ = right-adjoint-preserves-𝟏 K L sₘ rₘ 𝒶𝒹𝒿'
\end{code}
Because `r` is a right adjoint, it preserves binary meets.
\begin{code}
β₂ : preserves-∧ L K r holds
β₂ = right-adjoint-preserves-∧ K L sₘ rₘ 𝒶𝒹𝒿'
\end{code}
Because `r` is a left adjoint, it preserves the bottom element `𝟎`.
\begin{code}
γ₂ : preserves-𝟎 L K r holds
γ₂ = left-adjoint-preserves-𝟎 L K rₘ sₘ 𝒶𝒹𝒿
\end{code}
Because `r` is a left adjoint, it preserves binary joins.
\begin{code}
δ₂ : preserves-∨ L K r holds
δ₂ = left-adjoint-preserves-∨ L K rₘ sₘ 𝒶𝒹𝒿
\end{code}
Finally, we package everything up into the distributive lattice homomorphism
type.
\begin{code}
𝓈 : Homomorphismᵈᵣ K L
𝓈 = record
{ h = s
; h-is-homomorphism = α₁ , β₁ , γ₁ , δ₁}
𝓇 : Homomorphismᵈᵣ L K
𝓇 = record
{ h = r
; h-is-homomorphism = α₂ , β₂ , γ₂ , δ₂
}
\end{code}
The actual proof that these form an equivalence is trivial.
\begin{code}
isomorphismᵈᵣ-is-equivalent-to-isomorphism₀ : Isomorphism₀ ≃ Isomorphismᵈᵣ K L
isomorphismᵈᵣ-is-equivalent-to-isomorphism₀ =
to-isomorphismᵈᵣ , qinvs-are-equivs to-isomorphismᵈᵣ (to-isomorphism₀ , † , ‡)
where
† : to-isomorphism₀ ∘ to-isomorphismᵈᵣ ∼ id
† 𝒾@(e , μ₁ , μ₂) =
to-subtype-=
(holds-is-prop ∘ is-homomorphic)
(to-subtype-= (being-equiv-is-prop (λ 𝓤 𝓥 → fe {𝓤} {𝓥})) refl)
‡ : to-isomorphismᵈᵣ ∘ to-isomorphism₀ ∼ id
‡ 𝒾 = to-isomorphismᵈᵣ-=
K
L
(to-isomorphismᵈᵣ (to-isomorphism₀ 𝒾))
𝒾
(λ _ → refl)
(λ _ → refl)
\end{code}
Added on 2024-06-01.
We define the identity homomorphism on a distributive lattice.
The identity function preserves the bottom element.
\begin{code}
id-preserves-bottom : (L : DistributiveLattice 𝓤) → preserves-𝟎 L L id holds
id-preserves-bottom _ = refl
\end{code}
The identity function preserves the top element definitionally.
\begin{code}
id-preserves-top : (L : DistributiveLattice 𝓤) → preserves-𝟏 L L id holds
id-preserves-top _ = refl
\end{code}
The identity function preserves the meets definitionally.
\begin{code}
id-preserves-meets : (L : DistributiveLattice 𝓤) → preserves-∧ L L id holds
id-preserves-meets _ _ _ = refl
\end{code}
The identity function preserves the joins definitionally.
\begin{code}
id-preserves-joins : (L : DistributiveLattice 𝓤) → preserves-∨ L L id holds
id-preserves-joins _ _ _ = refl
\end{code}
We package up these into the proof that `id` is a homomorphism.
\begin{code}
id-is-homomorphism : (L : DistributiveLattice 𝓤) → is-homomorphismᵈ L L id holds
id-is-homomorphism L = id-preserves-top L
, id-preserves-meets L
, id-preserves-bottom L
, id-preserves-joins L
\end{code}
We package up the identity function together with the proof that it is a
homomorphism and denote it `𝔦𝔡`.
\begin{code}
𝔦𝔡 : (L : DistributiveLattice 𝓤) → L ─d→ L
𝔦𝔡 L = record { h = id ; h-is-homomorphism = id-is-homomorphism L}
\end{code}