Skip to content

Commit 7f8c9ac

Browse files
committed
chore: dualize Limits.Preserves.Opposites (#18814)
1 parent 2f08bd8 commit 7f8c9ac

File tree

3 files changed

+351
-20
lines changed

3 files changed

+351
-20
lines changed

Mathlib/CategoryTheory/Limits/HasLimits.lean

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,7 +1131,7 @@ def IsLimit.unop {t : Cone F.op} (P : IsLimit t) : IsColimit t.unop where
11311131
rw [← w]
11321132
rfl
11331133

1134-
/-- If `t : Cocone F.op` is a colimit cocone, then `t.unop : Cone F.` is a limit cone.
1134+
/-- If `t : Cocone F.op` is a colimit cocone, then `t.unop : Cone F` is a limit cone.
11351135
-/
11361136
def IsColimit.unop {t : Cocone F.op} (P : IsColimit t) : IsLimit t.unop where
11371137
lift s := (P.desc s.op).unop
@@ -1146,17 +1146,31 @@ def IsColimit.unop {t : Cocone F.op} (P : IsColimit t) : IsLimit t.unop where
11461146
rw [← w]
11471147
rfl
11481148

1149+
/-- If `t.op : Cocone F.op` is a colimit cocone, then `t : Cone F` is a limit cone. -/
1150+
def isLimitOfOp {t : Cone F} (P : IsColimit t.op) : IsLimit t :=
1151+
P.unop
1152+
1153+
/-- If `t.op : Cone F.op` is a limit cone, then `t : Cocone F` is a colimit cocone. -/
1154+
def isColimitOfOp {t : Cocone F} (P : IsLimit t.op) : IsColimit t :=
1155+
P.unop
1156+
1157+
/-- If `t.unop : Cocone F` is a colimit cocone, then `t : Cone F.op` is a limit cone.-/
1158+
def isLimitOfUnop {t : Cone F.op} (P : IsColimit t.unop) : IsLimit t :=
1159+
P.op
1160+
1161+
/-- If `t.unop : Cone F` is a limit cone, then `t : Cocone F.op` is a colimit cocone. -/
1162+
def isColimitOfUnop {t : Cocone F.op} (P : IsLimit t.unop) : IsColimit t :=
1163+
P.op
1164+
11491165
/-- `t : Cone F` is a limit cone if and only if `t.op : Cocone F.op` is a colimit cocone.
11501166
-/
11511167
def isLimitEquivIsColimitOp {t : Cone F} : IsLimit t ≃ IsColimit t.op :=
1152-
equivOfSubsingletonOfSubsingleton IsLimit.op fun P =>
1153-
P.unop.ofIsoLimit (Cones.ext (Iso.refl _))
1168+
equivOfSubsingletonOfSubsingleton IsLimit.op isLimitOfOp
11541169

11551170
/-- `t : Cocone F` is a colimit cocone if and only if `t.op : Cone F.op` is a limit cone.
11561171
-/
11571172
def isColimitEquivIsLimitOp {t : Cocone F} : IsColimit t ≃ IsLimit t.op :=
1158-
equivOfSubsingletonOfSubsingleton IsColimit.op fun P =>
1159-
P.unop.ofIsoColimit (Cocones.ext (Iso.refl _))
1173+
equivOfSubsingletonOfSubsingleton IsColimit.op isColimitOfOp
11601174

11611175
end Opposite
11621176

Mathlib/CategoryTheory/Limits/Opposites.lean

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ def isLimitConeOfCoconeRightOp (F : Jᵒᵖ ⥤ C) {c : Cocone F.rightOp} (hc :
139139
refine Quiver.Hom.op_inj (hc.hom_ext fun j => Quiver.Hom.unop_inj ?_)
140140
simpa only [Quiver.Hom.op_unop, IsColimit.fac] using w (op j)
141141

142-
/-- Turn a limit for `F.rightOp : J ⥤ Cᵒᵖ` into a limit for `F : Jᵒᵖ ⥤ C`. -/
142+
/-- Turn a limit for `F.rightOp : J ⥤ Cᵒᵖ` into a colimit for `F : Jᵒᵖ ⥤ C`. -/
143143
@[simps]
144144
def isColimitCoconeOfConeRightOp (F : Jᵒᵖ ⥤ C) {c : Cone F.rightOp} (hc : IsLimit c) :
145145
IsColimit (coconeOfConeRightOp c) where
@@ -169,6 +169,78 @@ def isColimitCoconeOfConeUnop (F : Jᵒᵖ ⥤ Cᵒᵖ) {c : Cone F.unop} (hc :
169169
refine Quiver.Hom.unop_inj (hc.hom_ext fun j => Quiver.Hom.op_inj ?_)
170170
simpa only [Quiver.Hom.unop_op, IsLimit.fac] using w (op j)
171171

172+
/-- Turn a limit for `F.leftOp : Jᵒᵖ ⥤ C` into a colimit for `F : J ⥤ Cᵒᵖ`. -/
173+
@[simps!]
174+
def isColimitOfConeLeftOpOfCocone (F : J ⥤ Cᵒᵖ) {c : Cocone F}
175+
(hc : IsLimit (coneLeftOpOfCocone c)) : IsColimit c :=
176+
isColimitCoconeOfConeLeftOp F hc
177+
178+
/-- Turn a colimit for `F.leftOp : Jᵒᵖ ⥤ C` into a limit for `F : J ⥤ Cᵒᵖ`. -/
179+
@[simps!]
180+
def isLimitOfCoconeLeftOpOfCone (F : J ⥤ Cᵒᵖ) {c : Cone F}
181+
(hc : IsColimit (coconeLeftOpOfCone c)) : IsLimit c :=
182+
isLimitConeOfCoconeLeftOp F hc
183+
184+
/-- Turn a limit for `F.rightOp : J ⥤ Cᵒᵖ` into a colimit for `F : Jᵒᵖ ⥤ C`. -/
185+
@[simps!]
186+
def isColimitOfConeRightOpOfCocone (F : Jᵒᵖ ⥤ C) {c : Cocone F}
187+
(hc : IsLimit (coneRightOpOfCocone c)) : IsColimit c :=
188+
isColimitCoconeOfConeRightOp F hc
189+
190+
/-- Turn a colimit for `F.rightOp : J ⥤ Cᵒᵖ` into a limit for `F : Jᵒᵖ ⥤ C`. -/
191+
@[simps!]
192+
def isLimitOfCoconeRightOpOfCone (F : Jᵒᵖ ⥤ C) {c : Cone F}
193+
(hc : IsColimit (coconeRightOpOfCone c)) : IsLimit c :=
194+
isLimitConeOfCoconeRightOp F hc
195+
196+
/-- Turn a limit for `F.unop : J ⥤ C` into a colimit for `F : Jᵒᵖ ⥤ Cᵒᵖ`. -/
197+
@[simps!]
198+
def isColimitOfConeUnopOfCocone (F : Jᵒᵖ ⥤ Cᵒᵖ) {c : Cocone F}
199+
(hc : IsLimit (coneUnopOfCocone c)) : IsColimit c :=
200+
isColimitCoconeOfConeUnop F hc
201+
202+
/-- Turn a colimit for `F.unop : J ⥤ C` into a limit for `F : Jᵒᵖ ⥤ Cᵒᵖ`. -/
203+
@[simps!]
204+
def isLimitOfCoconeUnopOfCone (F : Jᵒᵖ ⥤ Cᵒᵖ) {c : Cone F}
205+
(hc : IsColimit (coconeUnopOfCone c)) : IsLimit c :=
206+
isLimitConeOfCoconeUnop F hc
207+
208+
/-- Turn a limit for `F : J ⥤ Cᵒᵖ` into a colimit for `F.leftOp : Jᵒᵖ ⥤ C`. -/
209+
@[simps!]
210+
def isColimitOfConeOfCoconeLeftOp (F : J ⥤ Cᵒᵖ) {c : Cocone F.leftOp}
211+
(hc : IsLimit (coneOfCoconeLeftOp c)) : IsColimit c :=
212+
isColimitCoconeLeftOpOfCone F hc
213+
214+
/-- Turn a colimit for `F : J ⥤ Cᵒᵖ` into a limit for `F.leftOp : Jᵒᵖ ⥤ C`. -/
215+
@[simps!]
216+
def isLimitOfCoconeOfConeLeftOp (F : J ⥤ Cᵒᵖ) {c : Cone F.leftOp}
217+
(hc : IsColimit (coconeOfConeLeftOp c)) : IsLimit c :=
218+
isLimitConeLeftOpOfCocone F hc
219+
220+
/-- Turn a limit for `F : Jᵒᵖ ⥤ C` into a colimit for `F.rightOp : J ⥤ Cᵒᵖ.` -/
221+
@[simps!]
222+
def isColimitOfConeOfCoconeRightOp (F : Jᵒᵖ ⥤ C) {c : Cocone F.rightOp}
223+
(hc : IsLimit (coneOfCoconeRightOp c)) : IsColimit c :=
224+
isColimitCoconeRightOpOfCone F hc
225+
226+
/-- Turn a colimit for `F : Jᵒᵖ ⥤ C` into a limit for `F.rightOp : J ⥤ Cᵒᵖ`. -/
227+
@[simps!]
228+
def isLimitOfCoconeOfConeRightOp (F : Jᵒᵖ ⥤ C) {c : Cone F.rightOp}
229+
(hc : IsColimit (coconeOfConeRightOp c)) : IsLimit c :=
230+
isLimitConeRightOpOfCocone F hc
231+
232+
/-- Turn a limit for `F : Jᵒᵖ ⥤ Cᵒᵖ` into a colimit for `F.unop : J ⥤ C`. -/
233+
@[simps!]
234+
def isColimitOfConeOfCoconeUnop (F : Jᵒᵖ ⥤ Cᵒᵖ) {c : Cocone F.unop}
235+
(hc : IsLimit (coneOfCoconeUnop c)) : IsColimit c :=
236+
isColimitCoconeUnopOfCone F hc
237+
238+
/-- Turn a colimit for `F : Jᵒᵖ ⥤ Cᵒᵖ` into a limit for `F.unop : J ⥤ C`. -/
239+
@[simps!]
240+
def isLimitOfCoconeOfConeUnop (F : Jᵒᵖ ⥤ Cᵒᵖ) {c : Cone F.unop}
241+
(hc : IsColimit (coconeOfConeUnop c)) : IsLimit c :=
242+
isLimitConeUnopOfCocone F hc
243+
172244
@[deprecated (since := "2024-11-01")] alias isColimitConeOfCoconeUnop := isColimitCoconeOfConeUnop
173245

174246
/-- If `F.leftOp : Jᵒᵖ ⥤ C` has a colimit, we can construct a limit for `F : J ⥤ Cᵒᵖ`.

0 commit comments

Comments
 (0)