---
title:        Homomorphisms of distributive lattices
author:       Ayberk Tosun
date-started: 2024-02-21
dates-updated: [2024-05-20, 2024-05-29, 2024-06-09]
---

This module contains the definition of the notion of a distributive lattice
homomorphism.

\begin{code}

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

open import UF.FunExt
open import UF.PropTrunc

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

open import Locales.DistributiveLattice.Definition fe pt
open import Locales.Frame pt fe
open import MLTT.Spartan
open import UF.Logic
open import UF.SubtypeClassifier

open AllCombinators pt fe renaming (_∧_ to _∧ₚ_)

\end{code}

The properties of preserving bottom, top, binary joins, and binary meets.

\begin{code}

preserves-𝟎 : (L₁ : DistributiveLattice 𝓤) (L₂ : DistributiveLattice 𝓥)
             ( L₁ ∣ᵈ   L₂ ∣ᵈ)  Ω 𝓥
preserves-𝟎 L₁ L₂ h = h 𝟎₁ =[ σ₂ ]= 𝟎₂
 where
  open DistributiveLattice L₁ renaming (𝟎 to 𝟎₁)
  open DistributiveLattice L₂ renaming (𝟎 to 𝟎₂; X-is-set to σ₂)

preserves-𝟏 : (L₁ : DistributiveLattice 𝓤) (L₂ : DistributiveLattice 𝓥)
             ( L₁ ∣ᵈ   L₂ ∣ᵈ)  Ω 𝓥
preserves-𝟏 L₁ L₂ h = h 𝟏₁ =[ σ₂ ]= 𝟏₂
 where
  open DistributiveLattice L₁ renaming (𝟏 to 𝟏₁)
  open DistributiveLattice L₂ renaming (𝟏 to 𝟏₂; X-is-set to σ₂)

preserves-∨ : (L₁ : DistributiveLattice 𝓤) (L₂ : DistributiveLattice 𝓥)
             ( L₁ ∣ᵈ   L₂ ∣ᵈ)
             Ω (𝓤  𝓥)
preserves-∨ L₁ L₂ h =
  x   L₁ ∣ᵈ ,  y   L₁ ∣ᵈ , h (x ∨₁ y) =[ σ ]= (h x ∨₂ h y)
  where
   open DistributiveLattice L₁ renaming (_∨_ to _∨₁_)
   open DistributiveLattice L₂ renaming (_∨_ to _∨₂_; X-is-set to σ)

preserves-∧ : (L₁ : DistributiveLattice 𝓤) (L₂ : DistributiveLattice 𝓥)
             ( L₁ ∣ᵈ   L₂ ∣ᵈ)
             Ω (𝓤  𝓥)
preserves-∧ L₁ L₂ h =
  x   L₁ ∣ᵈ ,  y   L₁ ∣ᵈ , h (x ∧₁ y) =[ σ ]= (h x ∧₂ h y)
  where
   open DistributiveLattice L₁ renaming (_∧_ to _∧₁_)
   open DistributiveLattice L₂ renaming (_∧_ to _∧₂_; X-is-set to σ)

\end{code}

The property of being a homomorphism of distributive lattices.

\begin{code}


is-homomorphismᵈ : (L₁ : DistributiveLattice 𝓤) (L₂ : DistributiveLattice 𝓥)
                  ( L₁ ∣ᵈ   L₂ ∣ᵈ)  Ω (𝓤  𝓥)
is-homomorphismᵈ L₁ L₂ h =  preserves-𝟏 L₁ L₂ h
                         ∧ₚ preserves-∧ L₁ L₂ h
                         ∧ₚ preserves-𝟎 L₁ L₂ h
                         ∧ₚ preserves-∨ L₁ L₂ h


\end{code}

Record-based definition of distributive lattice homomorphisms.

\begin{code}

