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_family
is the indexing category used for wide (co)equalizer diagramsparallel_family
is a functor fromwalking_parallel_family
to our categoryC
.- a
trident
is 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_equalizer
is now just alimit (parallel_family f)
Each of these has a dual.
Main statements #
wide_equalizer.ι_mono
states that every wide_equalizer map is a monomorphismis_iso_limit_cone_parallel_family_of_self
states that the identity on the domain off
is an equalizer off
andf
.
Implementation notes #
As with the other special shapes in the limits library, all the definitions here are given as
abbreviation
s 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