---
title: Distributive lattices
author: Ayberk Tosun
date-started: 2024-02-14
---
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import UF.FunExt
open import UF.PropTrunc
open import UF.Sets
module Locales.DistributiveLattice.Definition
(fe : Fun-Ext)
(pt : propositional-truncations-exist)
where
open import Locales.Frame pt fe
open import MLTT.Spartan
open import UF.Logic
open import UF.SubtypeClassifier
open Implication fe
\end{code}
We give the equational definition from Stone Spaces.
\begin{code}
record DistributiveLattice (𝓤 : Universe) : 𝓤 ⁺ ̇ where
field
X : 𝓤 ̇
𝟏 : X
𝟎 : X
_∧_ : X → X → X
_∨_ : X → X → X
field
X-is-set : is-set X
∧-associative : (x y z : X) → x ∧ (y ∧ z) = (x ∧ y) ∧ z
∧-commutative : (x y : X) → x ∧ y = y ∧ x
∧-unit : (x : X) → x ∧ 𝟏 = x
∧-idempotent : (x : X) → x ∧ x = x
∧-absorptive : (x y : X) → x ∧ (x ∨ y) = x
∨-associative : (x y z : X) → x ∨ (y ∨ z) = (x ∨ y) ∨ z
∨-commutative : (x y : X) → x ∨ y = y ∨ x
∨-unit : (x : X) → x ∨ 𝟎 = x
∨-idempotent : (x : X) → x ∨ x = x
∨-absorptive : (x y : X) → x ∨ (x ∧ y) = x
distributivityᵈ : (x y z : X) → x ∧ (y ∨ z) = (x ∧ y) ∨ (x ∧ z)
\end{code}
Some easy lemmas that we prove directly inside the record definition.
\begin{code}
distributivityᵈ₁ : (x y z : X) → (y ∨ z) ∧ x = (y ∧ x) ∨ (z ∧ x)
distributivityᵈ₁ x y z = (y ∨ z) ∧ x =⟨ Ⅰ ⟩
x ∧ (y ∨ z) =⟨ Ⅱ ⟩
(x ∧ y) ∨ (x ∧ z) =⟨ Ⅲ ⟩
(y ∧ x) ∨ (x ∧ z) =⟨ Ⅳ ⟩
(y ∧ x) ∨ (z ∧ x) ∎
where
Ⅰ = ∧-commutative (y ∨ z) x
Ⅱ = distributivityᵈ x y z
Ⅲ = ap (_∨ (x ∧ z)) (∧-commutative x y)
Ⅳ = ap ((y ∧ x) ∨_) (∧-commutative x z)
∨-unit₁ : (x : X) → 𝟎 ∨ x = x
∨-unit₁ x = 𝟎 ∨ x =⟨ ∨-commutative 𝟎 x ⟩
x ∨ 𝟎 =⟨ ∨-unit x ⟩
x ∎
∧-absorptive₁ : (x y : X) → x ∧ (y ∨ x) = x
∧-absorptive₁ x y = x ∧ (y ∨ x) =⟨ ap (x ∧_) (∨-commutative y x) ⟩
x ∧ (x ∨ y) =⟨ ∧-absorptive x y ⟩
x ∎
∨-absorptive₁ : (x y : X) → x ∨ (y ∧ x) = x
∨-absorptive₁ x y = x ∨ (y ∧ x) =⟨ ap (x ∨_) (∧-commutative y x) ⟩
x ∨ (x ∧ y) =⟨ ∨-absorptive x y ⟩
x ∎
∨-absorptive₂ : (x y : X) → (x ∧ y) ∨ x = x
∨-absorptive₂ x y = (x ∧ y) ∨ x =⟨ ∨-commutative (x ∧ y) x ⟩
x ∨ (x ∧ y) =⟨ ∨-absorptive x y ⟩
x ∎
∧-absorptive₃ : (x y : X) → (y ∨ x) ∧ x = x
∧-absorptive₃ x y = (y ∨ x) ∧ x =⟨ ∧-commutative (y ∨ x) x ⟩
x ∧ (y ∨ x) =⟨ ∧-absorptive₁ x y ⟩
x ∎
∨-absorptive₃ : (x y : X) → (y ∧ x) ∨ x = x
∨-absorptive₃ x y = (y ∧ x) ∨ x =⟨ Ⅰ ⟩
(x ∧ y) ∨ x =⟨ Ⅱ ⟩
x ∎
where
Ⅰ = ap (_∨ x) (∧-commutative y x)
Ⅱ = ∨-absorptive₂ x y
\end{code}
Notation for the carrier set.
\begin{code}
∣_∣ᵈ : DistributiveLattice 𝓤 → 𝓤 ̇
∣_∣ᵈ L = let open DistributiveLattice L in X
\end{code}
The dual of the distributivity law.
\begin{code}
module _ (L : DistributiveLattice 𝓤) where
open DistributiveLattice L
distributivity-op : (x y z : ∣ L ∣ᵈ) → x ∨ (y ∧ z) = (x ∨ y) ∧ (x ∨ z)
distributivity-op x y z =
x ∨ (y ∧ z) =⟨ Ⅰ ⟩
x ∨ ((z ∧ y) ∨ (z ∧ x)) =⟨ Ⅱ ⟩
(x ∨ z) ∧ (y ∨ x) =⟨ Ⅲ ⟩
(y ∨ x) ∧ (x ∨ z) =⟨ Ⅳ ⟩
(x ∨ y) ∧ (x ∨ z) ∎
where
𝒶 = ap (_∨ (y ∧ z)) (∨-absorptive₁ x z ⁻¹)
𝒷 = ap ((x ∨ (z ∧ x)) ∨_) (∧-commutative y z)
𝒸 = ∨-associative x (z ∧ x) (z ∧ y) ⁻¹
𝒹 = ap (x ∨_) (∨-commutative (z ∧ x) (z ∧ y))
ℯ = ap (x ∨_) (distributivityᵈ z y x ⁻¹)
𝒻 = ap (_∨ (z ∧ (y ∨ x))) (∧-absorptive₁ x y ⁻¹)
ℊ = distributivityᵈ₁ (y ∨ x) x z ⁻¹
Ⅰ = x ∨ (y ∧ z) =⟨ 𝒶 ⟩
(x ∨ (z ∧ x)) ∨ (y ∧ z) =⟨ 𝒷 ⟩
(x ∨ (z ∧ x)) ∨ (z ∧ y) =⟨ 𝒸 ⟩
x ∨ ((z ∧ x) ∨ (z ∧ y)) =⟨ 𝒹 ⟩
x ∨ ((z ∧ y) ∨ (z ∧ x)) ∎
Ⅱ = x ∨ ((z ∧ y) ∨ (z ∧ x)) =⟨ ℯ ⟩
x ∨ (z ∧ (y ∨ x)) =⟨ 𝒻 ⟩
(x ∧ (y ∨ x)) ∨ (z ∧ (y ∨ x)) =⟨ ℊ ⟩
(x ∨ z) ∧ (y ∨ x) ∎
Ⅲ = ∧-commutative (x ∨ z) (y ∨ x)
Ⅳ = ap (_∧ (x ∨ z)) (∨-commutative y x)
\end{code}
Definition of the order as `x ≤ y := x ∧ y = x`.
\begin{code}
orderᵈ-∧ : (L : DistributiveLattice 𝓤) → ∣ L ∣ᵈ → ∣ L ∣ᵈ → Ω 𝓤
orderᵈ-∧ L x y = (x ∧ y = x) , X-is-set
where
open DistributiveLattice L
\end{code}
We take this as our primary order.
\begin{code}
syntax orderᵈ-∧ L x y = x ≤ᵈ[ L ] y
≤ᵈ-is-reflexive : (L : DistributiveLattice 𝓤) → is-reflexive (orderᵈ-∧ L) holds
≤ᵈ-is-reflexive L = ∧-idempotent
where
open DistributiveLattice L
≤ᵈ-is-transitive : (L : DistributiveLattice 𝓤) → is-transitive (orderᵈ-∧ L) holds
≤ᵈ-is-transitive L x y z p q =
x ∧ z =⟨ Ⅰ ⟩
(x ∧ y) ∧ z =⟨ Ⅱ ⟩
x ∧ (y ∧ z) =⟨ Ⅲ ⟩
x ∧ y =⟨ Ⅳ ⟩
x ∎
where
open DistributiveLattice L
Ⅰ = ap (_∧ z) (p ⁻¹)
Ⅱ = ∧-associative x y z ⁻¹
Ⅲ = ap (x ∧_) q
Ⅳ = p
≤ᵈ-is-antisymmetric : (L : DistributiveLattice 𝓤) → is-antisymmetric (orderᵈ-∧ L)
≤ᵈ-is-antisymmetric L {x} {y} p q =
x =⟨ Ⅰ ⟩
x ∧ y =⟨ Ⅱ ⟩
y ∧ x =⟨ Ⅲ ⟩
y ∎
where
open DistributiveLattice L
Ⅰ = p ⁻¹
Ⅱ = ∧-commutative x y
Ⅲ = q
\end{code}
It is also useful to have the alternative definition `x ≤ y := x ∨ y = y`.
\begin{code}
orderᵈ-∨ : (L : DistributiveLattice 𝓤) → ∣ L ∣ᵈ → ∣ L ∣ᵈ → Ω 𝓤
orderᵈ-∨ L x y = (x ∨ y = y) , X-is-set
where
open DistributiveLattice L
syntax orderᵈ-∨ L x y = x ≤ᵈ[ L ]₀ y
orderᵈ-∨-implies-orderᵈ : (L : DistributiveLattice 𝓤) {x y : ∣ L ∣ᵈ}
→ (x ≤ᵈ[ L ]₀ y ⇒ x ≤ᵈ[ L ] y) holds
orderᵈ-∨-implies-orderᵈ L {x} {y} p =
x ∧ y =⟨ Ⅰ ⟩ x ∧ (x ∨ y) =⟨ Ⅱ ⟩ x ∎
where
open DistributiveLattice L
Ⅰ = ap (x ∧_) p ⁻¹
Ⅱ = ∧-absorptive x y
orderᵈ-implies-orderᵈ-∨ : (L : DistributiveLattice 𝓤) {x y : ∣ L ∣ᵈ}
→ (x ≤ᵈ[ L ] y ⇒ x ≤ᵈ[ L ]₀ y) holds
orderᵈ-implies-orderᵈ-∨ L {x} {y} p =
x ∨ y =⟨ Ⅰ ⟩
y ∨ x =⟨ Ⅱ ⟩
y ∨ (x ∧ y) =⟨ Ⅲ ⟩
y ∨ (y ∧ x) =⟨ ∨-absorptive y x ⟩
y ∎
where
open DistributiveLattice L
Ⅰ = ∨-commutative x y
Ⅱ = ap (y ∨_) (p ⁻¹)
Ⅲ = ap (y ∨_) (∧-commutative x y)
\end{code}
We package everything up into a poset.
\begin{code}
poset-ofᵈ : DistributiveLattice 𝓤 → Poset 𝓤 𝓤
poset-ofᵈ L = ∣ L ∣ᵈ
, orderᵈ-∧ L
, (≤ᵈ-is-reflexive L , ≤ᵈ-is-transitive L)
, ≤ᵈ-is-antisymmetric L
where
open DistributiveLattice L
\end{code}
Finally, we show that the operations `_∧_` and `_∨_` are indeed meets and
join operations.
\begin{code}
module _ (L : DistributiveLattice 𝓤) where
open DistributiveLattice L
open Meets (orderᵈ-∧ L)
open Joins (orderᵈ-∧ L)
𝟏ᵈ-is-top : (x : X) → (x ≤ᵈ[ L ] 𝟏) holds
𝟏ᵈ-is-top = ∧-unit
𝟎ᵈ-is-bottom : (x : X) → (𝟎 ≤ᵈ[ L ] x) holds
𝟎ᵈ-is-bottom x = orderᵈ-∨-implies-orderᵈ L (∨-unit₁ x)
only-𝟎-is-below-𝟎ᵈ : (x : X) → (x ≤ᵈ[ L ] 𝟎) holds → x = 𝟎
only-𝟎-is-below-𝟎ᵈ x p =
≤-is-antisymmetric (poset-ofᵈ L) p (𝟎ᵈ-is-bottom x)
∧-is-a-lower-bound₂ : (x y : X) → ((x ∧ y) ≤ᵈ[ L ] y) holds
∧-is-a-lower-bound₂ x y = (x ∧ y) ∧ y =⟨ Ⅰ ⟩
x ∧ (y ∧ y) =⟨ Ⅱ ⟩
x ∧ y ∎
where
Ⅰ = ∧-associative x y y ⁻¹
Ⅱ = ap (x ∧_) (∧-idempotent y)
∧-is-a-lower-bound₁ : (x y : X) → ((x ∧ y) ≤ᵈ[ L ] x) holds
∧-is-a-lower-bound₁ x y = (x ∧ y) ∧ x =⟨ Ⅰ ⟩
(y ∧ x) ∧ x =⟨ Ⅱ ⟩
y ∧ (x ∧ x) =⟨ Ⅲ ⟩
y ∧ x =⟨ Ⅳ ⟩
x ∧ y ∎
where
Ⅰ = ap (_∧ x) (∧-commutative x y)
Ⅱ = ∧-associative y x x ⁻¹
Ⅲ = ap (y ∧_) (∧-idempotent x)
Ⅳ = ∧-commutative y x
∧-is-greatest : (x y z : ∣ L ∣ᵈ)
→ (z is-a-lower-bound-of (x , y) ⇒ z ≤ᵈ[ L ] (x ∧ y)) holds
∧-is-greatest x y z (p₁ , p₂) = z ∧ (x ∧ y) =⟨ Ⅰ ⟩
(z ∧ x) ∧ y =⟨ Ⅱ ⟩
z ∧ y =⟨ Ⅲ ⟩
z ∎
where
Ⅰ = ∧-associative z x y
Ⅱ = ap (_∧ y) p₁
Ⅲ = p₂
∧-is-glb : (x y : ∣ L ∣ᵈ) → ((x ∧ y) is-glb-of (x , y)) holds
∧-is-glb x y = (∧-is-a-lower-bound₁ x y , ∧-is-a-lower-bound₂ x y)
, λ (z , p) → ∧-is-greatest x y z p
\end{code}
\begin{code}
∨-is-an-upper-bound₁ : (x y : ∣ L ∣ᵈ) → (x ≤ᵈ[ L ] (x ∨ y)) holds
∨-is-an-upper-bound₁ = ∧-absorptive
∨-is-an-upper-bound₂ : (x y : ∣ L ∣ᵈ) → (y ≤ᵈ[ L ] (x ∨ y)) holds
∨-is-an-upper-bound₂ x y = ∧-absorptive₁ y x
∨-is-least : (x y z : ∣ L ∣ᵈ) → (z is-an-upper-bound-of₂ (x , y) ⇒ (x ∨ y) ≤ᵈ[ L ] z) holds
∨-is-least x y z (p₁ , p₂) = orderᵈ-∨-implies-orderᵈ L †
where
q₂ : y ∨ z = z
q₂ = orderᵈ-implies-orderᵈ-∨ L p₂
q₁ : x ∨ z = z
q₁ = orderᵈ-implies-orderᵈ-∨ L p₁
Ⅰ = ∨-associative x y z ⁻¹
Ⅱ = ap (x ∨_) q₂
Ⅲ = q₁
† : (x ∨ y) ∨ z = z
† = (x ∨ y) ∨ z =⟨ Ⅰ ⟩
x ∨ (y ∨ z) =⟨ Ⅱ ⟩
x ∨ z =⟨ Ⅲ ⟩
z ∎
∨-is-lub : (x y : ∣ L ∣ᵈ) → ((x ∨ y) is-lub-of₂ (x , y)) holds
∨-is-lub x y = (∨-is-an-upper-bound₁ x y , ∨-is-an-upper-bound₂ x y)
, λ (z , p) → ∨-is-least x y z p
\end{code}