record Homomorphismᵈᵣ (L₁ : DistributiveLattice 𝓤) (L₂ : DistributiveLattice 𝓥) : 𝓤  𝓥  ̇ where
 field
  h                 :  L₁ ∣ᵈ   L₂ ∣ᵈ
  h-is-homomorphism : is-homomorphismᵈ L₁ L₂ h holds

 h-preserves-𝟏 : preserves-𝟏 L₁ L₂ h holds
 h-preserves-𝟏 = pr₁ h-is-homomorphism

 h-preserves-∧ : preserves-∧ L₁ L₂ h holds
 h-preserves-∧ = pr₁ (pr₂ h-is-homomorphism)

 h-preserves-𝟎 : preserves-𝟎 L₁ L₂ h holds
 h-preserves-𝟎 = pr₁ (pr₂ (pr₂ h-is-homomorphism))

 h-preserves-∨ : preserves-∨ L₁ L₂ h holds
 h-preserves-∨ = pr₂ (pr₂ (pr₂ h-is-homomorphism))

 h-is-monotone : is-monotonic (poset-ofᵈ L₁) (poset-ofᵈ L₂) h holds
 h-is-monotone (x , y) p = h x ∧₂ h y   =⟨  
                           h (x ∧₁ y)   =⟨  
                           h x          
  where
   open DistributiveLattice L₁ renaming (_∧_ to _∧₁_)
   open DistributiveLattice L₂ renaming (_∧_ to _∧₂_)

    = h-preserves-∧ x y ⁻¹
    = ap h p

\end{code}

Added on 2024-03-04.

\begin{code}

syntax Homomorphismᵈᵣ L₁ L₂ = L₁ ─d→ L₂

\end{code}

Added on 2024-05-20.

\begin{code}

funᵈ : (K : DistributiveLattice 𝓤) (L : DistributiveLattice 𝓥)  K ─d→ L   K ∣ᵈ   L ∣ᵈ
funᵈ K L 𝒽 = Homomorphismᵈᵣ.h {L₁ = K} {L₂ = L} 𝒽

\end{code}

Added on 2024-05-29.

If the underlying functions of two lattice homomorphisms are equal, then they
are equal.

\begin{code}

to-homomorphismᵈ-= : (K : DistributiveLattice 𝓤) (L : DistributiveLattice 𝓥)
                      (h₁ h₂ : K ─d→ L)
                     (funᵈ K L h₁  funᵈ K L h₂)
                     h₁  h₂
to-homomorphismᵈ-= K L 𝒽₁ 𝒽₂ φ =  (dfunext fe φ)
 where
  open Homomorphismᵈᵣ 𝒽₁
   using ()
   renaming (h to h₁; h-is-homomorphism to h₁-is-homomorphism)
  open Homomorphismᵈᵣ 𝒽₂
   using ()
   renaming (h to h₂; h-is-homomorphism to h₂-is-homomorphism)

  f : is-homomorphismᵈ K L h₁ holds  Homomorphismᵈᵣ K L
  f ϑ = record { h = h₁ ; h-is-homomorphism = ϑ }

   : funᵈ K L 𝒽₁  funᵈ K L 𝒽₂  𝒽₁  𝒽₂
   refl = ap f p
   where
    p : h₁-is-homomorphism  h₂-is-homomorphism
    p = holds-is-prop
         (is-homomorphismᵈ K L h₁)
         h₁-is-homomorphism
         h₂-is-homomorphism

\end{code}

Added on 2024-06-09.

\begin{code}

meet-preserving-implies-monotone
 : (K L : DistributiveLattice 𝓤)
  (f :  K ∣ᵈ   L ∣ᵈ)
  (preserves-∧ K L f  is-monotonic (poset-ofᵈ K) (poset-ofᵈ L) f) holds
meet-preserving-implies-monotone K L f φ (x , y) p =
 f x ∧₂ f y    =⟨  
 f (x ∧₁ y)    =⟨  
 f x           
  where
   open DistributiveLattice K renaming (_∧_ to _∧₁_)
   open DistributiveLattice L renaming (_∧_ to _∧₂_)

    = φ x y ⁻¹
    = ap f p

\end{code}

End of addition.