Final and initial functors #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
A functor F : C ⥤ D is final if for every d : D,
the comma category of morphisms d ⟶ F.obj c is connected.
Dually, a functor F : C ⥤ D is initial if for every d : D,
the comma category of morphisms F.obj c ⟶ d is connected.
We show that right adjoints are examples of final functors, while left adjoints are examples of initial functors.
For final functors, we prove that the following three statements are equivalent:
F : C ⥤ Dis final.- Every functor
G : D ⥤ Ehas a colimit if and only ifF ⋙ Gdoes, 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.
Dually, we prove that if a functor F : C ⥤ D is initial, then any functor G : D ⥤ E has a
limit if and only if F ⋙ G does, and these limits are isomorphic via limit.pre G F.
Naming #
There is some discrepancy in the literature about naming; some say 'cofinal' instead of 'final'. 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".
Future work #
Dualise condition 3 above and the implications 2 ⇒ 3 and 3 ⇒ 1 to initial functors.
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 final if for every d : D, the comma category of morphisms d ⟶ F.obj c
is connected.
- out : ∀ (d : D), category_theory.is_connected (category_theory.costructured_arrow F d)
A functor F : C ⥤ D is initial if for every d : D, the comma category of morphisms
F.obj c ⟶ d is connected.
If a functor R : D ⥤ C is a right adjoint, it is final.
If a functor L : C ⥤ D is a left adjoint, it is initial.
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 how to transport such a construction
both directions along a morphism between such choices.
Equations
- category_theory.functor.final.induction F Z h₁ h₂ z = _.some
Given a cocone over F ⋙ G, we can construct a cocone G with the same cocone point.
Equations
- category_theory.functor.final.extend_cocone = {obj := λ (c : category_theory.limits.cocone (F ⋙ G)), {X := c.X, ι := {app := λ (X : D), G.map (category_theory.functor.final.hom_to_lift F X) ≫ c.ι.app (category_theory.functor.final.lift F X), naturality' := _}}, map := λ (X Y : category_theory.limits.cocone (F ⋙ G)) (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.functor.final.cocones_equiv F G = {functor := category_theory.functor.final.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.functor.final.extend_cocone).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 is cofinal, and t : cocone (F ⋙ G),
extend_cocone.obj t is a colimit coconne exactly when t is.
Given a colimit cocone over G : D ⥤ E we can construct a colimit cocone over F ⋙ G.
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
Given a colimit cocone over F ⋙ G we can construct a colimit cocone over G.
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 ⋙ G has a colimit, then G has a colimit also and
colimit (F ⋙ G) ≅ colimit G
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.
When F : C ⥤ D is initial, we denote by lift F d an arbitrary choice of object in C such that
there exists a morphism F.obj (lift F d) ⟶ d.
Equations
When F : C ⥤ D is initial, we denote by hom_to_lift an arbitrary choice of morphism
F.obj (lift F d) ⟶ 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₀ : F.obj X₀ ⟶ d below),
and to show how to transport such a construction
both directions along a morphism between such choices.
Equations
- category_theory.functor.initial.induction F Z h₁ h₂ z = _.some
Given a cone over F ⋙ G, we can construct a cone G with the same cocone point.
Equations
- category_theory.functor.initial.extend_cone = {obj := λ (c : category_theory.limits.cone (F ⋙ G)), {X := c.X, π := {app := λ (d : D), c.π.app (category_theory.functor.initial.lift F d) ≫ G.map (category_theory.functor.initial.hom_to_lift F d), naturality' := _}}, map := λ (X Y : category_theory.limits.cone (F ⋙ G)) (f : X ⟶ Y), {hom := f.hom, w' := _}, map_id' := _, map_comp' := _}
If F is initial,
the category of cones on F ⋙ G is equivalent to the category of cones on G,
for any G : D ⥤ E.
Equations
- category_theory.functor.initial.cones_equiv F G = {functor := category_theory.functor.initial.extend_cone G, inverse := category_theory.limits.cones.whiskering F, unit_iso := category_theory.nat_iso.of_components (λ (c : category_theory.limits.cone (F ⋙ G)), category_theory.limits.cones.ext (category_theory.iso.refl ((𝟭 (category_theory.limits.cone (F ⋙ G))).obj c).X) _) _, counit_iso := category_theory.nat_iso.of_components (λ (c : category_theory.limits.cone G), category_theory.limits.cones.ext (category_theory.iso.refl ((category_theory.limits.cones.whiskering F ⋙ category_theory.functor.initial.extend_cone).obj c).X) _) _, functor_unit_iso_comp' := _}
When F : C ⥤ D is initial, and t : cone G for some G : D ⥤ E,
t.whisker F is a limit cone exactly when t is.
When F is initial, and t : cone (F ⋙ G),
extend_cone.obj t is a limit cone exactly when t is.
Given a limit cone over G : D ⥤ E we can construct a limit cone over F ⋙ G.
Equations
When F : C ⥤ D is initial, and G : D ⥤ E has a limit, then F ⋙ G has a limit also and
limit (F ⋙ G) ≅ limit G
https://stacks.math.columbia.edu/tag/04E7
Equations
Given a limit cone over F ⋙ G we can construct a limit cone over G.
When F is initial, and F ⋙ G has a limit, then G 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 initial, and F ⋙ G has a limit, then G has a limit also and
limit (F ⋙ G) ≅ limit G