module Order.Semilattice.Free where

Free (semi)latticesπŸ”—

This module provides an impredicative construction of the free join semilattice on a set as the semilattice of Kuratowski-finite subsets ordered by inclusion, under the operation of union. While this construction might feel like it comes out of left field, finite subsets are actually a very natural model for join semilattices, since every subset is a join of singletons.

While this Coyoneda-like theorem about provides an abstract justification for the construction, it’s important to keep in mind that a Kuratowski-finite subset of can be equivalently presented as a list with elements drawn from but considered modulo order and repetition. Therefore, a concrete intuition for this construction can also be drawn from the connection between semilattices and monoids: a semilattice is a commutative, idempotent monoid.

module _ {β„“} (A : Set β„“) where
  K-finite-subset : Type β„“
  K-finite-subset = Ξ£[ P ∈ (∣ A ∣ β†’ Ξ©) ] (is-K-finite P)

  _βˆͺᡏ_ : K-finite-subset β†’ K-finite-subset β†’ K-finite-subset
  (P , pf) βˆͺᡏ (Q , qf) = P βˆͺ Q , union-is-K-finite {P = P} {Q = Q} pf qf

  minimalᡏ : K-finite-subset
  minimalᡏ = minimal , minimal-is-K-finite

Since is closed under unions (and contains the least element), it follows that it’s a semilattice, being a sub-semilattice of the power set of In fact, a different characterisation of is as the smallest sub-semilattice of containing the singletons and closed under union.

We shall refer to the singleton-assigning map as since it will play the role of our adjunction unit when we establish the universal property of

  singletonᡏ : ∣ A ∣ β†’ K-finite-subset
  singletonᡏ x = singleton x , singleton-is-K-finite (A .is-tr) x

We can then establish the aforementioned Coyoneda-like statement: a K-finite subset is the join of the singleton subsets it contains.

  K-singleton-lub
    : (P : K-finite-subset)
    β†’ is-lub (K[_] .fst) {I = βˆ«β‚š (P .fst)} (singletonᡏ βŠ™ fst) P
  K-singleton-lub P = subposet-has-lub _ (P .snd) (subset-singleton-lub _)

In a similar vein, given a map and a semilattice structure on we can extend this to a semilattice homomorphism1 by first expressing as for some then computing

  module _ {o β„“'} (B : Join-semilattice o β„“') where
    private module B = Order.Semilattice.Join.Reasoning (B .snd)

    fold-K : (∣ A ∣ β†’ ⌞ B ⌟) β†’ K-finite-subset β†’ ⌞ B ⌟
    fold-K f (P , P-fin) = Lub.lub Ξ΅' module fold-K where
      fam : (Ξ£ ∣ A ∣ Ξ» x β†’ ∣ P x ∣) β†’ ⌞ B ⌟
      fam (x , _) = f x

Since precomposition with a surjection both preserves and reflect the property of being a least upper bound, we can compute a join for our family by first computing a join for the composite then β€œforgetting” about the fact we used the epi from

      Ξ΅ : Finite-cover (βˆ«β‚š P) β†’ Lub (B .fst) fam
      Ξ΅ (covering {card} g surj) =
        cover-reflects-lub surj (Finite-lubs (B .snd) (fam βŠ™ g))

      Ξ΅' : Lub (B .fst) fam
      Ξ΅' = rec! Ξ΅ P-fin

      module Ξ΅' = Lub Ξ΅'

This extension of is monotonic, since it’s computed as a join.

    fold-K-pres-≀
      : βˆ€ (f : ⌞ A ⌟ β†’ ⌞ B ⌟)
      β†’ (P Q : K-finite-subset)
      β†’ P .fst βŠ† Q .fst
      β†’ fold-K f P B.≀ fold-K f Q
    fold-K-pres-≀ f (P , Pf) Qqf@(Q , Qf) PβŠ†Q =
      fold-K.Ξ΅'.least f P Pf (fold-K f Qqf) Ξ»
        (x , x∈P) β†’ fold-K.Ξ΅'.fam≀lub f Q Qf (x , PβŠ†Q x x∈P)

