definition example

Let be a Preorder and . An element is a join (least upper bound) of if

(a) for all , , and (b) for all with for all , we have .

We write or , and when . Joins are the dual of meets (replace by everywhere), so all remarks there — uniqueness up to equivalence, possible non-existence, Proposition 1.91 () — dualize.

Sources: 7 Sketches §1.1 (“joining systems”), Definition 1.81, Examples 1.87–1.89, Exercises 1.7, 1.85, 1.90, 1.94; Definition 1.93; CTfS §3.4.2 (Definition 3.4.2.1, Exercises 3.4.2.2–3.4.2.4), §3.4.4 (Exercises 3.4.4.3, 3.4.4.7, 3.4.4.10–3.4.4.11)

Examples

Joins in science (Category Theory for Scientists §3.4.4)

  • Taxonomy: in the tree of life ordered by “is a kind of”, the join of two species is their most specific common taxon; meets of distinct species usually do not exist (CTfS Exercise 3.4.4.3, Tree of Life).
  • Geography: open regions of the earth ordered by inclusion have joins (unions) and binary meets (intersections). Assigning to each region the interval of temperatures recorded in it is a monotone map to intervals of that preserves joins (the range over a union is the smallest interval containing both ranges) but not meets: the range over can be strictly smaller than the intersection of the two ranges (CTfS Exercise 3.4.4.11).
  • Security: the sets of people who need to know every piece of information in reverse inclusion () and are closed under intersection, so they have meets; joins of such sets need not be unions (CTfS Exercise 3.4.4.7).

Joins and observations

For any monotone and with joins, (7S Exercise 1.94); strict inequality is a Generative Effect. Left adjoints of Galois connections preserve joins (and right adjoints preserve meets); a map out of a preorder with all joins is a left adjoint iff it preserves joins (Adjoint Functor Theorem for Preorders).

Categorically a join is a Colimit in the thin category: is the Coproduct, is the bottom element, an Initial Object. In a Quantale the monoidal product distributes over all joins.

Docs: FinSets · C-set morphisms · Vignette: meets

function join_in(leq, xs, A)
  ubs = [q for q in xs if all(leq(a, q) for a in A)]
  for p in ubs
    all(leq(p, q) for q in ubs) && return p
  end
  nothing
end
join_in((a,b) -> b % a == 0, 1:12, [4, 6])   # 12 (lcm)

Catlab version (run in a fresh Julia session — Catlab exports its own compose, id, FinFunction, …):

using Catlab
X = FinSet(3); U = Subobject(X, [1,2]); V = Subobject(X, [2,3])
join(U, V)   # {1,2,3}
#check @IsLUB
#check @sSup
example (A B : Set ℕ) : A ⊔ B = A ∪ B := rfl
example (a b : Bool) : a ⊔ b = (a || b) := rfl
join :: Preorder a => [a] -> [a] -> Maybe a
join xs as =
  let ubs = [q | q <- xs, all (`leq` q) as]
  in case [p | p <- ubs, all (leq p) ubs] of
       (p:_) -> Just p
       []    -> Nothing