module Order.Lattice whereLatticesπ
A lattice is a poset which is simultaneously a meet semilattice and a join semilattice.
record is-lattice {o β} (P : Poset o β) : Type (o β β) where
  no-eta-equality
  field
    _β©_     : β P β β β P β β β P β
    β©-meets : β x y β is-meet P x y (x β© y)
    _βͺ_     : β P β β β P β β β P β
    βͺ-joins : β x y β is-join P x y (x βͺ y)
    has-top : Top P
    has-bottom : Bottom P
  infixr 24 _βͺ_
  infixr 25 _β©_
  open Joins {P = P} βͺ-joins public
  open Meets {P = P} β©-meets public
  has-meet-slat : is-meet-semilattice P
  has-meet-slat .is-meet-semilattice._β©_     = _β©_
  has-meet-slat .is-meet-semilattice.β©-meets = β©-meets
  has-meet-slat .is-meet-semilattice.has-top = has-top
  has-join-slat : is-join-semilattice P
  has-join-slat .is-join-semilattice._βͺ_ = _βͺ_
  has-join-slat .is-join-semilattice.βͺ-joins = βͺ-joins
  has-join-slat .is-join-semilattice.has-bottom = has-bottom
  open Top has-top using (top ; !) public
  open Bottom has-bottom using (bot ; Β‘) publicCategory of latticesπ
A lattice homomorphism is a function which is, at the same time, a homomorphism for both of the semilattice structures: A function sending bottom to bottom, top to top, joins to joins, and meets to meets. Put more concisely, a function which preserves finite meets and finite joins.
record
  is-lattice-hom
    {P : Poset o β} {Q : Poset o' β'}
    (f : Monotone P Q) (S : is-lattice P) (T : is-lattice Q) : Type (o β β')
  where  field
    top-β€ : T.top Q.β€ f # S.top
    bot-β€ : f # S.bot Q.β€ T.bot
    β©-β€ : β {x y} β f # x T.β© f # y Q.β€ f # (x S.β© y)
    βͺ-β€ : β {x y} β f # (x S.βͺ y) Q.β€ f # x T.βͺ f # yThe identity function is clearly a lattice homomorphism, and lattice homomorphisms are closed under composition.
id-lattice-hom
  : β (L : is-lattice P)
  β is-lattice-hom idβ L L
id-lattice-hom {P = P} L .top-β€ =
  Poset.β€-refl P
id-lattice-hom {P = P} L .bot-β€ =
  Poset.β€-refl P
id-lattice-hom {P = P} L .β©-β€ =
  Poset.β€-refl P
id-lattice-hom {P = P} L .βͺ-β€ =
  Poset.β€-refl P
β-lattice-hom
  : β {L J K} {f : Monotone Q R} {g : Monotone P Q}
  β is-lattice-hom f J K
  β is-lattice-hom g L J
  β is-lattice-hom (f ββ g) L K
β-lattice-hom {R = R} {f = f} f-pres g-pres .top-β€ =
  R .Poset.β€-trans (f-pres .top-β€) (f .pres-β€ (g-pres .top-β€))
β-lattice-hom {R = R} {f = f} f-pres g-pres .bot-β€ =
  R .Poset.β€-trans (f .pres-β€ (g-pres .bot-β€)) (f-pres .bot-β€)
β-lattice-hom {R = R} {f = f} f-pres g-pres .β©-β€ =
  R .Poset.β€-trans (f-pres .β©-β€) (f .pres-β€ (g-pres .β©-β€))
β-lattice-hom {R = R} {f = f} f-pres g-pres .βͺ-β€ =
  R .Poset.β€-trans (f .pres-β€ (g-pres .βͺ-β€)) (f-pres .βͺ-β€)This allows us to carve out the category of lattices as a subcategory of the category of posets.
Lattices-subcat : β o β β Subcat (Posets o β) _ _
Lattices-subcat o β .Subcat.is-ob = is-lattice
Lattices-subcat o β .Subcat.is-hom = is-lattice-hom
Lattices-subcat o β .Subcat.is-hom-prop = hlevel!
Lattices-subcat o β .Subcat.is-hom-id = id-lattice-hom
Lattices-subcat o β .Subcat.is-hom-β = β-lattice-hom
Lattices : β o β β Precategory _ _
Lattices o β = Subcategory (Lattices-subcat o β)
module Lattices {o} {β} = Cat.Reasoning (Lattices o β)
Lattice : β o β β Type _
Lattice o β = Lattices.Ob {o} {β}