Zero morphisms and zero objects
A category "has zero morphisms" if there is a designated "zero morphism" in each morphism space, and compositions of zero morphisms with anything give the zero morphism. (Notice this is extra structure, not merely a property.)
A category "has a zero object" if it has an object which is both initial and terminal. Having a zero object provides zero morphisms, as the unique morphisms factoring through the zero object.
References
- https://en.wikipedia.org/wiki/Zero_morphism
- [F. Borceux, Handbook of Categorical Algebra 2][borceux-vol2]
- has_zero : Π (X Y : C), has_zero (X ⟶ Y)
- comp_zero' : (∀ {X Y : C} (f : X ⟶ Y) (Z : C), f ≫ 0 = 0) . "obviously"
- zero_comp' : (∀ (X : C) {Y Z : C} (f : Y ⟶ Z), 0 ≫ f = 0) . "obviously"
A category "has zero morphisms" if there is a designated "zero morphism" in each morphism space, and compositions of zero morphisms with anything give the zero morphism.
Instances
- category_theory.preadditive.preadditive_has_zero_morphisms
- category_theory.non_preadditive_abelian.has_zero_morphisms
- category_theory.limits.has_zero_morphisms_pempty
- category_theory.limits.has_zero_morphisms_punit
- category_theory.graded_object.has_zero_morphisms
- category_theory.differential_object.has_zero_morphisms
Equations
- category_theory.limits.has_zero_morphisms_pempty = {has_zero := λ (X Y : category_theory.discrete pempty), pempty.cases_on (λ (Y : category_theory.discrete pempty), has_zero (X ⟶ Y)) Y, comp_zero' := category_theory.limits.has_zero_morphisms_pempty._proof_1, zero_comp' := category_theory.limits.has_zero_morphisms_pempty._proof_2}
Equations
- category_theory.limits.has_zero_morphisms_punit = {has_zero := λ (X Y : category_theory.discrete punit), punit.cases_on Y (punit.cases_on X {zero := {down := category_theory.limits.has_zero_morphisms_punit._proof_1.mpr {down := _}}}), comp_zero' := category_theory.limits.has_zero_morphisms_punit._proof_2, zero_comp' := category_theory.limits.has_zero_morphisms_punit._proof_3}
If you're tempted to use this lemma "in the wild", you should probably
carefully consider whether you've made a mistake in allowing two
instances of has_zero_morphisms
to exist at all.
See, particularly, the note on zero_morphisms_of_zero_object
below.
- zero : C
- unique_to : Π (X : C), unique (category_theory.limits.has_zero_object.zero ⟶ X)
- unique_from : Π (X : C), unique (X ⟶ category_theory.limits.has_zero_object.zero)
A category "has a zero object" if it has an object which is both initial and terminal.
Instances
- category_theory.limits.has_zero_object_of_has_initial_object
- category_theory.limits.has_zero_object_of_has_terminal_object
- category_theory.non_preadditive_abelian.has_zero_object
- category_theory.limits.has_zero_object_punit
- Module.category_theory.limits.has_zero_object
- Group.category_theory.limits.has_zero_object
- AddGroup.has_zero_object
- CommGroup.category_theory.limits.has_zero_object
- AddCommGroup.has_zero_object
- category_theory.graded_object.has_zero_object
- category_theory.differential_object.has_zero_object
Equations
- category_theory.limits.has_zero_object_punit = {zero := punit.star, unique_to := λ (X : category_theory.discrete punit), punit.cases_on X {to_inhabited := category_theory.limits.has_zero_object_punit._aux_1, uniq := category_theory.limits.has_zero_object_punit._proof_1}, unique_from := λ (X : category_theory.discrete punit), punit.cases_on X {to_inhabited := category_theory.limits.has_zero_object_punit._aux_2, uniq := category_theory.limits.has_zero_object_punit._proof_2}}
Construct a has_zero C
for a category with a zero object.
This can not be a global instance as it will trigger for every has_zero C
typeclass search.
Equations
Equations
- _ = _
Equations
- _ = _
Equations
- _ = _
A category with a zero object has zero morphisms.
It is rarely a good idea to use this. Many categories that have a zero object have zero
morphisms for some other reason, for example from additivity. Library code that uses
zero_morphisms_of_zero_object
will then be incompatible with these categories because
the has_zero_morphisms
instances will not be definitionally equal. For this reason library
code should generally ask for an instance of has_zero_morphisms
separately, even if it already
asks for an instance of has_zero_objects
.
Equations
- category_theory.limits.has_zero_object.zero_morphisms_of_zero_object = {has_zero := λ (X Y : C), {zero := inhabited.default (X ⟶ 0) ≫ inhabited.default (0 ⟶ Y)}, comp_zero' := _, zero_comp' := _}
A zero object is in particular initial.
A zero object is in particular terminal.
An arrow ending in the zero object is zero
An arrow starting at the zero object is zero
An object X
has 𝟙 X = 0
if and only if it is isomorphic to the zero object.
Because X ≅ 0
contains data (even if a subsingleton), we express this ↔
as an ≃
.
Equations
- category_theory.limits.id_zero_equiv_iso_zero X = {to_fun := λ (h : 𝟙 X = 0), {hom := 0, inv := 0, hom_inv_id' := _, inv_hom_id' := _}, inv_fun := _, left_inv := _, right_inv := _}
A zero morphism 0 : X ⟶ Y
is an isomorphism if and only if
the identities on both X
and Y
are zero.
A zero morphism 0 : X ⟶ X
is an isomorphism if and only if
the identity on X
is zero.
Equations
A zero morphism 0 : X ⟶ Y
is an isomorphism if and only if
X
and Y
are isomorphic to the zero object.
Equations
- category_theory.limits.is_iso_zero_equiv_iso_zero X Y = (category_theory.limits.is_iso_zero_equiv X Y).trans {to_fun := _, inv_fun := λ (a : 𝟙 X = 0 ∧ 𝟙 Y = 0), a.dcases_on (λ (hX : 𝟙 X = 0) (hY : 𝟙 Y = 0), (⇑(category_theory.limits.id_zero_equiv_iso_zero X) hX, ⇑(category_theory.limits.id_zero_equiv_iso_zero Y) hY)), left_inv := _, right_inv := _}.symm
A zero morphism 0 : X ⟶ X
is an isomorphism if and only if
X
is isomorphic to the zero object.
If there are zero morphisms, any initial object is a zero object.
Equations
- category_theory.limits.has_zero_object_of_has_initial_object = {zero := ⊥_C, unique_to := λ (X : C), {to_inhabited := {default := 0}, uniq := _}, unique_from := λ (X : C), {to_inhabited := {default := 0}, uniq := _}}
If there are zero morphisms, any terminal object is a zero object.
Equations
- category_theory.limits.has_zero_object_of_has_terminal_object = {zero := ⊤_C, unique_to := λ (X : C), {to_inhabited := {default := 0}, uniq := _}, unique_from := λ (X : C), {to_inhabited := {default := 0}, uniq := _}}
The zero morphism has a mono_factorisation
through the zero object.
Any zero morphism has an image. We don't set this as an instance, as it is only intended for use inside the following proofs.
Equations
- category_theory.limits.has_image.zero X Y = {F := category_theory.limits.mono_factorisation_zero X Y, is_image := {lift := λ (F' : category_theory.limits.mono_factorisation 0), 0, lift_fac' := _}}
The image of a zero morphism is the zero object.
The image of a morphism which is equal to zero is the zero object.
If we know f = 0
,
it requires a little work to conclude image.ι f = 0
,
because f = g
only implies image f ≅ image g
.
In the presence of zero morphisms, coprojections into a coproduct are (split) monomorphisms.
Equations
- category_theory.limits.split_mono_sigma_ι f b = {retraction := category_theory.limits.sigma.desc (λ (b' : β), dite (b' = b) (λ (h : b' = b), category_theory.eq_to_hom _) (λ (h : ¬b' = b), 0)), id' := _}
In the presence of zero morphisms, projections into a product are (split) epimorphisms.
Equations
- category_theory.limits.split_epi_pi_π f b = {section_ := category_theory.limits.pi.lift (λ (b' : β), dite (b = b') (λ (h : b = b'), category_theory.eq_to_hom _) (λ (h : ¬b = b'), 0)), id' := _}
In the presence of zero morphisms, coprojections into a coproduct are (split) monomorphisms.
Equations
In the presence of zero morphisms, coprojections into a coproduct are (split) monomorphisms.
Equations
In the presence of zero morphisms, projections into a product are (split) epimorphisms.
Equations
In the presence of zero morphisms, projections into a product are (split) epimorphisms.