Zero morphisms and zero objects #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
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 #
- 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 of this typeclass
- category_theory.preadditive.preadditive_has_zero_morphisms
- category_theory.non_preadditive_abelian.to_has_zero_morphisms
- category_theory.limits.has_zero_morphisms_pempty
- category_theory.limits.has_zero_morphisms_punit
- category_theory.limits.has_zero_morphisms_opposite
- category_theory.limits.category_theory.functor.has_zero_morphisms
- Action.category_theory.limits.has_zero_morphisms
- category_theory.graded_object.has_zero_morphisms
- homological_complex.category_theory.limits.has_zero_morphisms
- category_theory.differential_object.has_zero_morphisms
- SemiNormedGroup.category_theory.limits.has_zero_morphisms
- SemiNormedGroup₁.category_theory.limits.has_zero_morphisms
Instances of other typeclasses for category_theory.limits.has_zero_morphisms
- category_theory.limits.has_zero_morphisms.has_sizeof_inst
- category_theory.limits.has_zero_morphisms.subsingleton
Equations
- category_theory.limits.has_zero_morphisms_pempty = {has_zero := λ (X Y : category_theory.discrete pempty), {zero := {down := _.mpr {down := _}}}, comp_zero' := category_theory.limits.has_zero_morphisms_pempty._proof_2, zero_comp' := category_theory.limits.has_zero_morphisms_pempty._proof_3}
Equations
- category_theory.limits.has_zero_morphisms_punit = {has_zero := λ (X Y : category_theory.discrete punit), {zero := {down := _.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.
Equations
- category_theory.limits.has_zero_morphisms_opposite = {has_zero := λ (X Y : Cᵒᵖ), {zero := 0.op}, comp_zero' := _, zero_comp' := _}
Equations
- category_theory.limits.category_theory.functor.has_zero_morphisms D = {has_zero := λ (F G : C ⥤ D), {zero := {app := λ (X : C), 0, naturality' := _}}, comp_zero' := _, zero_comp' := _}
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
- hO.has_zero_morphisms = {has_zero := λ (X Y : C), {zero := hO.from X ≫ hO.to Y}, comp_zero' := _, zero_comp' := _}
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 ≫ inhabited.default}, comp_zero' := _, zero_comp' := _}
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 := _}
If 0 : X ⟶ Y
is an monomorphism, then X ≅ 0
.
Equations
- category_theory.limits.iso_zero_of_mono_zero h = {hom := 0, inv := 0, hom_inv_id' := _, inv_hom_id' := _}
If 0 : X ⟶ Y
is an epimorphism, then Y ≅ 0
.
Equations
- category_theory.limits.iso_zero_of_epi_zero h = {hom := 0, inv := 0, hom_inv_id' := _, inv_hom_id' := _}
If a monomorphism out of X
is zero, then X ≅ 0
.
Equations
- category_theory.limits.iso_zero_of_mono_eq_zero h = eq.rec (λ [_inst_5 : category_theory.mono 0], category_theory.limits.iso_zero_of_mono_zero _inst_5) _
If an epimorphism in to Y
is zero, then Y ≅ 0
.
Equations
- category_theory.limits.iso_zero_of_epi_eq_zero h = eq.rec (λ [_inst_5 : category_theory.epi 0], category_theory.limits.iso_zero_of_epi_zero _inst_5) _
If an object X
is isomorphic to 0, there's no need to use choice to construct
an explicit isomorphism: the zero morphism suffices.
Equations
- category_theory.limits.iso_of_is_isomorphic_zero P = {hom := 0, inv := 0, hom_inv_id' := _, inv_hom_id' := _}
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 := λ (ᾰ : 𝟙 X = 0 ∧ 𝟙 Y = 0), ᾰ.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.
If there are zero morphisms, any terminal object is a zero object.
The zero morphism has a mono_factorisation
through the zero object.
The factorisation through the zero object is an image factorisation.
Equations
- category_theory.limits.image_factorisation_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.
In the presence of zero morphisms, projections into a product are (split) epimorphisms.
In the presence of zero morphisms, coprojections into a coproduct are (split) monomorphisms.
In the presence of zero morphisms, coprojections into a coproduct are (split) monomorphisms.
In the presence of zero morphisms, projections into a product are (split) epimorphisms.
In the presence of zero morphisms, projections into a product are (split) epimorphisms.