@@ -33,7 +33,8 @@ open Category Limits
3333
3434namespace Functor
3535
36- variable {C D H : Type *} [Category C] [Category D] [Category H] (L : C ⥤ D) (F : C ⥤ H)
36+ variable {C D D' H : Type *} [Category C] [Category D] [Category D'] [Category H]
37+ (L : C ⥤ D) (L' : C ⥤ D') (F : C ⥤ H)
3738
3839/-- The condition that a functor `F` has a pointwise left Kan extension along `L` at `Y`.
3940It means that the functor `CostructuredArrow.proj L Y ⋙ F : CostructuredArrow L Y ⥤ H`
@@ -55,6 +56,108 @@ abbrev HasPointwiseRightKanExtensionAt (Y : D) :=
5556that it has a pointwise right Kan extension at any object. -/
5657abbrev HasPointwiseRightKanExtension := ∀ (Y : D), HasPointwiseRightKanExtensionAt L F Y
5758
59+ lemma hasPointwiseLeftKanExtensionAt_iff_of_iso {Y₁ Y₂ : D} (e : Y₁ ≅ Y₂) :
60+ HasPointwiseLeftKanExtensionAt L F Y₁ ↔
61+ HasPointwiseLeftKanExtensionAt L F Y₂ := by
62+ revert Y₁ Y₂ e
63+ suffices ∀ ⦃Y₁ Y₂ : D⦄ (_ : Y₁ ≅ Y₂) [HasPointwiseLeftKanExtensionAt L F Y₁],
64+ HasPointwiseLeftKanExtensionAt L F Y₂ from
65+ fun Y₁ Y₂ e => ⟨fun _ => this e, fun _ => this e.symm⟩
66+ intro Y₁ Y₂ e _
67+ change HasColimit ((CostructuredArrow.mapIso e.symm).functor ⋙ CostructuredArrow.proj L Y₁ ⋙ F)
68+ infer_instance
69+
70+ lemma hasPointwiseRightKanExtensionAt_iff_of_iso {Y₁ Y₂ : D} (e : Y₁ ≅ Y₂) :
71+ HasPointwiseRightKanExtensionAt L F Y₁ ↔
72+ HasPointwiseRightKanExtensionAt L F Y₂ := by
73+ revert Y₁ Y₂ e
74+ suffices ∀ ⦃Y₁ Y₂ : D⦄ (_ : Y₁ ≅ Y₂) [HasPointwiseRightKanExtensionAt L F Y₁],
75+ HasPointwiseRightKanExtensionAt L F Y₂ from
76+ fun Y₁ Y₂ e => ⟨fun _ => this e, fun _ => this e.symm⟩
77+ intro Y₁ Y₂ e _
78+ change HasLimit ((StructuredArrow.mapIso e.symm).functor ⋙ StructuredArrow.proj Y₁ L ⋙ F)
79+ infer_instance
80+
81+ variable {L} in
82+ /-- `HasPointwiseLeftKanExtensionAt` is invariant when we replace `L` by an equivalent functor. -/
83+ lemma hasPointwiseLeftKanExtensionAt_iff_of_natIso {L' : C ⥤ D} (e : L ≅ L') (Y : D) :
84+ HasPointwiseLeftKanExtensionAt L F Y ↔
85+ HasPointwiseLeftKanExtensionAt L' F Y := by
86+ revert L L' e
87+ suffices ∀ ⦃L L' : C ⥤ D⦄ (_ : L ≅ L') [HasPointwiseLeftKanExtensionAt L F Y],
88+ HasPointwiseLeftKanExtensionAt L' F Y from
89+ fun L L' e => ⟨fun _ => this e, fun _ => this e.symm⟩
90+ intro L L' e _
91+ let Φ : CostructuredArrow L' Y ≌ CostructuredArrow L Y := Comma.mapLeftIso _ e.symm
92+ let e' : CostructuredArrow.proj L' Y ⋙ F ≅
93+ Φ.functor ⋙ CostructuredArrow.proj L Y ⋙ F := Iso.refl _
94+ exact hasColimit_of_iso e'
95+
96+ variable {L} in
97+ /-- `HasPointwiseRightKanExtensionAt` is invariant when we replace `L` by an equivalent functor. -/
98+ lemma hasPointwiseRightKanExtensionAt_iff_of_natIso {L' : C ⥤ D} (e : L ≅ L') (Y : D) :
99+ HasPointwiseRightKanExtensionAt L F Y ↔
100+ HasPointwiseRightKanExtensionAt L' F Y := by
101+ revert L L' e
102+ suffices ∀ ⦃L L' : C ⥤ D⦄ (_ : L ≅ L') [HasPointwiseRightKanExtensionAt L F Y],
103+ HasPointwiseRightKanExtensionAt L' F Y from
104+ fun L L' e => ⟨fun _ => this e, fun _ => this e.symm⟩
105+ intro L L' e _
106+ let Φ : StructuredArrow Y L' ≌ StructuredArrow Y L := Comma.mapRightIso _ e.symm
107+ let e' : StructuredArrow.proj Y L' ⋙ F ≅
108+ Φ.functor ⋙ StructuredArrow.proj Y L ⋙ F := Iso.refl _
109+ exact hasLimit_of_iso e'.symm
110+
111+ lemma hasPointwiseLeftKanExtensionAt_of_equivalence
112+ (E : D ≌ D') (eL : L ⋙ E.functor ≅ L') (Y : D) (Y' : D') (e : E.functor.obj Y ≅ Y')
113+ [HasPointwiseLeftKanExtensionAt L F Y] :
114+ HasPointwiseLeftKanExtensionAt L' F Y' := by
115+ rw [← hasPointwiseLeftKanExtensionAt_iff_of_natIso F eL,
116+ hasPointwiseLeftKanExtensionAt_iff_of_iso _ F e.symm]
117+ let Φ := CostructuredArrow.post L E.functor Y
118+ have : HasColimit ((asEquivalence Φ).functor ⋙
119+ CostructuredArrow.proj (L ⋙ E.functor) (E.functor.obj Y) ⋙ F) :=
120+ (inferInstance : HasPointwiseLeftKanExtensionAt L F Y)
121+ exact hasColimit_of_equivalence_comp (asEquivalence Φ)
122+
123+ lemma hasPointwiseLeftKanExtensionAt_iff_of_equivalence
124+ (E : D ≌ D') (eL : L ⋙ E.functor ≅ L') (Y : D) (Y' : D') (e : E.functor.obj Y ≅ Y') :
125+ HasPointwiseLeftKanExtensionAt L F Y ↔
126+ HasPointwiseLeftKanExtensionAt L' F Y' := by
127+ constructor
128+ · intro
129+ exact hasPointwiseLeftKanExtensionAt_of_equivalence L L' F E eL Y Y' e
130+ · intro
131+ exact hasPointwiseLeftKanExtensionAt_of_equivalence L' L F E.symm
132+ (isoWhiskerRight eL.symm _ ≪≫ Functor.associator _ _ _ ≪≫
133+ isoWhiskerLeft L E.unitIso.symm ≪≫ L.rightUnitor) Y' Y
134+ (E.inverse.mapIso e.symm ≪≫ E.unitIso.symm.app Y)
135+
136+ lemma hasPointwiseRightKanExtensionAt_of_equivalence
137+ (E : D ≌ D') (eL : L ⋙ E.functor ≅ L') (Y : D) (Y' : D') (e : E.functor.obj Y ≅ Y')
138+ [HasPointwiseRightKanExtensionAt L F Y] :
139+ HasPointwiseRightKanExtensionAt L' F Y' := by
140+ rw [← hasPointwiseRightKanExtensionAt_iff_of_natIso F eL,
141+ hasPointwiseRightKanExtensionAt_iff_of_iso _ F e.symm]
142+ let Φ := StructuredArrow.post Y L E.functor
143+ have : HasLimit ((asEquivalence Φ).functor ⋙
144+ StructuredArrow.proj (E.functor.obj Y) (L ⋙ E.functor) ⋙ F) :=
145+ (inferInstance : HasPointwiseRightKanExtensionAt L F Y)
146+ exact hasLimit_of_equivalence_comp (asEquivalence Φ)
147+
148+ lemma hasPointwiseRightKanExtensionAt_iff_of_equivalence
149+ (E : D ≌ D') (eL : L ⋙ E.functor ≅ L') (Y : D) (Y' : D') (e : E.functor.obj Y ≅ Y') :
150+ HasPointwiseRightKanExtensionAt L F Y ↔
151+ HasPointwiseRightKanExtensionAt L' F Y' := by
152+ constructor
153+ · intro
154+ exact hasPointwiseRightKanExtensionAt_of_equivalence L L' F E eL Y Y' e
155+ · intro
156+ exact hasPointwiseRightKanExtensionAt_of_equivalence L' L F E.symm
157+ (isoWhiskerRight eL.symm _ ≪≫ Functor.associator _ _ _ ≪≫
158+ isoWhiskerLeft L E.unitIso.symm ≪≫ L.rightUnitor) Y' Y
159+ (E.inverse.mapIso e.symm ≪≫ E.unitIso.symm.app Y)
160+
58161namespace LeftExtension
59162
60163variable {F L}
@@ -98,6 +201,27 @@ lemma IsPointwiseLeftKanExtensionAt.isIso_hom_app
98201 IsIso (E.hom.app X) := by
99202 simpa using h.isIso_ι_app_of_isTerminal _ CostructuredArrow.mkIdTerminal
100203
204+ /-- The condition of being a pointwise left Kan extension at an object `Y` is
205+ unchanged by replacing `Y` by an isomorphic object `Y'`. -/
206+ def isPointwiseLeftKanExtensionAtOfIso'
207+ {Y : D} (hY : E.IsPointwiseLeftKanExtensionAt Y) {Y' : D} (e : Y ≅ Y') :
208+ E.IsPointwiseLeftKanExtensionAt Y' :=
209+ IsColimit.ofIsoColimit (hY.whiskerEquivalence (CostructuredArrow.mapIso e.symm))
210+ (Cocones.ext (E.right.mapIso e))
211+
212+ /-- The condition of being a pointwise left Kan extension at an object `Y` is
213+ unchanged by replacing `Y` by an isomorphic object `Y'`. -/
214+ def isPointwiseLeftKanExtensionAtEquivOfIso' {Y Y' : D} (e : Y ≅ Y') :
215+ E.IsPointwiseLeftKanExtensionAt Y ≃ E.IsPointwiseLeftKanExtensionAt Y' where
216+ toFun h := E.isPointwiseLeftKanExtensionAtOfIso' h e
217+ invFun h := E.isPointwiseLeftKanExtensionAtOfIso' h e.symm
218+ left_inv h := by
219+ dsimp only [IsPointwiseLeftKanExtensionAt]
220+ apply Subsingleton.elim
221+ right_inv h := by
222+ dsimp only [IsPointwiseLeftKanExtensionAt]
223+ apply Subsingleton.elim
224+
101225namespace IsPointwiseLeftKanExtensionAt
102226
103227variable {E} {Y : D} (h : E.IsPointwiseLeftKanExtensionAt Y)
@@ -235,6 +359,27 @@ lemma IsPointwiseRightKanExtensionAt.isIso_hom_app
235359 IsIso (E.hom.app X) := by
236360 simpa using h.isIso_π_app_of_isInitial _ StructuredArrow.mkIdInitial
237361
362+ /-- The condition of being a pointwise right Kan extension at an object `Y` is
363+ unchanged by replacing `Y` by an isomorphic object `Y'`. -/
364+ def isPointwiseRightKanExtensionAtOfIso'
365+ {Y : D} (hY : E.IsPointwiseRightKanExtensionAt Y) {Y' : D} (e : Y ≅ Y') :
366+ E.IsPointwiseRightKanExtensionAt Y' :=
367+ IsLimit.ofIsoLimit (hY.whiskerEquivalence (StructuredArrow.mapIso e.symm))
368+ (Cones.ext (E.left.mapIso e))
369+
370+ /-- The condition of being a pointwise right Kan extension at an object `Y` is
371+ unchanged by replacing `Y` by an isomorphic object `Y'`. -/
372+ def isPointwiseRightKanExtensionAtEquivOfIso' {Y Y' : D} (e : Y ≅ Y') :
373+ E.IsPointwiseRightKanExtensionAt Y ≃ E.IsPointwiseRightKanExtensionAt Y' where
374+ toFun h := E.isPointwiseRightKanExtensionAtOfIso' h e
375+ invFun h := E.isPointwiseRightKanExtensionAtOfIso' h e.symm
376+ left_inv h := by
377+ dsimp only [IsPointwiseRightKanExtensionAt]
378+ apply Subsingleton.elim
379+ right_inv h := by
380+ dsimp only [IsPointwiseRightKanExtensionAt]
381+ apply Subsingleton.elim
382+
238383namespace IsPointwiseRightKanExtensionAt
239384
240385variable {E} {Y : D} (h : E.IsPointwiseRightKanExtensionAt Y)
0 commit comments