module Cat.Diagram.Equaliser.Joint {o β} (C : Precategory o β) where
Joint equalisersπ
The joint equaliser of a family of parallel maps is a straightforward generalisation of the notion of equaliser to more than two maps. The universal property is straightforward to state: the joint equaliser of the is an arrow satisfying which is universal with this property.
record is-joint-equaliser {β'} {I : Type β'} {E x y} (F : I β Hom x y) (equ : Hom E x) : Type (o β β β β') where field equal : β {i j} β F i β equ β‘ F j β equ universal : β {E'} {e' : Hom E' x} (eq : β i j β F i β e' β‘ F j β e') β Hom E' E factors : β {E'} {e' : Hom E' x} {eq : β i j β F i β e' β‘ F j β e'} β equ β universal eq β‘ e' unique : β {E'} {e' : Hom E' x} {eq : β i j β F i β e' β‘ F j β e'} {o : Hom E' E} β equ β o β‘ e' β o β‘ universal eq
uniqueβ : β {E'} {e' : Hom E' x} {o1 o2 : Hom E' E} β (β i j β F i β e' β‘ F j β e') β equ β o1 β‘ e' β equ β o2 β‘ e' β o1 β‘ o2 uniqueβ eq p q = unique {eq = eq} p β sym (unique q)
A simple calculation tells us that joint equalisers are monic, much like binary equalisers:
is-joint-equaliserβis-monic : is-monic equ is-joint-equaliserβis-monic g h x = uniqueβ (Ξ» i j β extendl equal) refl (sym x)
record Joint-equaliser {β'} {I : Type β'} {x y} (F : I β Hom x y) : Type (o β β β β') where field {apex} : Ob equ : Hom apex x has-is-je : is-joint-equaliser F equ open is-joint-equaliser has-is-je public open is-joint-equaliser
Computationπ
Joint equalisers are also limits. We can define the figure shape that they are limits over as a straightforward generalisation of the parallel-arrows category, where there is an arbitrary set of arrows between the two objects.
module _ {β'} {I : Type β'} β¦ _ : H-Level I 2 β¦ {x y} (F : I β Hom x y) where private module P = Precategory private shape : Precategory _ _ shape .P.Ob = Bool shape .P.Hom false false = Lift β' β€ shape .P.Hom false true = I shape .P.Hom true false = Lift β' β₯ shape .P.Hom true true = Lift β' β€
Giving this the structure of a category is trivial: other than the parallel arrows, there is nothing to compose with.
shape .P.Hom-set true true = hlevel 2 shape .P.Hom-set true false = hlevel 2 shape .P.Hom-set false true = hlevel 2 shape .P.Hom-set false false = hlevel 2 shape .P.id {true} = _ shape .P.id {false} = _ shape .P._β_ {true} {true} {true} f g = lift tt shape .P._β_ {false} {true} {true} f g = g shape .P._β_ {false} {false} {true} f g = f shape .P._β_ {false} {false} {false} f g = lift tt shape .P.idr {true} {true} f = refl shape .P.idr {false} {true} f = refl shape .P.idr {false} {false} f = refl shape .P.idl {true} {true} f = refl shape .P.idl {false} {true} f = refl shape .P.idl {false} {false} f = refl shape .P.assoc {true} {true} {true} {true} f g h = refl shape .P.assoc {false} {true} {true} {true} f g h = refl shape .P.assoc {false} {false} {true} {true} f g h = refl shape .P.assoc {false} {false} {false} {true} f g h = refl shape .P.assoc {false} {false} {false} {false} f g h = refl
The family of arrows
extends straightforwardly to a functor from this shape
category to
diagram : Functor shape C diagram .Fβ true = y diagram .Fβ false = x diagram .Fβ {true} {true} f = id diagram .Fβ {false} {true} i = F i diagram .Fβ {false} {false} f = id diagram .F-id {true} = refl diagram .F-id {false} = refl diagram .F-β {true} {true} {true} f g = introl refl diagram .F-β {false} {true} {true} f g = introl refl diagram .F-β {false} {false} {true} f g = intror refl diagram .F-β {false} {false} {false} f g = introl refl
If the family is pointed, and the diagram
has a limit, then this
limit is a joint equaliser of the given arrows. The requirement for a
point in the family ensures that weβre not taking the joint equaliser of
no arrows, which would be a product. Finally, since
joint equalisers are unique, this construction is invariant under the
chosen point; it would thus suffice for the family to be inhabited
instead.
is-limitβjoint-equaliser : β {L} {l} β I β is-limit diagram L l β is-joint-equaliser F (l .Ξ· false) is-limitβjoint-equaliser {L} {l} ix lim = je where module l = is-limit lim je : is-joint-equaliser F (l .Ξ· false) je .equal = sym (l .is-natural false true _) β l .is-natural false true _ je .universal {E'} {e'} eq = l.universal (Ξ» { true β F ix β e' ; false β e' }) Ξ» { {true} {true} f β eliml refl ; {false} {true} f β eq f ix ; {false} {false} f β eliml refl } je .factors = l.factors _ _ je .unique p = l.unique _ _ _ Ξ» where true β apβ _β_ (intror refl β l .is-natural false true ix) refl β pullr p false β p open Joint-equaliser LimitβJoint-equaliser : I β Limit diagram β Joint-equaliser F LimitβJoint-equaliser ix lim .apex = Limit.apex lim LimitβJoint-equaliser ix lim .equ = Limit.cone lim .Ξ· false LimitβJoint-equaliser ix lim .has-is-je = is-limitβjoint-equaliser ix (Limit.has-limit lim)