module Order.Diagram.Join where
private variable
: Level o â
Joinsđ
In the binary case, a least upper bound is called a join. A short computation shows that being a join is precisely being the lub of a family of two elements.
record is-join (P : Poset o â) (a b lub : â P â) : Type (o â â) where
no-eta-equality
open Poset P
field
: a †lub
lâ€join : b †lub
râ€join : (ub' : Ob) â a †ub' â b †ub' â lub †ub'
least
record Join (P : Poset o â) (a b : â P â) : Type (o â â) where
no-eta-equality
field
: â P â
lub : is-join P a b lub
has-join open is-join has-join public
: Poset o â â Type (o â â)
Has-joins = â x y â Join P x y
Has-joins P
open is-join
unquoteDecl H-Level-is-join = declare-record-hlevel 1 H-Level-is-join (quote is-join)
module _ {o â} {P : Poset o â} where
open Poset P
open is-lub
open Lub
: â {a b lub} â is-join P a b lub â is-lub P (if_then a else b) lub
is-joinâis-lub .famâ€lub true = join .lâ€join
is-joinâis-lub join .famâ€lub false = join .râ€join
is-joinâis-lub join .least ub' x = join .least ub' (x true) (x false)
is-joinâis-lub join
: â {a b lub} â is-lub P (if_then a else b) lub â is-join P a b lub
is-lubâis-join .lâ€join = lub .famâ€lub true
is-lubâis-join lub .râ€join = lub .famâ€lub false
is-lubâis-join lub .least ub' a<ub' b<ub' = lub .least ub' λ where
is-lubâis-join lub â a<ub'
true â b<ub' false
join-unique: â {a b x y}
â is-join P a b x â is-join P a b y
â x ⥠y
{a} {b} {x} {y} p q =
join-unique (is-joinâis-lub p) (is-joinâis-lub q)
lub-unique
: â {a b} â is-prop (Join P a b)
Join-is-prop .Join.lub =
Join-is-prop p q i (Join.has-join p) (Join.has-join q) i
join-unique {a = a} {b = b} p q i .Join.has-join =
Join-is-prop {B = λ i â is-join P a b (join-unique (Join.has-join p) (Join.has-join q) i)}
is-propâpathp (λ i â hlevel 1)
(Join.has-join p) (Join.has-join q) i
instance
H-Level-Join: â {a b} {n}
â H-Level (Join P a b) (suc n)
= prop-instance Join-is-prop
H-Level-Join
: â {a b} â Join P a b â Lub P (if_then a else b)
JoinâLub .Lub.lub = Join.lub join
JoinâLub join .Lub.has-lub = is-joinâis-lub (Join.has-join join)
JoinâLub join
: â {a b} â Lub P (if_then a else b) â Join P a b
LubâJoin .Join.lub = Lub.lub lub
LubâJoin lub .Join.has-join = is-lubâis-join (Lub.has-lub lub)
LubâJoin lub
: â {a b lub : Ob} â is-equiv (is-joinâis-lub {a} {b} {lub})
is-joinâis-lub = biimp-is-equiv! _ is-lubâis-join
is-joinâis-lub
: â {a b} â is-equiv (JoinâLub {a} {b})
JoinâLub = biimp-is-equiv! _ LubâJoin JoinâLub
An important lemma about joins is that, if then the least upper bound of and is just
: â {a b} â a †b â is-join P a b b
gtâis-join .lâ€join = aâ€b
gtâis-join aâ€b .râ€join = â€-refl
gtâis-join aâ€b .least ub' _ bâ€ub' = bâ€ub'
gtâis-join aâ€b
: â {a b l} â a †b â is-join P a b l â b ⥠l
gt-join = join-unique (gtâis-join aâ€b) l gt-join aâ€b l
As coproductsđ
Joins are the âthinningâ of coproducts; Put another way, when we allow a set of relators, rather than insisting on a propositional relation, the concept of join needs to be refined to that of coproduct.
open is-coproduct
open Coproduct
: â {a b lub : Ob} â is-join P a b lub â Coproduct (posetâcategory P) a b
is-joinâcoproduct .coapex = _
is-joinâcoproduct lub .Îčâ = lub .is-join.lâ€join
is-joinâcoproduct lub .Îčâ = lub .is-join.râ€join
is-joinâcoproduct lub .has-is-coproduct .[_,_] a<q b<q =
is-joinâcoproduct lub .is-join.least _ a<q b<q
lub .has-is-coproduct .[]âÎčâ = prop!
is-joinâcoproduct lub .has-is-coproduct .[]âÎčâ = prop!
is-joinâcoproduct lub .has-is-coproduct .unique _ _ = prop! is-joinâcoproduct lub