Adjunctions between functors #
F ⊣ G
represents the data of an adjunction between two functors
F : C ⥤ D
and G : D ⥤ C
. F
is the left adjoint and G
is the right adjoint.
We provide various useful constructors:
mk_of_hom_equiv
mk_of_unit_counit
left_adjoint_of_equiv
/right_adjoint_of equiv
construct a left/right adjoint of a given functor given the action on objects and the relevant equivalence of morphism spaces.adjunction_of_equiv_left
/adjunction_of_equiv_right
witness that these constructions give adjunctions.
There are also typeclasses is_left_adjoint
/ is_right_adjoint
, carrying data witnessing
that a given functor is a left or right adjoint.
Given [is_left_adjoint F]
, a right adjoint of F
can be constructed as right_adjoint F
.
adjunction.comp
composes adjunctions.
to_equivalence
upgrades an adjunction to an equivalence,
given witnesses that the unit and counit are pointwise isomorphisms.
Conversely equivalence.to_adjunction
recovers the underlying adjunction from an equivalence.
- hom_equiv : Π (X : C) (Y : D), (F.obj X ⟶ Y) ≃ (X ⟶ G.obj Y)
- unit : 𝟭 C ⟶ F ⋙ G
- counit : G ⋙ F ⟶ 𝟭 D
- hom_equiv_unit' : (∀ {X : C} {Y : D} {f : F.obj X ⟶ Y}, ⇑(self.hom_equiv X Y) f = self.unit.app X ≫ G.map f) . "obviously"
- hom_equiv_counit' : (∀ {X : C} {Y : D} {g : X ⟶ G.obj Y}, ⇑((self.hom_equiv X Y).symm) g = F.map g ≫ self.counit.app Y) . "obviously"
F ⊣ G
represents the data of an adjunction between two functors
F : C ⥤ D
and G : D ⥤ C
. F
is the left adjoint and G
is the right adjoint.
To construct an adjunction
between two functors, it's often easier to instead use the
constructors mk_of_hom_equiv
or mk_of_unit_counit
. To construct a left adjoint,
there are also constructors left_adjoint_of_equiv
and adjunction_of_equiv_left
(as
well as their duals) which can be simpler in practice.
Uniqueness of adjoints is shown in category_theory.adjunction.opposites
.
- right : D ⥤ C
- adj : left ⊣ category_theory.is_left_adjoint.right left
A class giving a chosen right adjoint to the functor left
.
- left : C ⥤ D
- adj : category_theory.is_right_adjoint.left right ⊣ right
A class giving a chosen left adjoint to the functor right
.
Extract the left adjoint from the instance giving the chosen adjoint.
Extract the right adjoint from the instance giving the chosen adjoint.
The adjunction associated to a functor known to be a left adjoint.
The adjunction associated to a functor known to be a right adjoint.
- hom_equiv : Π (X : C) (Y : D), (F.obj X ⟶ Y) ≃ (X ⟶ G.obj Y)
- hom_equiv_naturality_left_symm' : (∀ {X' X : C} {Y : D} (f : X' ⟶ X) (g : X ⟶ G.obj Y), ⇑((self.hom_equiv X' Y).symm) (f ≫ g) = F.map f ≫ ⇑((self.hom_equiv X Y).symm) g) . "obviously"
- hom_equiv_naturality_right' : (∀ {X : C} {Y Y' : D} (f : F.obj X ⟶ Y) (g : Y ⟶ Y'), ⇑(self.hom_equiv X Y') (f ≫ g) = ⇑(self.hom_equiv X Y) f ≫ G.map g) . "obviously"
This is an auxiliary data structure useful for constructing adjunctions.
See adjunction.mk_of_hom_equiv
.
This structure won't typically be used anywhere else.
- unit : 𝟭 C ⟶ F ⋙ G
- counit : G ⋙ F ⟶ 𝟭 D
- left_triangle' : category_theory.whisker_right self.unit F ≫ (F.associator G F).hom ≫ category_theory.whisker_left F self.counit = category_theory.nat_trans.id (𝟭 C ⋙ F) . "obviously"
- right_triangle' : category_theory.whisker_left G self.unit ≫ (G.associator F G).inv ≫ category_theory.whisker_right self.counit G = category_theory.nat_trans.id (G ⋙ 𝟭 C) . "obviously"
This is an auxiliary data structure useful for constructing adjunctions.
See adjunction.mk_of_unit_counit
.
This structure won't typically be used anywhere else.
Construct an adjunction between F
and G
out of a natural bijection between each
F.obj X ⟶ Y
and X ⟶ G.obj Y
.
Equations
- category_theory.adjunction.mk_of_hom_equiv adj = {hom_equiv := adj.hom_equiv, unit := {app := λ (X : C), ⇑(adj.hom_equiv X (F.obj X)) (𝟙 (F.obj X)), naturality' := _}, counit := {app := λ (Y : D), (adj.hom_equiv (G.obj Y) ((𝟭 D).obj Y)).inv_fun (𝟙 (G.obj Y)), naturality' := _}, hom_equiv_unit' := _, hom_equiv_counit' := _}
Construct an adjunction between functors F
and G
given a unit and counit for the adjunction
satisfying the triangle identities.
Equations
- category_theory.adjunction.mk_of_unit_counit adj = {hom_equiv := λ (X : C) (Y : D), {to_fun := λ (f : F.obj X ⟶ Y), adj.unit.app X ≫ G.map f, inv_fun := λ (g : X ⟶ G.obj Y), F.map g ≫ adj.counit.app Y, left_inv := _, right_inv := _}, unit := adj.unit, counit := adj.counit, hom_equiv_unit' := _, hom_equiv_counit' := _}
The adjunction between the identity functor on a category and itself.
Equations
- category_theory.adjunction.id = {hom_equiv := λ (X Y : C), equiv.refl ((𝟭 C).obj X ⟶ Y), unit := 𝟙 (𝟭 C), counit := 𝟙 (𝟭 C ⋙ 𝟭 C), hom_equiv_unit' := _, hom_equiv_counit' := _}
Equations
If F and G are naturally isomorphic functors, establish an equivalence of hom-sets.
If G and H are naturally isomorphic functors, establish an equivalence of hom-sets.
Transport an adjunction along an natural isomorphism on the left.
Equations
- adj.of_nat_iso_left iso = category_theory.adjunction.mk_of_hom_equiv {hom_equiv := λ (X : C) (Y : D), (category_theory.adjunction.equiv_homset_left_of_nat_iso iso.symm).trans (adj.hom_equiv X Y), hom_equiv_naturality_left_symm' := _, hom_equiv_naturality_right' := _}
Transport an adjunction along an natural isomorphism on the right.
Equations
- adj.of_nat_iso_right iso = category_theory.adjunction.mk_of_hom_equiv {hom_equiv := λ (X : C) (Y : D), (adj.hom_equiv X Y).trans (category_theory.adjunction.equiv_homset_right_of_nat_iso iso), hom_equiv_naturality_left_symm' := _, hom_equiv_naturality_right' := _}
Transport being a right adjoint along a natural isomorphism.
Transport being a left adjoint along a natural isomorphism.
Composition of adjunctions.
See https://stacks.math.columbia.edu/tag/0DV0.
Equations
- category_theory.adjunction.comp H I adj₁ adj₂ = {hom_equiv := λ (X : C) (Z : E), (adj₂.hom_equiv (F.obj X) Z).trans (adj₁.hom_equiv X (I.obj Z)), unit := adj₁.unit ≫ category_theory.whisker_left F (category_theory.whisker_right adj₂.unit G) ≫ (F.associator (H ⋙ I) G).inv, counit := (I.associator G (F ⋙ H)).hom ≫ category_theory.whisker_left I (category_theory.whisker_right adj₁.counit H) ≫ adj₂.counit, hom_equiv_unit' := _, hom_equiv_counit' := _}
If F
and G
are left adjoints then F ⋙ G
is a left adjoint too.
Equations
- category_theory.adjunction.left_adjoint_of_comp F G = {right := category_theory.is_left_adjoint.right G ⋙ category_theory.is_left_adjoint.right F, adj := category_theory.adjunction.comp G (category_theory.is_left_adjoint.right G) category_theory.is_left_adjoint.adj category_theory.is_left_adjoint.adj}
If F
and G
are right adjoints then F ⋙ G
is a right adjoint too.
Equations
- category_theory.adjunction.right_adjoint_of_comp = {left := category_theory.is_right_adjoint.left G ⋙ category_theory.is_right_adjoint.left F, adj := category_theory.adjunction.comp (category_theory.is_right_adjoint.left F) F category_theory.is_right_adjoint.adj category_theory.is_right_adjoint.adj}
Construct a left adjoint functor to G
, given the functor's value on objects F_obj
and
a bijection e
between F_obj X ⟶ Y
and X ⟶ G.obj Y
satisfying a naturality law
he : ∀ X Y Y' g h, e X Y' (h ≫ g) = e X Y h ≫ G.map g
.
Dual to right_adjoint_of_equiv
.
Show that the functor given by left_adjoint_of_equiv
is indeed left adjoint to G
. Dual
to adjunction_of_equiv_right
.
Construct a right adjoint functor to F
, given the functor's value on objects G_obj
and
a bijection e
between F.obj X ⟶ Y
and X ⟶ G_obj Y
satisfying a naturality law
he : ∀ X Y Y' g h, e X' Y (F.map f ≫ g) = f ≫ e X Y g
.
Dual to left_adjoint_of_equiv
.
Show that the functor given by right_adjoint_of_equiv
is indeed right adjoint to F
. Dual
to adjunction_of_equiv_left
.
If the unit and counit of a given adjunction are (pointwise) isomorphisms, then we can upgrade the adjunction to an equivalence.
Equations
- adj.to_equivalence = {functor := F, inverse := G, unit_iso := category_theory.nat_iso.of_components (λ (X : C), category_theory.as_iso (adj.unit.app X)) _, counit_iso := category_theory.nat_iso.of_components (λ (Y : D), category_theory.as_iso (adj.counit.app Y)) _, functor_unit_iso_comp' := _}
If the unit and counit for the adjunction corresponding to a right adjoint functor are (pointwise) isomorphisms, then the functor is an equivalence of categories.
The adjunction given by an equivalence of categories. (To obtain the opposite adjunction,
simply use e.symm.to_adjunction
.
Equations
- e.to_adjunction = category_theory.adjunction.mk_of_unit_counit {unit := e.unit, counit := e.counit, left_triangle' := _, right_triangle' := _}
An equivalence E
is left adjoint to its inverse.
Equations
If F
is an equivalence, it's a left adjoint.
Equations
- category_theory.functor.left_adjoint_of_equivalence = {right := F.inv _inst_3, adj := F.adjunction _inst_3}
If F
is an equivalence, it's a right adjoint.
Equations
- category_theory.functor.right_adjoint_of_equivalence = {left := F.inv _inst_3, adj := F.inv.adjunction F.is_equivalence_inv}