Cofinal functors #
A functor F : C ⥤ D
is cofinal if for every d : D
,
the comma category of morphisms d ⟶ F.obj c
is connected.
We prove the following three statements are equivalent:
F : C ⥤ D
is cofinal.- Every functor
G : D ⥤ E
has a colimit if and only ifF ⋙ G
does, and these colimits are isomorphic viacolimit.pre G F
. colimit (F ⋙ coyoneda.obj (op d)) ≅ punit
.
Starting at 1. we show (in cocones_equiv
) that
the categories of cocones over G : D ⥤ E
and over F ⋙ G
are equivalent.
(In fact, via an equivalence which does not change the cocone point.)
This readily implies 2., as comp_has_colimit
, has_colimit_of_comp
, and colimit_iso
.
From 2. we can specialize to G = coyoneda.obj (op d)
to obtain 3., as colimit_comp_coyoneda_iso
.
From 3., we prove 1. directly in cofinal_of_colimit_comp_coyoneda_iso_punit
.
We also show these conditions imply:
4. Every functor H : Dᵒᵖ ⥤ E
has a limit if and only if F.op ⋙ H
does,
and these limits are isomorphic via limit.pre H F.op
.
Naming #
There is some discrepancy in the literature about naming; some say 'final' instead of 'cofinal'. The explanation for this is that the 'co' prefix here is not the usual category-theoretic one indicating duality, but rather indicating the sense of "along with".
While the trend seems to be towards using 'final', for now we go with the bulk of the literature and use 'cofinal'.
References #
- https://stacks.math.columbia.edu/tag/09WN
- https://ncatlab.org/nlab/show/final+functor
- Borceux, Handbook of Categorical Algebra I, Section 2.11. (Note he reverses the roles of definition and main result relative to here!)
- out : ∀ (d : D), category_theory.is_connected (category_theory.structured_arrow d F)
A functor F : C ⥤ D
is cofinal if for every d : D
, the comma category of morphisms d ⟶ F.obj c
is connected.
When F : C ⥤ D
is cofinal, we denote by lift F d
an arbitrary choice of object in C
such that
there exists a morphism d ⟶ F.obj (lift F d)
.
Equations
When F : C ⥤ D
is cofinal, we denote by hom_to_lift
an arbitrary choice of morphism
d ⟶ F.obj (lift F d)
.
Equations
We provide an induction principle for reasoning about lift
and hom_to_lift
.
We want to perform some construction (usually just a proof) about
the particular choices lift F d
and hom_to_lift F d
,
it suffices to perform that construction for some other pair of choices
(denoted X₀ : C
and k₀ : d ⟶ F.obj X₀
below),
and to show that how to transport such a construction
both directions along a morphism between such choices.
Given a cocone over F ⋙ G
, we can construct a cocone G
with the same cocone point.
Equations
- category_theory.cofinal.extend_cocone = {obj := λ (c : category_theory.limits.cocone (F ⋙ G)), {X := c.X, ι := {app := λ (X : D), G.map (category_theory.cofinal.hom_to_lift F X) ≫ c.ι.app (category_theory.cofinal.lift F X), naturality' := _}}, map := λ (X Y : category_theory.limits.cocone (F ⋙ G)) (f : X ⟶ Y), {hom := f.hom, w' := _}, map_id' := _, map_comp' := _}
An auxilliary construction for extend_cone
, moving op
around.
Equations
- category_theory.cofinal.extend_cone_cone_to_cocone c = {X := opposite.op c.X, ι := {app := λ (j : C), (c.π.app (opposite.op j)).op, naturality' := _}}
An auxilliary construction for extend_cone
, moving op
around.
Equations
- category_theory.cofinal.extend_cone_cocone_to_cone c = {X := opposite.unop c.X, π := {app := λ (j : Dᵒᵖ), (c.ι.app (opposite.unop j)).unop, naturality' := _}}
Given a cone over F.op ⋙ H
, we can construct a cone H
with the same cone point.
Equations
- category_theory.cofinal.extend_cone = {obj := λ (c : category_theory.limits.cone (F.op ⋙ H)), category_theory.cofinal.extend_cone_cocone_to_cone (category_theory.cofinal.extend_cocone.obj (category_theory.cofinal.extend_cone_cone_to_cocone c)), map := λ (X Y : category_theory.limits.cone (F.op ⋙ H)) (f : X ⟶ Y), {hom := f.hom, w' := _}, map_id' := _, map_comp' := _}
If F
is cofinal,
the category of cocones on F ⋙ G
is equivalent to the category of cocones on G
,
for any G : D ⥤ E
.
Equations
- category_theory.cofinal.cocones_equiv F G = {functor := category_theory.cofinal.extend_cocone G, inverse := category_theory.limits.cocones.whiskering F, unit_iso := category_theory.nat_iso.of_components (λ (c : category_theory.limits.cocone (F ⋙ G)), category_theory.limits.cocones.ext (category_theory.iso.refl ((𝟭 (category_theory.limits.cocone (F ⋙ G))).obj c).X) _) _, counit_iso := category_theory.nat_iso.of_components (λ (c : category_theory.limits.cocone G), category_theory.limits.cocones.ext (category_theory.iso.refl ((category_theory.limits.cocones.whiskering F ⋙ category_theory.cofinal.extend_cocone).obj c).X) _) _, functor_unit_iso_comp' := _}
If F
is cofinal,
the category of cones on F.op ⋙ H
is equivalent to the category of cones on H
,
for any H : Dᵒᵖ ⥤ E
.
Equations
- category_theory.cofinal.cones_equiv F H = {functor := category_theory.cofinal.extend_cone H, inverse := category_theory.limits.cones.whiskering F.op, unit_iso := category_theory.nat_iso.of_components (λ (c : category_theory.limits.cone (F.op ⋙ H)), category_theory.limits.cones.ext (category_theory.iso.refl ((𝟭 (category_theory.limits.cone (F.op ⋙ H))).obj c).X) _) _, counit_iso := category_theory.nat_iso.of_components (λ (c : category_theory.limits.cone H), category_theory.limits.cones.ext (category_theory.iso.refl ((category_theory.limits.cones.whiskering F.op ⋙ category_theory.cofinal.extend_cone).obj c).X) _) _, functor_unit_iso_comp' := _}
When F : C ⥤ D
is cofinal, and t : cocone G
for some G : D ⥤ E
,
t.whisker F
is a colimit cocone exactly when t
is.
When F : C ⥤ D
is cofinal, and t : cone H
for some H : Dᵒᵖ ⥤ E
,
t.whisker F.op
is a limit cone exactly when t
is.
When F
is cofinal, and t : cocone (F ⋙ G)
,
extend_cocone.obj t
is a colimit coconne exactly when t
is.
When F
is cofinal, and t : cone (F.op ⋙ H)
,
extend_cone.obj t
is a limit conne exactly when t
is.
Given a colimit cocone over G : D ⥤ E
we can construct a colimit cocone over F ⋙ G
.
Equations
Given a limit cone over H : Dᵒᵖ ⥤ E
we can construct a limit cone over F.op ⋙ H
.
Equations
When F : C ⥤ D
is cofinal, and G : D ⥤ E
has a colimit, then F ⋙ G
has a colimit also and
colimit (F ⋙ G) ≅ colimit G
https://stacks.math.columbia.edu/tag/04E7
Equations
When F : C ⥤ D
is cofinal, and H : Dᵒᵖ ⥤ E
has a limit, then F.op ⋙ H
has a limit also and
limit (F.op ⋙ H) ≅ limit H
https://stacks.math.columbia.edu/tag/04E7
Equations
Given a colimit cocone over F ⋙ G
we can construct a colimit cocone over G
.
Given a limit cone over F.op ⋙ H
we can construct a limit cone over H
.
Equations
When F
is cofinal, and F ⋙ G
has a colimit, then G
has a colimit also.
We can't make this an instance, because F
is not determined by the goal.
(Even if this weren't a problem, it would cause a loop with comp_has_colimit
.)
When F
is cofinal, and F.op ⋙ H
has a limit, then H
has a limit also.
We can't make this an instance, because F
is not determined by the goal.
(Even if this weren't a problem, it would cause a loop with comp_has_limit
.)
When F
is cofinal, and F ⋙ G
has a colimit, then G
has a colimit also and
colimit (F ⋙ G) ≅ colimit G
When F
is cofinal, and F.op ⋙ H
has a limit, then H
has a limit also and
limit (F.op ⋙ H) ≅ limit H
https://stacks.math.columbia.edu/tag/04E7
Equations
If the universal morphism colimit (F ⋙ coyoneda.obj (op d)) ⟶ colimit (coyoneda.obj (op d))
is an isomorphism (as it always is when F
is cofinal),
then colimit (F ⋙ coyoneda.obj (op d)) ≅ punit
(simply because colimit (coyoneda.obj (op d)) ≅ punit
).
If colimit (F ⋙ coyoneda.obj (op d)) ≅ punit
for all d : D
, then F
is cofinal.