Skip to content

Commit fca0dc4

Browse files
committed
feat: dualising results in CategoryTheory.Functor.KanExtension.Adjunction (#14261)
In this PR, we make a left/right synchronization of the API in the file `CategoryTheory.Functor.KanExtension.Adjunction`: missing definitions/lemmas for right Kan extensions are introduced. Co-authored-by: Joël Riou <[email protected]>
1 parent c655316 commit fca0dc4

File tree

1 file changed

+129
-7
lines changed

1 file changed

+129
-7
lines changed

Mathlib/CategoryTheory/Functor/KanExtension/Adjunction.lean

+129-7
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ a left Kan extension. It is shown that `L.lan` is the left adjoint to
1414
the functor `(D ⥤ H) ⥤ (C ⥤ H)` given by the precomposition
1515
with `L` (see `Functor.lanAdjunction`).
1616
17+
Similarly, we define the right Kan extension functor
18+
`L.ran : (C ⥤ H) ⥤ (D ⥤ H)` which sends a functor `F : C ⥤ H` to its
19+
right Kan extension along `L`.
20+
1721
## TODO
18-
- dualize the results for right Kan extensions
1922
- refactor the file `CategoryTheory.Limits.KanExtension` so that
2023
the definition of `Ran` in that file (which relies on the
2124
existence of limits) is replaced by a definition
@@ -30,8 +33,13 @@ open Category
3033

3134
namespace Functor
3235

33-
variable {C D : Type*} [Category C] [Category D] (L : C ⥤ D)
34-
{H : Type*} [Category H] [∀ (F : C ⥤ H), HasLeftKanExtension L F]
36+
variable {C D : Type*} [Category C] [Category D] (L : C ⥤ D) {H : Type*} [Category H]
37+
38+
section lan
39+
40+
section
41+
42+
variable [∀ (F : C ⥤ H), HasLeftKanExtension L F]
3543

3644
/-- The left Kan extension functor `(C ⥤ H) ⥤ (D ⥤ H)` along a functor `C ⥤ D`. -/
3745
noncomputable def lan : (C ⥤ H) ⥤ (D ⥤ H) where
@@ -62,7 +70,7 @@ noncomputable def lanAdjunction : L.lan ⊣ (whiskeringLeft C D H).obj L :=
6270
Adjunction.mkOfHomEquiv
6371
{ homEquiv := fun F G => homEquivOfIsLeftKanExtension _ (L.lanUnit.app F) G
6472
homEquiv_naturality_left_symm := fun {F₁ F₂ G} f α =>
65-
hom_ext_of_isLeftKanExtension _ (L.lanUnit.app F₁) _ _ (by
73+
hom_ext_of_isLeftKanExtension _ (L.lanUnit.app F₁) _ _ (by
6674
ext X
6775
dsimp [homEquivOfIsLeftKanExtension]
6876
rw [descOfIsLeftKanExtension_fac_app, NatTrans.comp_app, ← assoc]
@@ -99,23 +107,28 @@ lemma isIso_lanAdjunction_counit_app_iff (G : D ⥤ H) :
99107
IsIso ((L.lanAdjunction H).counit.app G) ↔ G.IsLeftKanExtension (𝟙 (L ⋙ G)) :=
100108
(isLeftKanExtension_iff_isIso _ (L.lanUnit.app (L ⋙ G)) _ (by simp)).symm
101109

110+
end
111+
102112
section
103113

104114
variable [Full L] [Faithful L]
105115

106-
instance (F : C ⥤ H) (X : C) [HasPointwiseLeftKanExtension L F] :
116+
instance (F : C ⥤ H) (X : C) [HasPointwiseLeftKanExtension L F]
117+
[∀ (F : C ⥤ H), HasLeftKanExtension L F] :
107118
IsIso ((L.lanUnit.app F).app X) :=
108119
(isPointwiseLeftKanExtensionLanUnit L F (L.obj X)).isIso_hom_app
109120

110-
instance (F : C ⥤ H) [HasPointwiseLeftKanExtension L F] :
121+
instance (F : C ⥤ H) [HasPointwiseLeftKanExtension L F]
122+
[∀ (F : C ⥤ H), HasLeftKanExtension L F] :
111123
IsIso (L.lanUnit.app F) :=
112124
NatIso.isIso_of_isIso_app _
113125

114126
instance coreflective [∀ (F : C ⥤ H), HasPointwiseLeftKanExtension L F] :
115127
IsIso (L.lanUnit (H := H)) := by
116128
apply NatIso.isIso_of_isIso_app _
117129

118-
instance (F : C ⥤ H) [HasPointwiseLeftKanExtension L F] :
130+
instance (F : C ⥤ H) [HasPointwiseLeftKanExtension L F]
131+
[∀ (F : C ⥤ H), HasLeftKanExtension L F] :
119132
IsIso ((L.lanAdjunction H).unit.app F) := by
120133
rw [lanAdjunction_unit]
121134
infer_instance
@@ -126,6 +139,115 @@ instance coreflective' [∀ (F : C ⥤ H), HasPointwiseLeftKanExtension L F] :
126139

127140
end
128141

142+
end lan
143+
144+
section ran
145+
146+
section
147+
148+
variable [∀ (F : C ⥤ H), HasRightKanExtension L F]
149+
150+
/-- The right Kan extension functor `(C ⥤ H) ⥤ (D ⥤ H)` along a functor `C ⥤ D`. -/
151+
noncomputable def ran : (C ⥤ H) ⥤ (D ⥤ H) where
152+
obj F := rightKanExtension L F
153+
map {F₁ F₂} φ := liftOfIsRightKanExtension _ (rightKanExtensionCounit L F₂) _
154+
(rightKanExtensionCounit L F₁ ≫ φ)
155+
156+
/-- The natural transformation `L ⋙ (L.lan).obj G ⟶ L`. -/
157+
noncomputable def ranCounit : L.ran ⋙ (whiskeringLeft C D H).obj L ⟶ (𝟭 (C ⥤ H)) where
158+
app F := rightKanExtensionCounit L F
159+
naturality {F₁ F₂} φ := by ext; simp [ran]
160+
161+
instance (F : C ⥤ H) : (L.ran.obj F).IsRightKanExtension (L.ranCounit.app F) := by
162+
dsimp [ran, ranCounit]
163+
infer_instance
164+
165+
/-- If there exists a pointwise right Kan extension of `F` along `L`,
166+
then `L.ran.obj G` is a pointwise right Kan extension of `F`. -/
167+
noncomputable def isPointwiseRightKanExtensionRanCounit
168+
(F : C ⥤ H) [HasPointwiseRightKanExtension L F] :
169+
(RightExtension.mk _ (L.ranCounit.app F)).IsPointwiseRightKanExtension :=
170+
isPointwiseRightKanExtensionOfIsRightKanExtension (F := F) _ (L.ranCounit.app F)
171+
172+
variable (H) in
173+
/-- The right Kan extension functor `L.ran` is right adjoint to the
174+
precomposition by `L`. -/
175+
noncomputable def ranAdjunction : (whiskeringLeft C D H).obj L ⊣ L.ran :=
176+
Adjunction.mkOfHomEquiv
177+
{ homEquiv := fun F G =>
178+
(homEquivOfIsRightKanExtension (α := L.ranCounit.app G) F).symm
179+
homEquiv_naturality_right := fun {F G₁ G₂} β f ↦
180+
hom_ext_of_isRightKanExtension _ (L.ranCounit.app G₂) _ _ (by
181+
ext X
182+
dsimp [homEquivOfIsRightKanExtension]
183+
rw [liftOfIsRightKanExtension_fac_app, NatTrans.comp_app, assoc]
184+
have h := congr_app (L.ranCounit.naturality f) X
185+
dsimp at h ⊢
186+
rw [h, liftOfIsRightKanExtension_fac_app_assoc])
187+
homEquiv_naturality_left_symm := fun {F₁ F₂ G} β f ↦ by
188+
dsimp [homEquivOfIsRightKanExtension]
189+
rw [assoc] }
190+
191+
variable (H) in
192+
@[simp]
193+
lemma ranAdjunction_counit : (L.ranAdjunction H).counit = L.ranCounit := by
194+
ext F : 2
195+
dsimp [ranAdjunction, homEquivOfIsRightKanExtension]
196+
simp
197+
198+
lemma ranAdjunction_unit_app (G : D ⥤ H) :
199+
(L.ranAdjunction H).unit.app G =
200+
liftOfIsRightKanExtension (L.ran.obj (L ⋙ G)) (L.ranCounit.app (L ⋙ G)) G (𝟙 (L ⋙ G)) :=
201+
rfl
202+
203+
@[reassoc (attr := simp)]
204+
lemma ranCounit_app_whiskerLeft_ranAdjunction_unit_app (G : D ⥤ H) :
205+
whiskerLeft L ((L.ranAdjunction H).unit.app G) ≫ L.ranCounit.app (L ⋙ G) = 𝟙 (L ⋙ G) := by
206+
simp [ranAdjunction_unit_app]
207+
208+
@[reassoc (attr := simp)]
209+
lemma ranCounit_app_app_ranAdjunction_unit_app_app (G : D ⥤ H) (X : C) :
210+
((L.ranAdjunction H).unit.app G).app (L.obj X) ≫ (L.ranCounit.app (L ⋙ G)).app X = 𝟙 _ :=
211+
congr_app (L.ranCounit_app_whiskerLeft_ranAdjunction_unit_app G) X
212+
213+
lemma isIso_ranAdjunction_unit_app_iff (G : D ⥤ H) :
214+
IsIso ((L.ranAdjunction H).unit.app G) ↔ G.IsRightKanExtension (𝟙 (L ⋙ G)) :=
215+
(isRightKanExtension_iff_isIso _ (L.ranCounit.app (L ⋙ G)) _ (by simp)).symm
216+
217+
end
218+
219+
section
220+
221+
variable [Full L] [Faithful L]
222+
223+
instance (F : C ⥤ H) (X : C) [HasPointwiseRightKanExtension L F]
224+
[∀ (F : C ⥤ H), HasRightKanExtension L F] :
225+
IsIso ((L.ranCounit.app F).app X) :=
226+
(isPointwiseRightKanExtensionRanCounit L F (L.obj X)).isIso_hom_app
227+
228+
instance (F : C ⥤ H) [HasPointwiseRightKanExtension L F]
229+
[∀ (F : C ⥤ H), HasRightKanExtension L F] :
230+
IsIso (L.ranCounit.app F) :=
231+
NatIso.isIso_of_isIso_app _
232+
233+
instance reflective [∀ (F : C ⥤ H), HasPointwiseRightKanExtension L F] :
234+
IsIso (L.ranCounit (H := H)) := by
235+
apply NatIso.isIso_of_isIso_app _
236+
237+
instance (F : C ⥤ H) [HasPointwiseRightKanExtension L F]
238+
[∀ (F : C ⥤ H), HasRightKanExtension L F] :
239+
IsIso ((L.ranAdjunction H).counit.app F) := by
240+
rw [ranAdjunction_counit]
241+
infer_instance
242+
243+
instance reflective' [∀ (F : C ⥤ H), HasPointwiseRightKanExtension L F] :
244+
IsIso (L.ranAdjunction H).counit := by
245+
apply NatIso.isIso_of_isIso_app _
246+
247+
end
248+
249+
end ran
250+
129251
end Functor
130252

131253
end CategoryTheory

0 commit comments

Comments
 (0)