Wide equalizers and wide coequalizers #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
This file defines wide (co)equalizers as special cases of (co)limits.
A wide equalizer for the family of morphisms X ⟶ Y indexed by J is the categorical
generalization of the subobject {a ∈ A | ∀ j₁ j₂, f(j₁, a) = f(j₂, a)}. Note that if J has
fewer than two morphisms this condition is trivial, so some lemmas and definitions assume J is
nonempty.
Main definitions #
walking_parallel_familyis the indexing category used for wide (co)equalizer diagramsparallel_familyis a functor fromwalking_parallel_familyto our categoryC.- a
tridentis a cone over a parallel family.- there is really only one interesting morphism in a trident: the arrow from the vertex of the
trident to the domain of f and g. It is called
trident.ι.
- there is really only one interesting morphism in a trident: the arrow from the vertex of the
trident to the domain of f and g. It is called
- a
wide_equalizeris now just alimit (parallel_family f)
Each of these has a dual.
Main statements #
wide_equalizer.ι_monostates that every wide_equalizer map is a monomorphismis_iso_limit_cone_parallel_family_of_selfstates that the identity on the domain offis an equalizer offandf.
Implementation notes #
As with the other special shapes in the limits library, all the definitions here are given as
abbreviations of the general statements for limits, so all the simp lemmas and theorems about
general limits can be used.
References #
- zero : Π {J : Type w}, category_theory.limits.walking_parallel_family J
- one : Π {J : Type w}, category_theory.limits.walking_parallel_family J
The type of objects for the diagram indexing a wide (co)equalizer.
Instances for category_theory.limits.walking_parallel_family
- category_theory.limits.walking_parallel_family.has_sizeof_inst
- category_theory.limits.walking_parallel_family.inhabited
- category_theory.limits.walking_parallel_family.category
Equations
- category_theory.limits.walking_parallel_family.decidable_eq category_theory.limits.walking_parallel_family.one category_theory.limits.walking_parallel_family.one = decidable.is_true category_theory.limits.walking_parallel_family.decidable_eq._main._proof_4
- category_theory.limits.walking_parallel_family.decidable_eq category_theory.limits.walking_parallel_family.one category_theory.limits.walking_parallel_family.zero = decidable.is_false category_theory.limits.walking_parallel_family.decidable_eq._main._proof_3
- category_theory.limits.walking_parallel_family.decidable_eq category_theory.limits.walking_parallel_family.zero category_theory.limits.walking_parallel_family.one = decidable.is_false category_theory.limits.walking_parallel_family.decidable_eq._main._proof_2
- category_theory.limits.walking_parallel_family.decidable_eq category_theory.limits.walking_parallel_family.zero category_theory.limits.walking_parallel_family.zero = decidable.is_true category_theory.limits.walking_parallel_family.decidable_eq._main._proof_1
- id : Π {J : Type w} (X : category_theory.limits.walking_parallel_family J), category_theory.limits.walking_parallel_family.hom J X X
- line : Π {J : Type w}, J → category_theory.limits.walking_parallel_family.hom J category_theory.limits.walking_parallel_family.zero category_theory.limits.walking_parallel_family.one
The type family of morphisms for the diagram indexing a wide (co)equalizer.
Instances for category_theory.limits.walking_parallel_family.hom
- category_theory.limits.walking_parallel_family.hom.has_sizeof_inst
- category_theory.limits.walking_parallel_family.hom.inhabited
Satisfying the inhabited linter
Composition of morphisms in the indexing diagram for wide (co)equalizers.
Equations
- category_theory.limits.walking_parallel_family.hom.comp category_theory.limits.walking_parallel_family.zero category_theory.limits.walking_parallel_family.one category_theory.limits.walking_parallel_family.one (category_theory.limits.walking_parallel_family.hom.line j) (category_theory.limits.walking_parallel_family.hom.id category_theory.limits.walking_parallel_family.one) = category_theory.limits.walking_parallel_family.hom.line j
- category_theory.limits.walking_parallel_family.hom.comp _x _x _x_1 (category_theory.limits.walking_parallel_family.hom.id _x) h = h
Equations
- category_theory.limits.walking_parallel_family.category = {to_category_struct := {to_quiver := {hom := category_theory.limits.walking_parallel_family.hom J}, id := category_theory.limits.walking_parallel_family.hom.id J, comp := category_theory.limits.walking_parallel_family.hom.comp J}, id_comp' := _, comp_id' := _, assoc' := _}
parallel_family f is the diagram in C consisting of the given family of morphisms, each with
common domain and codomain.
Equations
- category_theory.limits.parallel_family f = {obj := λ (x : category_theory.limits.walking_parallel_family J), x.cases_on X Y, map := λ (x y : category_theory.limits.walking_parallel_family J) (h : x ⟶ y), category_theory.limits.parallel_family._match_1 f x y h, map_id' := _, map_comp' := _}
- category_theory.limits.parallel_family._match_1 f category_theory.limits.walking_parallel_family.zero category_theory.limits.walking_parallel_family.one (category_theory.limits.walking_parallel_family.hom.line j) = f j
- category_theory.limits.parallel_family._match_1 f _x _x (category_theory.limits.walking_parallel_family.hom.id _x) = 𝟙 (_x.cases_on X Y)
Every functor indexing a wide (co)equalizer is naturally isomorphic (actually, equal) to a
parallel_family
walking_parallel_pair as a category is equivalent to a special case of
walking_parallel_family.
Equations
- category_theory.limits.walking_parallel_family_equiv_walking_parallel_pair = {functor := category_theory.limits.parallel_family (λ (p : ulift bool), cond p.down category_theory.limits.walking_parallel_pair_hom.left category_theory.limits.walking_parallel_pair_hom.right), inverse := category_theory.limits.parallel_pair (category_theory.limits.walking_parallel_family.hom.line {down := bool.tt}) (category_theory.limits.walking_parallel_family.hom.line {down := bool.ff}), unit_iso := category_theory.nat_iso.of_components (λ (X : category_theory.limits.walking_parallel_family (ulift bool)), category_theory.eq_to_iso _) category_theory.limits.walking_parallel_family_equiv_walking_parallel_pair._proof_2, counit_iso := category_theory.nat_iso.of_components (λ (X : category_theory.limits.walking_parallel_pair), category_theory.eq_to_iso _) category_theory.limits.walking_parallel_family_equiv_walking_parallel_pair._proof_4, functor_unit_iso_comp' := category_theory.limits.walking_parallel_family_equiv_walking_parallel_pair._proof_5}
A trident on f is just a cone (parallel_family f).
A cotrident on f and g is just a cocone (parallel_family f).
A trident t on the parallel family f : J → (X ⟶ Y) consists of two morphisms
t.π.app zero : t.X ⟶ X and t.π.app one : t.X ⟶ Y. Of these, only the first one is
interesting, and we give it the shorter name trident.ι t.
A cotrident t on the parallel family f : J → (X ⟶ Y) consists of two morphisms
t.ι.app zero : X ⟶ t.X and t.ι.app one : Y ⟶ t.X. Of these, only the second one is
interesting, and we give it the shorter name cotrident.π t.
A trident on f : J → (X ⟶ Y) is determined by the morphism ι : P ⟶ X satisfying
∀ j₁ j₂, ι ≫ f j₁ = ι ≫ f j₂.
Equations
- category_theory.limits.trident.of_ι ι w = {X := P, π := {app := λ (X_1 : category_theory.limits.walking_parallel_family J), X_1.cases_on ι (ι ≫ f (classical.arbitrary J)), naturality' := _}}
A cotrident on f : J → (X ⟶ Y) is determined by the morphism π : Y ⟶ P satisfying
∀ j₁ j₂, f j₁ ≫ π = f j₂ ≫ π.
Equations
- category_theory.limits.cotrident.of_π π w = {X := P, ι := {app := λ (X_1 : category_theory.limits.walking_parallel_family J), X_1.cases_on (f (classical.arbitrary J) ≫ π) π, naturality' := _}}
To check whether two maps are equalized by both maps of a trident, it suffices to check it for the first map
To check whether two maps are coequalized by both maps of a cotrident, it suffices to check it for the second map
If s is a limit trident over f, then a morphism k : W ⟶ X satisfying
∀ j₁ j₂, k ≫ f j₁ = k ≫ f j₂ induces a morphism l : W ⟶ s.X such that
l ≫ trident.ι s = k.
Equations
- category_theory.limits.trident.is_limit.lift' hs k h = ⟨hs.lift (category_theory.limits.trident.of_ι k h), _⟩
If s is a colimit cotrident over f, then a morphism k : Y ⟶ W satisfying
∀ j₁ j₂, f j₁ ≫ k = f j₂ ≫ k induces a morphism l : s.X ⟶ W such that
cotrident.π s ≫ l = k.
Equations
- category_theory.limits.cotrident.is_colimit.desc' hs k h = ⟨hs.desc (category_theory.limits.cotrident.of_π k h), _⟩
This is a slightly more convenient method to verify that a trident is a limit cone. It only asks for a proof of facts that carry any mathematical content
This is another convenient method to verify that a trident is a limit cone. It
only asks for a proof of facts that carry any mathematical content, and allows access to the
same s for all parts.
Equations
- category_theory.limits.trident.is_limit.mk' t create = category_theory.limits.trident.is_limit.mk t (λ (s : category_theory.limits.trident f), (create s).val) _ _
This is a slightly more convenient method to verify that a cotrident is a colimit cocone. It only asks for a proof of facts that carry any mathematical content
This is another convenient method to verify that a cotrident is a colimit cocone. It
only asks for a proof of facts that carry any mathematical content, and allows access to the
same s for all parts.
Equations
- category_theory.limits.cotrident.is_colimit.mk' t create = category_theory.limits.cotrident.is_colimit.mk t (λ (s : category_theory.limits.cotrident f), (create s).val) _ _
Given a limit cone for the family f : J → (X ⟶ Y), for any Z, morphisms from Z to its point
are in bijection with morphisms h : Z ⟶ X such that ∀ j₁ j₂, h ≫ f j₁ = h ≫ f j₂.
Further, this bijection is natural in Z: see trident.is_limit.hom_iso_natural.
The bijection of trident.is_limit.hom_iso is natural in Z.
Given a colimit cocone for the family f : J → (X ⟶ Y), for any Z, morphisms from the cocone
point to Z are in bijection with morphisms h : Z ⟶ X such that
∀ j₁ j₂, f j₁ ≫ h = f j₂ ≫ h. Further, this bijection is natural in Z: see
cotrident.is_colimit.hom_iso_natural.
The bijection of cotrident.is_colimit.hom_iso is natural in Z.
This is a helper construction that can be useful when verifying that a category has certain wide
equalizers. Given F : walking_parallel_family ⥤ C, which is really the same as
parallel_family (λ j, F.map (line j)), and a trident on λ j, F.map (line j), we get a cone
on F.
If you're thinking about using this, have a look at
has_wide_equalizers_of_has_limit_parallel_family, which you may find to be an easier way of
achieving your goal.
Equations
- category_theory.limits.cone.of_trident t = {X := t.X, π := {app := λ (X : category_theory.limits.walking_parallel_family J), t.π.app X ≫ category_theory.eq_to_hom _, naturality' := _}}
This is a helper construction that can be useful when verifying that a category has all
coequalizers. Given F : walking_parallel_family ⥤ C, which is really the same as
parallel_family (λ j, F.map (line j)), and a cotrident on λ j, F.map (line j) we get a
cocone on F.
If you're thinking about using this, have a look at
has_wide_coequalizers_of_has_colimit_parallel_family, which you may find to be an easier way
of achieving your goal.
Equations
- category_theory.limits.cocone.of_cotrident t = {X := t.X, ι := {app := λ (X : category_theory.limits.walking_parallel_family J), category_theory.eq_to_hom _ ≫ t.ι.app X, naturality' := _}}
Given F : walking_parallel_family ⥤ C, which is really the same as
parallel_family (λ j, F.map (line j)) and a cone on F, we get a trident on
λ j, F.map (line j).
Equations
- category_theory.limits.trident.of_cone t = {X := t.X, π := {app := λ (X : category_theory.limits.walking_parallel_family J), t.π.app X ≫ category_theory.eq_to_hom _, naturality' := _}}
Given F : walking_parallel_family ⥤ C, which is really the same as
parallel_family (F.map left) (F.map right) and a cocone on F, we get a cotrident on
λ j, F.map (line j).
Equations
- category_theory.limits.cotrident.of_cocone t = {X := t.X, ι := {app := λ (X : category_theory.limits.walking_parallel_family J), category_theory.eq_to_hom _ ≫ t.ι.app X, naturality' := _}}
Helper function for constructing morphisms between wide equalizer tridents.
Equations
- category_theory.limits.trident.mk_hom k w = {hom := k, w' := _}
To construct an isomorphism between tridents,
it suffices to give an isomorphism between the cone points
and check that it commutes with the ι morphisms.
Equations
- category_theory.limits.trident.ext i w = {hom := category_theory.limits.trident.mk_hom i.hom w, inv := category_theory.limits.trident.mk_hom i.inv _, hom_inv_id' := _, inv_hom_id' := _}
Helper function for constructing morphisms between coequalizer cotridents.
Equations
- category_theory.limits.cotrident.mk_hom k w = {hom := k, w' := _}
To construct an isomorphism between cotridents,
it suffices to give an isomorphism between the cocone points
and check that it commutes with the π morphisms.
Equations
- category_theory.limits.cotrident.ext i w = {hom := category_theory.limits.cotrident.mk_hom i.hom w, inv := category_theory.limits.cotrident.mk_hom i.inv _, hom_inv_id' := _, inv_hom_id' := _}
has_wide_equalizer f represents a particular choice of limiting cone for the parallel family of
morphisms f.
If a wide equalizer of f exists, we can access an arbitrary choice of such by
saying wide_equalizer f.
If a wide equalizer of f exists, we can access the inclusion wide_equalizer f ⟶ X by
saying wide_equalizer.ι f.
A wide equalizer cone for a parallel family f.
The wide_equalizer built from wide_equalizer.ι f is limiting.
Equations
- category_theory.limits.wide_equalizer_is_wide_equalizer f = (category_theory.limits.limit.is_limit (category_theory.limits.parallel_family (λ (j₁ : J), f j₁))).of_iso_limit (category_theory.limits.trident.ext (category_theory.iso.refl (category_theory.limits.limit.cone (category_theory.limits.parallel_family (λ (j₁ : J), f j₁))).X) _)
A morphism k : W ⟶ X satisfying ∀ j₁ j₂, k ≫ f j₁ = k ≫ f j₂ factors through the
wide equalizer of f via wide_equalizer.lift : W ⟶ wide_equalizer f.
A morphism k : W ⟶ X satisfying ∀ j₁ j₂, k ≫ f j₁ = k ≫ f j₂ induces a morphism
l : W ⟶ wide_equalizer f satisfying l ≫ wide_equalizer.ι f = k.
Equations
Two maps into a wide equalizer are equal if they are are equal when composed with the wide equalizer map.
A wide equalizer morphism is a monomorphism
The wide equalizer morphism in any limit cone is a monomorphism.
has_wide_coequalizer f g represents a particular choice of colimiting cocone
for the parallel family of morphisms f.
If a wide coequalizer of f, we can access an arbitrary choice of such by
saying wide_coequalizer f.
If a wide_coequalizer of f exists, we can access the corresponding projection by
saying wide_coequalizer.π f.
An arbitrary choice of coequalizer cocone for a parallel family f.
The cotrident built from wide_coequalizer.π f is colimiting.
Equations
- category_theory.limits.wide_coequalizer_is_wide_coequalizer f = (category_theory.limits.colimit.is_colimit (category_theory.limits.parallel_family (λ (j₁ : J), f j₁))).of_iso_colimit (category_theory.limits.cotrident.ext (category_theory.iso.refl (category_theory.limits.colimit.cocone (category_theory.limits.parallel_family (λ (j₁ : J), f j₁))).X) _)
Any morphism k : Y ⟶ W satisfying ∀ j₁ j₂, f j₁ ≫ k = f j₂ ≫ k factors through the
wide coequalizer of f via wide_coequalizer.desc : wide_coequalizer f ⟶ W.
Any morphism k : Y ⟶ W satisfying ∀ j₁ j₂, f j₁ ≫ k = f j₂ ≫ k induces a morphism
l : wide_coequalizer f ⟶ W satisfying wide_coequalizer.π ≫ g = l.
Equations
Two maps from a wide coequalizer are equal if they are equal when composed with the wide coequalizer map
A wide coequalizer morphism is an epimorphism
The wide coequalizer morphism in any colimit cocone is an epimorphism.
has_wide_equalizers represents a choice of wide equalizer for every family of morphisms
has_wide_coequalizers represents a choice of wide coequalizer for every family of morphisms
If C has all limits of diagrams parallel_family f, then it has all wide equalizers
If C has all colimits of diagrams parallel_family f, then it has all wide coequalizers