Likewise, it can be shown to preserve binary joins, and the bottom element.

    fold-K-βˆͺ-≀
      : (f : ⌞ A ⌟ β†’ ⌞ B ⌟) (P Q : K-finite-subset)
      β†’ fold-K f (P βˆͺᡏ Q) B.≀ (fold-K f P B.βˆͺ fold-K f Q)
    fold-K-bot-≀ : (f : ⌞ A ⌟ β†’ ⌞ B ⌟) β†’ fold-K f minimalᡏ B.≀ B.bot
The proofs follow the same pattern as the proof of monotonicity, so we omit them.
    fold-K-βˆͺ-≀ f Ppf@(P , Pf) Qqf@(Q , Qf) =
      fold-K.Ξ΅'.least f (P βˆͺ Q) (union-is-K-finite Pf Qf) _ go where
      go : (i : βˆ«β‚š (P βˆͺ Q)) β†’ f (i .fst) B.≀ fold-K f Ppf B.βˆͺ fold-K f Qqf
      go (x , inc (inl p)) = B.≀-trans (fold-K.Ξ΅'.fam≀lub f P Pf (x , p)) B.l≀βˆͺ
      go (x , inc (inr p)) = B.≀-trans (fold-K.Ξ΅'.fam≀lub f Q Qf (x , p)) B.r≀βˆͺ
      go (x , squash p q i) = B.≀-thin (go (x , p)) (go (x , q)) i

    fold-K-bot-≀ f = fold-K.Ξ΅'.least f minimal minimal-is-K-finite B.bot Ξ» ()

Crucially for the universal property, when applied to a singleton subset, this extension agrees with our original function. Intuitively, this is because we’re taking the join of a single thing, but we still have to show this!

    fold-K-singleton
      : (f : ⌞ A ⌟ β†’ ⌞ B ⌟) (x : ⌞ A ⌟) β†’ fold-K f (singletonᡏ x) ≑ f x
    fold-K-singleton f x = B.≀-antisym
      (Ξ΅'.least (f x) Ξ» (y , β–‘x=y) β†’ case β–‘x=y of Ξ»
        x=y β†’ subst (Ξ» Ο• β†’ f Ο• B.≀ f x) x=y B.≀-refl)
      (Ξ΅'.fam≀lub (x , inc refl))
      where open fold-K f (singleton x) (singleton-is-K-finite (A .is-tr) x)

We now have all the ingredients to show that is a left adjoint. The unit of the adjunction takes an element to the singleton set and the universal extension of is as defined above.

make-free-join-slat : βˆ€ {β„“} β†’ (A : Set β„“) β†’ Free-object (Join-slatsβ†ͺSets {β„“ = β„“}) A
make-free-join-slat A .free = K[ A ]
make-free-join-slat A .unit = singletonᡏ A
make-free-join-slat A .fold {B} f .hom .hom            = fold-K A B f
make-free-join-slat A .fold {B} f .hom .pres-≀ {P} {Q} = fold-K-pres-≀ A B f P Q
make-free-join-slat A .fold {B} f .witness .βˆͺ-≀   = fold-K-βˆͺ-≀ A B f
make-free-join-slat A .fold {B} f .witness .bot-≀ = fold-K-bot-≀ A B f

As noted earlier, the extension of agrees with on singleton sets, so the universal extension commutes with the unit of the adjunction.

make-free-join-slat A .commute {B} {f} = ext (fold-K-singleton A B f)

Finally, we shall show that the universal extension of is unique. Let such that and let To see that the note that is computed via taking a join, so it suffices to show that is also computed via a join over the same family.

By our assumptions, agrees with on singleton sets. However, every K-finite subset can be described as a (finitely-indexed) join over the elements of Furthermore, preserves all finitely-indexed joins, so must be computed as a join over the elements of which is the same join used to compute the extension of

make-free-join-slat A .unique {B} {f} g p = ext Ξ» P pfin β†’
  sym $ lub-unique (fold-K.Ξ΅'.has-lub A B f P pfin)
    (cast-is-lubαΆ  (Ξ» Q β†’ (p #β‚š Q .fst)) $
      pres-finitely-indexed-lub (g .witness) pfin _ _ $
      K-singleton-lub A _)

  1. Here we construct the underlying map first, the proof that it’s a semilattice homomorphism follows.β†©οΈŽ