Multi-(co)equalizers #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
A multiequalizer is an equalizer of two morphisms between two products. Since both products and equalizers are limits, such an object is again a limit. This file provides the diagram whose limit is indeed such an object. In fact, it is well-known that any limit can be obtained as a multiequalizer. The dual construction (multicoequalizers) is also provided.
Projects #
Prove that a multiequalizer can be identified with an equalizer between products (and analogously for multicoequalizers).
Prove that the limit of any diagram is a multiequalizer (and similarly for colimits).
- left : Π {L R : Type w} {fst snd : R → L}, L → category_theory.limits.walking_multicospan fst snd
- right : Π {L R : Type w} {fst snd : R → L}, R → category_theory.limits.walking_multicospan fst snd
The type underlying the multiequalizer diagram.
Instances for category_theory.limits.walking_multicospan
- category_theory.limits.walking_multicospan.has_sizeof_inst
- category_theory.limits.walking_multicospan.inhabited
- category_theory.limits.walking_multicospan.category_theory.small_category
- left : Π {L R : Type w} {fst snd : L → R}, L → category_theory.limits.walking_multispan fst snd
- right : Π {L R : Type w} {fst snd : L → R}, R → category_theory.limits.walking_multispan fst snd
The type underlying the multiecoqualizer diagram.
Instances for category_theory.limits.walking_multispan
- category_theory.limits.walking_multispan.has_sizeof_inst
- category_theory.limits.walking_multispan.inhabited
- category_theory.limits.walking_multispan.category_theory.small_category
- id : Π {L R : Type w} {fst snd : R → L} (A : category_theory.limits.walking_multicospan fst snd), A.hom A
- fst : Π {L R : Type w} {fst snd : R → L} (b : R), (category_theory.limits.walking_multicospan.left (fst b)).hom (category_theory.limits.walking_multicospan.right b)
- snd : Π {L R : Type w} {fst snd : R → L} (b : R), (category_theory.limits.walking_multicospan.left (snd b)).hom (category_theory.limits.walking_multicospan.right b)
Morphisms for walking_multicospan
.
Instances for category_theory.limits.walking_multicospan.hom
- category_theory.limits.walking_multicospan.hom.has_sizeof_inst
- category_theory.limits.walking_multicospan.hom.inhabited
Composition of morphisms for walking_multicospan
.
Equations
- (category_theory.limits.walking_multicospan.hom.snd b).comp (category_theory.limits.walking_multicospan.hom.id (category_theory.limits.walking_multicospan.right b)) = category_theory.limits.walking_multicospan.hom.snd b
- (category_theory.limits.walking_multicospan.hom.fst b).comp (category_theory.limits.walking_multicospan.hom.id (category_theory.limits.walking_multicospan.right b)) = category_theory.limits.walking_multicospan.hom.fst b
- (category_theory.limits.walking_multicospan.hom.id X).comp f = f
Equations
- category_theory.limits.walking_multicospan.category_theory.small_category = {to_category_struct := {to_quiver := {hom := category_theory.limits.walking_multicospan.hom snd}, id := category_theory.limits.walking_multicospan.hom.id snd, comp := λ (X Y Z : category_theory.limits.walking_multicospan fst snd), category_theory.limits.walking_multicospan.hom.comp}, id_comp' := _, comp_id' := _, assoc' := _}
- id : Π {L R : Type v} {fst snd : L → R} (A : category_theory.limits.walking_multispan fst snd), A.hom A
- fst : Π {L R : Type v} {fst snd : L → R} (a : L), (category_theory.limits.walking_multispan.left a).hom (category_theory.limits.walking_multispan.right (fst a))
- snd : Π {L R : Type v} {fst snd : L → R} (a : L), (category_theory.limits.walking_multispan.left a).hom (category_theory.limits.walking_multispan.right (snd a))
Morphisms for walking_multispan
.
Instances for category_theory.limits.walking_multispan.hom
- category_theory.limits.walking_multispan.hom.has_sizeof_inst
- category_theory.limits.walking_multispan.hom.inhabited
Composition of morphisms for walking_multispan
.
Equations
- (category_theory.limits.walking_multispan.hom.snd a).comp (category_theory.limits.walking_multispan.hom.id (category_theory.limits.walking_multispan.right (snd a))) = category_theory.limits.walking_multispan.hom.snd a
- (category_theory.limits.walking_multispan.hom.fst a).comp (category_theory.limits.walking_multispan.hom.id (category_theory.limits.walking_multispan.right (fst a))) = category_theory.limits.walking_multispan.hom.fst a
- (category_theory.limits.walking_multispan.hom.id X).comp f = f
Equations
- category_theory.limits.walking_multispan.category_theory.small_category = {to_category_struct := {to_quiver := {hom := category_theory.limits.walking_multispan.hom snd}, id := category_theory.limits.walking_multispan.hom.id snd, comp := λ (X Y Z : category_theory.limits.walking_multispan fst snd), category_theory.limits.walking_multispan.hom.comp}, id_comp' := _, comp_id' := _, assoc' := _}
- L : Type ?
- R : Type ?
- fst_to : self.R → self.L
- snd_to : self.R → self.L
- left : self.L → C
- right : self.R → C
- fst : Π (b : self.R), self.left (self.fst_to b) ⟶ self.right b
- snd : Π (b : self.R), self.left (self.snd_to b) ⟶ self.right b
This is a structure encapsulating the data necessary to define a multicospan
.
Instances for category_theory.limits.multicospan_index
- category_theory.limits.multicospan_index.has_sizeof_inst
- L : Type ?
- R : Type ?
- fst_from : self.L → self.R
- snd_from : self.L → self.R
- left : self.L → C
- right : self.R → C
- fst : Π (a : self.L), self.left a ⟶ self.right (self.fst_from a)
- snd : Π (a : self.L), self.left a ⟶ self.right (self.snd_from a)
This is a structure encapsulating the data necessary to define a multispan
.
Instances for category_theory.limits.multispan_index
- category_theory.limits.multispan_index.has_sizeof_inst
The multicospan associated to I : multicospan_index
.
Equations
- I.multicospan = {obj := λ (x : category_theory.limits.walking_multicospan I.fst_to I.snd_to), category_theory.limits.multicospan_index.multicospan._match_1 I x, map := λ (x y : category_theory.limits.walking_multicospan I.fst_to I.snd_to) (f : x ⟶ y), category_theory.limits.multicospan_index.multicospan._match_2 I x y f, map_id' := _, map_comp' := _}
- category_theory.limits.multicospan_index.multicospan._match_1 I (category_theory.limits.walking_multicospan.right b) = I.right b
- category_theory.limits.multicospan_index.multicospan._match_1 I (category_theory.limits.walking_multicospan.left a) = I.left a
- category_theory.limits.multicospan_index.multicospan._match_2 I (category_theory.limits.walking_multicospan.left (I.snd_to b)) (category_theory.limits.walking_multicospan.right b) (category_theory.limits.walking_multicospan.hom.snd b) = I.snd b
- category_theory.limits.multicospan_index.multicospan._match_2 I (category_theory.limits.walking_multicospan.left (I.fst_to b)) (category_theory.limits.walking_multicospan.right b) (category_theory.limits.walking_multicospan.hom.fst b) = I.fst b
- category_theory.limits.multicospan_index.multicospan._match_2 I x x (category_theory.limits.walking_multicospan.hom.id x) = 𝟙 (category_theory.limits.multicospan_index.multicospan._match_1 I x)
The induced map ∏ I.left ⟶ ∏ I.right
via I.fst
.
Equations
- I.fst_pi_map = category_theory.limits.pi.lift (λ (b : I.R), category_theory.limits.pi.π I.left (I.fst_to b) ≫ I.fst b)
The induced map ∏ I.left ⟶ ∏ I.right
via I.snd
.
Equations
- I.snd_pi_map = category_theory.limits.pi.lift (λ (b : I.R), category_theory.limits.pi.π I.left (I.snd_to b) ≫ I.snd b)
Taking the multiequalizer over the multicospan index is equivalent to taking the equalizer over
the two morphsims ∏ I.left ⇉ ∏ I.right
. This is the diagram of the latter.
Equations
The multispan associated to I : multispan_index
.
Equations
- I.multispan = {obj := λ (x : category_theory.limits.walking_multispan I.fst_from I.snd_from), category_theory.limits.multispan_index.multispan._match_1 I x, map := λ (x y : category_theory.limits.walking_multispan I.fst_from I.snd_from) (f : x ⟶ y), category_theory.limits.multispan_index.multispan._match_2 I x y f, map_id' := _, map_comp' := _}
- category_theory.limits.multispan_index.multispan._match_1 I (category_theory.limits.walking_multispan.right b) = I.right b
- category_theory.limits.multispan_index.multispan._match_1 I (category_theory.limits.walking_multispan.left a) = I.left a
- category_theory.limits.multispan_index.multispan._match_2 I (category_theory.limits.walking_multispan.left b) (category_theory.limits.walking_multispan.right (I.snd_from b)) (category_theory.limits.walking_multispan.hom.snd b) = I.snd b
- category_theory.limits.multispan_index.multispan._match_2 I (category_theory.limits.walking_multispan.left b) (category_theory.limits.walking_multispan.right (I.fst_from b)) (category_theory.limits.walking_multispan.hom.fst b) = I.fst b
- category_theory.limits.multispan_index.multispan._match_2 I x x (category_theory.limits.walking_multispan.hom.id x) = 𝟙 (category_theory.limits.multispan_index.multispan._match_1 I x)
Instances for category_theory.limits.multispan_index.multispan
- algebraic_geometry.Scheme.glue_data.algebraic_geometry.Scheme.forget_to_LocallyRingedSpace.category_theory.creates_colimit
- algebraic_geometry.Scheme.glue_data.algebraic_geometry.Scheme.forget_to_Top.category_theory.limits.preserves_colimit
- algebraic_geometry.Scheme.glue_data.diagram.category_theory.limits.has_multicoequalizer
The induced map ∐ I.left ⟶ ∐ I.right
via I.fst
.
Equations
- I.fst_sigma_map = category_theory.limits.sigma.desc (λ (b : I.L), I.fst b ≫ category_theory.limits.sigma.ι I.right (I.fst_from b))
The induced map ∐ I.left ⟶ ∐ I.right
via I.snd
.
Equations
- I.snd_sigma_map = category_theory.limits.sigma.desc (λ (b : I.L), I.snd b ≫ category_theory.limits.sigma.ι I.right (I.snd_from b))
Taking the multicoequalizer over the multispan index is equivalent to taking the coequalizer over
the two morphsims ∐ I.left ⇉ ∐ I.right
. This is the diagram of the latter.
A multifork is a cone over a multicospan.
A multicofork is a cocone over a multispan.
The maps from the cone point of a multifork to the objects on the left.
Equations
- K.ι a = K.π.app (category_theory.limits.walking_multicospan.left a)
Construct a multifork using a collection ι
of morphisms.
Equations
- category_theory.limits.multifork.of_ι I P ι w = {X := P, π := {app := λ (x : category_theory.limits.walking_multicospan I.fst_to I.snd_to), category_theory.limits.multifork.of_ι._match_1 I P ι x, naturality' := _}}
- category_theory.limits.multifork.of_ι._match_1 I P ι (category_theory.limits.walking_multicospan.right b) = ι (I.fst_to b) ≫ I.fst b
- category_theory.limits.multifork.of_ι._match_1 I P ι (category_theory.limits.walking_multicospan.left a) = ι a
This definition provides a convenient way to show that a multifork is a limit.
Given a multifork, we may obtain a fork over ∏ I.left ⇉ ∏ I.right
.
Equations
- K.to_pi_fork = {X := K.X, π := {app := λ (x : category_theory.limits.walking_parallel_pair), category_theory.limits.multifork.to_pi_fork._match_1 K x, naturality' := _}}
- category_theory.limits.multifork.to_pi_fork._match_1 K category_theory.limits.walking_parallel_pair.one = category_theory.limits.pi.lift K.ι ≫ I.fst_pi_map
- category_theory.limits.multifork.to_pi_fork._match_1 K category_theory.limits.walking_parallel_pair.zero = category_theory.limits.pi.lift K.ι
Given a fork over ∏ I.left ⇉ ∏ I.right
, we may obtain a multifork.
Equations
- category_theory.limits.multifork.of_pi_fork I c = {X := c.X, π := {app := λ (x : category_theory.limits.walking_multicospan I.fst_to I.snd_to), category_theory.limits.multifork.of_pi_fork._match_1 I c x, naturality' := _}}
- category_theory.limits.multifork.of_pi_fork._match_1 I c (category_theory.limits.walking_multicospan.right b) = c.ι ≫ I.fst_pi_map ≫ category_theory.limits.pi.π I.right b
- category_theory.limits.multifork.of_pi_fork._match_1 I c (category_theory.limits.walking_multicospan.left a) = c.ι ≫ category_theory.limits.pi.π I.left a
multifork.to_pi_fork
is functorial.
Equations
- I.to_pi_fork_functor = {obj := category_theory.limits.multifork.to_pi_fork _inst_3, map := λ (K₁ K₂ : category_theory.limits.multifork I) (f : K₁ ⟶ K₂), {hom := f.hom, w' := _}, map_id' := _, map_comp' := _}
multifork.of_pi_fork
is functorial.
Equations
- I.of_pi_fork_functor = {obj := category_theory.limits.multifork.of_pi_fork I _inst_3, map := λ (K₁ K₂ : category_theory.limits.fork I.fst_pi_map I.snd_pi_map) (f : K₁ ⟶ K₂), {hom := f.hom, w' := _}, map_id' := _, map_comp' := _}
The category of multiforks is equivalent to the category of forks over ∏ I.left ⇉ ∏ I.right
.
It then follows from category_theory.is_limit_of_preserves_cone_terminal
(or reflects
) that it
preserves and reflects limit cones.
Equations
- I.multifork_equiv_pi_fork = {functor := I.to_pi_fork_functor _inst_3, inverse := I.of_pi_fork_functor _inst_3, unit_iso := category_theory.nat_iso.of_components (λ (K : category_theory.limits.multifork I), category_theory.limits.cones.ext (category_theory.iso.refl ((𝟭 (category_theory.limits.multifork I)).obj K).X) _) _, counit_iso := category_theory.nat_iso.of_components (λ (K : category_theory.limits.fork I.fst_pi_map I.snd_pi_map), category_theory.limits.fork.ext (category_theory.iso.refl ((I.of_pi_fork_functor ⋙ I.to_pi_fork_functor).obj K).X) _) _, functor_unit_iso_comp' := _}
The maps to the cocone point of a multicofork from the objects on the right.
Equations
- K.π b = K.ι.app (category_theory.limits.walking_multispan.right b)
Construct a multicofork using a collection π
of morphisms.
Equations
- category_theory.limits.multicofork.of_π I P π w = {X := P, ι := {app := λ (x : category_theory.limits.walking_multispan I.fst_from I.snd_from), category_theory.limits.multicofork.of_π._match_1 I P π x, naturality' := _}}
- category_theory.limits.multicofork.of_π._match_1 I P π (category_theory.limits.walking_multispan.right b) = π b
- category_theory.limits.multicofork.of_π._match_1 I P π (category_theory.limits.walking_multispan.left a) = I.fst a ≫ π (I.fst_from a)
This definition provides a convenient way to show that a multicofork is a colimit.
Given a multicofork, we may obtain a cofork over ∐ I.left ⇉ ∐ I.right
.
Equations
- K.to_sigma_cofork = {X := K.X, ι := {app := λ (x : category_theory.limits.walking_parallel_pair), category_theory.limits.multicofork.to_sigma_cofork._match_1 K x, naturality' := _}}
- category_theory.limits.multicofork.to_sigma_cofork._match_1 K category_theory.limits.walking_parallel_pair.one = category_theory.limits.sigma.desc K.π
- category_theory.limits.multicofork.to_sigma_cofork._match_1 K category_theory.limits.walking_parallel_pair.zero = I.fst_sigma_map ≫ category_theory.limits.sigma.desc K.π
Given a cofork over ∐ I.left ⇉ ∐ I.right
, we may obtain a multicofork.
Equations
- category_theory.limits.multicofork.of_sigma_cofork I c = {X := c.X, ι := {app := λ (x : category_theory.limits.walking_multispan I.fst_from I.snd_from), category_theory.limits.multicofork.of_sigma_cofork._match_1 I c x, naturality' := _}}
- category_theory.limits.multicofork.of_sigma_cofork._match_1 I c (category_theory.limits.walking_multispan.right b) = category_theory.limits.sigma.ι I.right b ≫ c.π
- category_theory.limits.multicofork.of_sigma_cofork._match_1 I c (category_theory.limits.walking_multispan.left a) = category_theory.limits.sigma.ι I.left a ≫ I.fst_sigma_map ≫ c.π
multicofork.to_sigma_cofork
is functorial.
Equations
- I.to_sigma_cofork_functor = {obj := category_theory.limits.multicofork.to_sigma_cofork _inst_3, map := λ (K₁ K₂ : category_theory.limits.multicofork I) (f : K₁ ⟶ K₂), {hom := f.hom, w' := _}, map_id' := _, map_comp' := _}
multicofork.of_sigma_cofork
is functorial.
Equations
- I.of_sigma_cofork_functor = {obj := category_theory.limits.multicofork.of_sigma_cofork I _inst_3, map := λ (K₁ K₂ : category_theory.limits.cofork I.fst_sigma_map I.snd_sigma_map) (f : K₁ ⟶ K₂), {hom := f.hom, w' := _}, map_id' := _, map_comp' := _}
The category of multicoforks is equivalent to the category of coforks over ∐ I.left ⇉ ∐ I.right
.
It then follows from category_theory.is_colimit_of_preserves_cocone_initial
(or reflects
) that
it preserves and reflects colimit cocones.
Equations
- I.multicofork_equiv_sigma_cofork = {functor := I.to_sigma_cofork_functor _inst_3, inverse := I.of_sigma_cofork_functor _inst_3, unit_iso := category_theory.nat_iso.of_components (λ (K : category_theory.limits.multicofork I), category_theory.limits.cocones.ext (category_theory.iso.refl ((𝟭 (category_theory.limits.multicofork I)).obj K).X) _) _, counit_iso := category_theory.nat_iso.of_components (λ (K : category_theory.limits.cofork I.fst_sigma_map I.snd_sigma_map), category_theory.limits.cofork.ext (category_theory.iso.refl ((I.of_sigma_cofork_functor ⋙ I.to_sigma_cofork_functor).obj K).X) _) _, functor_unit_iso_comp' := _}
For I : multicospan_index C
, we say that it has a multiequalizer if the associated
multicospan has a limit.
The multiequalizer of I : multicospan_index C
.
For I : multispan_index C
, we say that it has a multicoequalizer if
the associated multicospan has a limit.
The multiecoqualizer of I : multispan_index C
.
The canonical map from the multiequalizer to the objects on the left.
The multifork associated to the multiequalizer.
Construct a morphism to the multiequalizer from its universal property.
The multiequalizer is isomorphic to the equalizer of ∏ I.left ⇉ ∏ I.right
.
Equations
- category_theory.limits.multiequalizer.iso_equalizer I = category_theory.limits.limit.iso_limit_cone {cone := I.multifork_equiv_pi_fork.inverse.obj (category_theory.limits.limit.cone (category_theory.limits.parallel_pair I.fst_pi_map I.snd_pi_map)), is_limit := category_theory.limits.is_limit.of_preserves_cone_terminal I.multifork_equiv_pi_fork.inverse (category_theory.limits.limit.is_limit (category_theory.limits.parallel_pair I.fst_pi_map I.snd_pi_map))}
The canonical injection multiequalizer I ⟶ ∏ I.left
.
Equations
Instances for category_theory.limits.multiequalizer.ι_pi
The canonical map from the multiequalizer to the objects on the left.
The multicofork associated to the multicoequalizer.
Construct a morphism from the multicoequalizer from its universal property.
The multicoequalizer is isomorphic to the coequalizer of ∐ I.left ⇉ ∐ I.right
.
Equations
- category_theory.limits.multicoequalizer.iso_coequalizer I = category_theory.limits.colimit.iso_colimit_cocone {cocone := I.multicofork_equiv_sigma_cofork.inverse.obj (category_theory.limits.colimit.cocone (category_theory.limits.parallel_pair I.fst_sigma_map I.snd_sigma_map)), is_colimit := category_theory.limits.is_colimit.of_preserves_cocone_initial I.multicofork_equiv_sigma_cofork.inverse (category_theory.limits.colimit.is_colimit (category_theory.limits.parallel_pair I.fst_sigma_map I.snd_sigma_map))}
The canonical projection ∐ I.right ⟶ multicoequalizer I
.