Limits and colimits #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
We set up the general theory of limits and colimits in a category. In this introduction we only describe the setup for limits; it is repeated, with slightly different names, for colimits.
The main structures defined in this file is
is_limit c
, forc : cone F
,F : J ⥤ C
, expressing thatc
is a limit cone,
See also category_theory.limits.has_limits
which further builds:
limit_cone F
, which consists of a choice of cone forF
and the fact it is a limit cone, andhas_limit F
, asserting the mere existence of some limit cone forF
.
Implementation #
At present we simply say everything twice, in order to handle both limits and colimits.
It would be highly desirable to have some automation support,
e.g. a @[dualize]
attribute that behaves similarly to @[to_additive]
.
References #
- lift : Π (s : category_theory.limits.cone F), s.X ⟶ t.X
- fac' : (∀ (s : category_theory.limits.cone F) (j : J), self.lift s ≫ t.π.app j = s.π.app j) . "obviously"
- uniq' : (∀ (s : category_theory.limits.cone F) (m : s.X ⟶ t.X), (∀ (j : J), m ≫ t.π.app j = s.π.app j) → m = self.lift s) . "obviously"
A cone t
on F
is a limit cone if each cone on F
admits a unique
cone morphism to t
.
See https://stacks.math.columbia.edu/tag/002E.
Instances for category_theory.limits.is_limit
- category_theory.limits.is_limit.has_sizeof_inst
- category_theory.limits.is_limit.subsingleton
Given a natural transformation α : F ⟶ G
, we give a morphism from the cone point
of any cone over F
to the cone point of a limit cone over G
.
Equations
The universal morphism from any other cone to a limit cone.
Restating the definition of a limit cone in terms of the ∃! operator.
Noncomputably make a colimit cocone from the existence of unique factorizations.
Equations
- category_theory.limits.is_limit.of_exists_unique ht = (λ (_x : ∀ (s : category_theory.limits.cone F), (λ (l : s.X ⟶ t.X), ∀ (j : J), l ≫ t.π.app j = s.π.app j) ((λ (s : category_theory.limits.cone F), classical.some _) s) ∧ ∀ (y : s.X ⟶ t.X), (λ (l : s.X ⟶ t.X), ∀ (j : J), l ≫ t.π.app j = s.π.app j) y → y = (λ (s : category_theory.limits.cone F), classical.some _) s), {lift := λ (s : category_theory.limits.cone F), classical.some _, fac' := _, uniq' := _}) _
Alternative constructor for is_limit
,
providing a morphism of cones rather than a morphism between the cone points
and separately the factorisation condition.
Equations
- category_theory.limits.is_limit.mk_cone_morphism lift uniq' = {lift := λ (s : category_theory.limits.cone F), (lift s).hom, fac' := _, uniq' := _}
Limit cones on F
are unique up to isomorphism.
Equations
- P.unique_up_to_iso Q = {hom := Q.lift_cone_morphism s, inv := P.lift_cone_morphism t, hom_inv_id' := _, inv_hom_id' := _}
Any cone morphism between limit cones is an isomorphism.
Limits of F
are unique up to isomorphism.
Equations
Transport evidence that a cone is a limit cone across an isomorphism of cones.
Equations
- P.of_iso_limit i = category_theory.limits.is_limit.mk_cone_morphism (λ (s : category_theory.limits.cone F), P.lift_cone_morphism s ≫ i.hom) _
Isomorphism of cones preserves whether or not they are limiting cones.
Equations
- category_theory.limits.is_limit.equiv_iso_limit i = {to_fun := λ (h : category_theory.limits.is_limit r), h.of_iso_limit i, inv_fun := λ (h : category_theory.limits.is_limit t), h.of_iso_limit i.symm, left_inv := _, right_inv := _}
If the canonical morphism from a cone point to a limiting cone point is an iso, then the first cone was limiting also.
Equations
Two morphisms into a limit are equal if their compositions with each cone morphism are equal.
Given a right adjoint functor between categories of cones, the image of a limit cone is a limit cone.
Equations
Given two functors which have equivalent categories of cones, we can transport a limiting cone across the equivalence.
Equations
- category_theory.limits.is_limit.of_cone_equiv h = {to_fun := λ (P : category_theory.limits.is_limit (h.functor.obj c)), (category_theory.limits.is_limit.of_right_adjoint h.inverse P).of_iso_limit (h.unit_iso.symm.app c), inv_fun := category_theory.limits.is_limit.of_right_adjoint h.functor c, left_inv := _, right_inv := _}
A cone postcomposed with a natural isomorphism is a limit cone if and only if the original cone is.
A cone postcomposed with the inverse of a natural isomorphism is a limit cone if and only if the original cone is.
Constructing an equivalence is_limit c ≃ is_limit d
from a natural isomorphism
between the underlying functors, and then an isomorphism between c
transported along this and d
.
The cone points of two limit cones for naturally isomorphic functors are themselves isomorphic.
Equations
- P.cone_points_iso_of_nat_iso Q w = {hom := category_theory.limits.is_limit.map s Q w.hom, inv := category_theory.limits.is_limit.map t P w.inv, hom_inv_id' := _, inv_hom_id' := _}
If s : cone F
is a limit cone, so is s
whiskered by an equivalence e
.
If s : cone F
whiskered by an equivalence e
is a limit cone, so is s
.
Equations
- category_theory.limits.is_limit.of_whisker_equivalence e P = ⇑(category_theory.limits.is_limit.equiv_iso_limit ((category_theory.limits.cones.whiskering_equivalence e).unit_iso.app s).symm) (category_theory.limits.is_limit.of_right_adjoint (category_theory.limits.cones.whiskering_equivalence e).inverse P)
Given an equivalence of diagrams e
, s
is a limit cone iff s.whisker e.functor
is.
Equations
We can prove two cone points (s : cone F).X
and (t.cone G).X
are isomorphic if
- both cones are limit cones
- their indexing categories are equivalent via some
e : J ≌ K
, - the triangle of functors commutes up to a natural isomorphism:
e.functor ⋙ G ≅ F
.
This is the most general form of uniqueness of cone points, allowing relabelling of both the indexing category (up to equivalence) and the functor (up to natural isomorphism).
Equations
- P.cone_points_iso_of_equivalence Q e w = let w' : e.inverse ⋙ F ≅ G := (category_theory.iso_whisker_left e.inverse w).symm ≪≫ e.inv_fun_id_assoc G in {hom := Q.lift ((category_theory.limits.cones.equivalence_of_reindexing e.symm w').functor.obj s), inv := P.lift ((category_theory.limits.cones.equivalence_of_reindexing e w).functor.obj t), hom_inv_id' := _, inv_hom_id' := _}
The universal property of a limit cone: a map W ⟶ X
is the same as
a cone on F
with vertex W
.
The limit of F
represents the functor taking W
to
the set of cones on F
with vertex W
.
Equations
- h.nat_iso = category_theory.nat_iso.of_components (λ (W : Cᵒᵖ), h.hom_iso (opposite.unop W)) _
Another, more explicit, formulation of the universal property of a limit cone.
See also hom_iso
.
If G : C → D is a faithful functor which sends t to a limit cone, then it suffices to check that the induced maps for the image of t can be lifted to maps of C.
If F
and G
are naturally isomorphic, then F.map_cone c
being a limit implies
G.map_cone c
is also a limit.
A cone is a limit cone exactly if there is a unique cone morphism from any other cone.
Equations
- category_theory.limits.is_limit.iso_unique_cone_morphism = {hom := λ (h : category_theory.limits.is_limit t) (s : category_theory.limits.cone F), {to_inhabited := {default := h.lift_cone_morphism s}, uniq := _}, inv := λ (h : Π (s : category_theory.limits.cone F), unique (s ⟶ t)), {lift := λ (s : category_theory.limits.cone F), inhabited.default.hom, fac' := _, uniq' := _}, hom_inv_id' := _, inv_hom_id' := _}
If F.cones
is represented by X
, each morphism f : Y ⟶ X
gives a cone with cone point
Y
.
Equations
- category_theory.limits.is_limit.of_nat_iso.cone_of_hom h f = {X := Y, π := h.hom.app (opposite.op Y) {down := f}}
If F.cones
is represented by X
, each cone s
gives a morphism s.X ⟶ X
.
Equations
- category_theory.limits.is_limit.of_nat_iso.hom_of_cone h s = (h.inv.app (opposite.op s.X) s.π).down
If F.cones
is represented by X
, the cone corresponding to the identity morphism on X
will be a limit cone.
If F.cones
is represented by X
, the cone corresponding to a morphism f : Y ⟶ X
is
the limit cone extended by f
.
If F.cones
is represented by X
, any cone is the extension of the limit cone by the
corresponding morphism.
If F.cones
is representable, then the cone corresponding to the identity morphism on
the representing object is a limit cone.
Equations
- category_theory.limits.is_limit.of_nat_iso h = {lift := λ (s : category_theory.limits.cone F), category_theory.limits.is_limit.of_nat_iso.hom_of_cone h s, fac' := _, uniq' := _}
- desc : Π (s : category_theory.limits.cocone F), t.X ⟶ s.X
- fac' : (∀ (s : category_theory.limits.cocone F) (j : J), t.ι.app j ≫ self.desc s = s.ι.app j) . "obviously"
- uniq' : (∀ (s : category_theory.limits.cocone F) (m : t.X ⟶ s.X), (∀ (j : J), t.ι.app j ≫ m = s.ι.app j) → m = self.desc s) . "obviously"
A cocone t
on F
is a colimit cocone if each cocone on F
admits a unique
cocone morphism from t
.
See https://stacks.math.columbia.edu/tag/002F.
Instances for category_theory.limits.is_colimit
- category_theory.limits.is_colimit.has_sizeof_inst
- category_theory.limits.is_colimit.subsingleton
Given a natural transformation α : F ⟶ G
, we give a morphism from the cocone point
of a colimit cocone over F
to the cocone point of any cocone over G
.
Equations
- P.map t α = P.desc ((category_theory.limits.cocones.precompose α).obj t)
The universal morphism from a colimit cocone to any other cocone.
Restating the definition of a colimit cocone in terms of the ∃! operator.
Noncomputably make a colimit cocone from the existence of unique factorizations.
Equations
- category_theory.limits.is_colimit.of_exists_unique ht = (λ (_x : ∀ (s : category_theory.limits.cocone F), (λ (d : t.X ⟶ s.X), ∀ (j : J), t.ι.app j ≫ d = s.ι.app j) ((λ (s : category_theory.limits.cocone F), classical.some _) s) ∧ ∀ (y : t.X ⟶ s.X), (λ (d : t.X ⟶ s.X), ∀ (j : J), t.ι.app j ≫ d = s.ι.app j) y → y = (λ (s : category_theory.limits.cocone F), classical.some _) s), {desc := λ (s : category_theory.limits.cocone F), classical.some _, fac' := _, uniq' := _}) _
Alternative constructor for is_colimit
,
providing a morphism of cocones rather than a morphism between the cocone points
and separately the factorisation condition.
Equations
- category_theory.limits.is_colimit.mk_cocone_morphism desc uniq' = {desc := λ (s : category_theory.limits.cocone F), (desc s).hom, fac' := _, uniq' := _}
Colimit cocones on F
are unique up to isomorphism.
Equations
- P.unique_up_to_iso Q = {hom := P.desc_cocone_morphism t, inv := Q.desc_cocone_morphism s, hom_inv_id' := _, inv_hom_id' := _}
Any cocone morphism between colimit cocones is an isomorphism.
Colimits of F
are unique up to isomorphism.
Equations
Transport evidence that a cocone is a colimit cocone across an isomorphism of cocones.
Equations
- P.of_iso_colimit i = category_theory.limits.is_colimit.mk_cocone_morphism (λ (s : category_theory.limits.cocone F), i.inv ≫ P.desc_cocone_morphism s) _
Isomorphism of cocones preserves whether or not they are colimiting cocones.
Equations
- category_theory.limits.is_colimit.equiv_iso_colimit i = {to_fun := λ (h : category_theory.limits.is_colimit r), h.of_iso_colimit i, inv_fun := λ (h : category_theory.limits.is_colimit t), h.of_iso_colimit i.symm, left_inv := _, right_inv := _}
If the canonical morphism to a cocone point from a colimiting cocone point is an iso, then the first cocone was colimiting also.
Equations
Two morphisms out of a colimit are equal if their compositions with each cocone morphism are equal.
Given a left adjoint functor between categories of cocones, the image of a colimit cocone is a colimit cocone.
Equations
Given two functors which have equivalent categories of cocones, we can transport a colimiting cocone across the equivalence.
Equations
- category_theory.limits.is_colimit.of_cocone_equiv h = {to_fun := λ (P : category_theory.limits.is_colimit (h.functor.obj c)), (category_theory.limits.is_colimit.of_left_adjoint h.inverse P).of_iso_colimit (h.unit_iso.symm.app c), inv_fun := category_theory.limits.is_colimit.of_left_adjoint h.functor c, left_inv := _, right_inv := _}
A cocone precomposed with a natural isomorphism is a colimit cocone if and only if the original cocone is.
A cocone precomposed with the inverse of a natural isomorphism is a colimit cocone if and only if the original cocone is.
Constructing an equivalence is_colimit c ≃ is_colimit d
from a natural isomorphism
between the underlying functors, and then an isomorphism between c
transported along this and d
.
The cocone points of two colimit cocones for naturally isomorphic functors are themselves isomorphic.
Equations
- P.cocone_points_iso_of_nat_iso Q w = {hom := P.map t w.hom, inv := Q.map s w.inv, hom_inv_id' := _, inv_hom_id' := _}
If s : cocone F
is a colimit cocone, so is s
whiskered by an equivalence e
.
If s : cocone F
whiskered by an equivalence e
is a colimit cocone, so is s
.
Equations
- category_theory.limits.is_colimit.of_whisker_equivalence e P = ⇑(category_theory.limits.is_colimit.equiv_iso_colimit ((category_theory.limits.cocones.whiskering_equivalence e).unit_iso.app s).symm) (category_theory.limits.is_colimit.of_left_adjoint (category_theory.limits.cocones.whiskering_equivalence e).inverse P)
Given an equivalence of diagrams e
, s
is a colimit cocone iff s.whisker e.functor
is.
Equations
We can prove two cocone points (s : cocone F).X
and (t.cocone G).X
are isomorphic if
- both cocones are colimit cocones
- their indexing categories are equivalent via some
e : J ≌ K
, - the triangle of functors commutes up to a natural isomorphism:
e.functor ⋙ G ≅ F
.
This is the most general form of uniqueness of cocone points, allowing relabelling of both the indexing category (up to equivalence) and the functor (up to natural isomorphism).
Equations
- P.cocone_points_iso_of_equivalence Q e w = let w' : e.inverse ⋙ F ≅ G := (category_theory.iso_whisker_left e.inverse w).symm ≪≫ e.inv_fun_id_assoc G in {hom := P.desc ((category_theory.limits.cocones.equivalence_of_reindexing e w).functor.obj t), inv := Q.desc ((category_theory.limits.cocones.equivalence_of_reindexing e.symm w').functor.obj s), hom_inv_id' := _, inv_hom_id' := _}
The universal property of a colimit cocone: a map X ⟶ W
is the same as
a cocone on F
with vertex W
.
The colimit of F
represents the functor taking W
to
the set of cocones on F
with vertex W
.
Equations
Another, more explicit, formulation of the universal property of a colimit cocone.
See also hom_iso
.
If G : C → D is a faithful functor which sends t to a colimit cocone, then it suffices to check that the induced maps for the image of t can be lifted to maps of C.
If F
and G
are naturally isomorphic, then F.map_cone c
being a colimit implies
G.map_cone c
is also a colimit.
A cocone is a colimit cocone exactly if there is a unique cocone morphism from any other cocone.
Equations
- category_theory.limits.is_colimit.iso_unique_cocone_morphism = {hom := λ (h : category_theory.limits.is_colimit t) (s : category_theory.limits.cocone F), {to_inhabited := {default := h.desc_cocone_morphism s}, uniq := _}, inv := λ (h : Π (s : category_theory.limits.cocone F), unique (t ⟶ s)), {desc := λ (s : category_theory.limits.cocone F), inhabited.default.hom, fac' := _, uniq' := _}, hom_inv_id' := _, inv_hom_id' := _}
If F.cocones
is corepresented by X
, each morphism f : X ⟶ Y
gives a cocone with cone
point Y
.
If F.cocones
is corepresented by X
, each cocone s
gives a morphism X ⟶ s.X
.
If F.cocones
is corepresented by X
, the cocone corresponding to the identity morphism on X
will be a colimit cocone.
If F.cocones
is corepresented by X
, the cocone corresponding to a morphism f : Y ⟶ X
is
the colimit cocone extended by f
.
If F.cocones
is corepresented by X
, any cocone is the extension of the colimit cocone by the
corresponding morphism.
If F.cocones
is corepresentable, then the cocone corresponding to the identity morphism on
the representing object is a colimit cocone.
Equations
- category_theory.limits.is_colimit.of_nat_iso h = {desc := λ (s : category_theory.limits.cocone F), category_theory.limits.is_colimit.of_nat_iso.hom_of_cocone h s, fac' := _, uniq' := _}