Tom de Jong, 24 January 2022
(Refactored from FreeJoinSemiLattice.lagda)
We define join-semilattices using a record. We also introduce convenient helpers
and syntax for reasoning about the order β and we construct finite joins using
the least element and binary joins.
\begin{code}
{-# OPTIONS --safe --without-K #-}
module OrderedTypes.JoinSemiLattices where
open import MLTT.Spartan
open import Fin.Type
open import UF.Subsingletons
open import UF.Sets
record JoinSemiLattice (π₯ π£ : Universe) : π€Ο where
field
L : π₯ Μ
L-is-set : is-set L
_β_ : L β L β π£ Μ
β-is-prop-valued : (x y : L) β is-prop (x β y)
β-is-reflexive : (x : L) β x β x
β-is-transitive : (x y z : L) β x β y β y β z β x β z
β-is-antisymmetric : (x y : L) β x β y β y β x β x οΌ y
β₯ : L
β₯-is-least : (x : L) β β₯ β x
_β¨_ : L β L β L
β¨-is-upperboundβ : (x y : L) β x β (x β¨ y)
β¨-is-upperboundβ : (x y : L) β y β (x β¨ y)
β¨-is-lowerbound-of-upperbounds : (x y z : L) β x β z β y β z β (x β¨ y) β z
transitivity' : (x : L) {y z : L}
β x β y β y β z β x β z
transitivity' x {y} {z} = β-is-transitive x y z
syntax transitivity' x u v = x ββ¨ u β© v
infixr 0 transitivity'
reflexivity' : (x : L) β x β x
reflexivity' x = β-is-reflexive x
syntax reflexivity' x = x ββ
infix 1 reflexivity'
οΌ-to-β : {x y : L} β x οΌ y β x β y
οΌ-to-β {x} {x} refl = reflexivity' x
οΌ-to-β : {x y : L} β y οΌ x β x β y
οΌ-to-β p = οΌ-to-β (p β»ΒΉ)
β¨βΏ : {n : β} β (Fin n β L) β L
β¨βΏ {zero} e = β₯
β¨βΏ {succ m} e = (β¨βΏ (e β suc)) β¨ (e π)
β¨βΏ-is-upperbound : {n : β} (Ο : Fin n β L)
β (k : Fin n) β Ο k β β¨βΏ Ο
β¨βΏ-is-upperbound {succ n} Ο π = β¨-is-upperboundβ _ _
β¨βΏ-is-upperbound {succ n} Ο (suc k) = Ο (suc k) ββ¨ IH β©
β¨βΏ (Ο β suc) ββ¨ β¨-is-upperboundβ _ _ β©
β¨βΏ Ο ββ
where
IH = β¨βΏ-is-upperbound (Ο β suc) k
β¨βΏ-is-lowerbound-of-upperbounds : {n : β} (Ο : Fin n β L)
(x : L)
β ((k : Fin n) β Ο k β x)
β β¨βΏ Ο β x
β¨βΏ-is-lowerbound-of-upperbounds {zero} Ο x ub = β₯-is-least x
β¨βΏ-is-lowerbound-of-upperbounds {succ n} Ο x ub =
β¨-is-lowerbound-of-upperbounds _ _ _ u v
where
u : β¨βΏ (Ο β suc) β x
u = β¨βΏ-is-lowerbound-of-upperbounds {n} (Ο β suc) x (ub β suc)
v : Ο π β x
v = ub π
\end{code}