Skip to content

Commit 123eb21

Browse files
committed
feat(CategoryTheory): opposite functors preserving finite products (#15518)
If `F` preserves finite coproducts, then `F.op` preserves finite products, and the seven other variants for `leftOp`, `unop` etc. Also remove some lean3-isms from docstrings
1 parent 994b33b commit 123eb21

File tree

1 file changed

+82
-30
lines changed

1 file changed

+82
-30
lines changed

Mathlib/CategoryTheory/Limits/Preserves/Opposites.lean

Lines changed: 82 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Mathlib.CategoryTheory.Limits.Preserves.Finite
99
/-!
1010
# Limit preservation properties of `functor.op` and related constructions
1111
12-
We formulate conditions about `F` which imply that `F.op`, `F.unop`, `F.left_op` and `F.right_op`
12+
We formulate conditions about `F` which imply that `F.op`, `F.unop`, `F.leftOp` and `F.rightOp`
1313
preserve certain (co)limits.
1414
1515
## Future work
@@ -28,26 +28,24 @@ open CategoryTheory
2828

2929
namespace CategoryTheory.Limits
3030

31-
section
32-
3331
variable {C : Type u₁} [Category.{v₁} C] {D : Type u₂} [Category.{v₂} D]
3432
variable {J : Type w} [Category.{w'} J]
3533

36-
/-- If `F : C ⥤ D` preserves colimits of `K.left_op : Jᵒᵖ ⥤ C`, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves
34+
/-- If `F : C ⥤ D` preserves colimits of `K.leftOp : Jᵒᵖ ⥤ C`, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves
3735
limits of `K : J ⥤ Cᵒᵖ`. -/
3836
def preservesLimitOp (K : J ⥤ Cᵒᵖ) (F : C ⥤ D) [PreservesColimit K.leftOp F] :
3937
PreservesLimit K F.op where
4038
preserves {_} hc :=
4139
isLimitConeRightOpOfCocone _ (isColimitOfPreserves F (isColimitCoconeLeftOpOfCone _ hc))
4240

43-
/-- If `F : C ⥤ Dᵒᵖ` preserves colimits of `K.left_op : Jᵒᵖ ⥤ C`, then `F.left_op : Cᵒᵖ ⥤ D`
41+
/-- If `F : C ⥤ Dᵒᵖ` preserves colimits of `K.leftOp : Jᵒᵖ ⥤ C`, then `F.leftOp : Cᵒᵖ ⥤ D`
4442
preserves limits of `K : J ⥤ Cᵒᵖ`. -/
4543
def preservesLimitLeftOp (K : J ⥤ Cᵒᵖ) (F : C ⥤ Dᵒᵖ) [PreservesColimit K.leftOp F] :
4644
PreservesLimit K F.leftOp where
4745
preserves {_} hc :=
4846
isLimitConeUnopOfCocone _ (isColimitOfPreserves F (isColimitCoconeLeftOpOfCone _ hc))
4947

50-
/-- If `F : Cᵒᵖ ⥤ D` preserves colimits of `K.op : Jᵒᵖ ⥤ Cᵒᵖ`, then `F.right_op : C ⥤ Dᵒᵖ` preserves
48+
/-- If `F : Cᵒᵖ ⥤ D` preserves colimits of `K.op : Jᵒᵖ ⥤ Cᵒᵖ`, then `F.rightOp : C ⥤ Dᵒᵖ` preserves
5149
limits of `K : J ⥤ C`. -/
5250
def preservesLimitRightOp (K : J ⥤ C) (F : Cᵒᵖ ⥤ D) [PreservesColimit K.op F] :
5351
PreservesLimit K F.rightOp where
@@ -61,21 +59,21 @@ def preservesLimitUnop (K : J ⥤ C) (F : Cᵒᵖ ⥤ Dᵒᵖ) [PreservesColimit
6159
preserves {_} hc :=
6260
isLimitConeUnopOfCocone _ (isColimitOfPreserves F hc.op)
6361

64-
/-- If `F : C ⥤ D` preserves limits of `K.left_op : Jᵒᵖ ⥤ C`, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves
62+
/-- If `F : C ⥤ D` preserves limits of `K.leftOp : Jᵒᵖ ⥤ C`, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves
6563
colimits of `K : J ⥤ Cᵒᵖ`. -/
6664
def preservesColimitOp (K : J ⥤ Cᵒᵖ) (F : C ⥤ D) [PreservesLimit K.leftOp F] :
6765
PreservesColimit K F.op where
6866
preserves {_} hc :=
6967
isColimitCoconeRightOpOfCone _ (isLimitOfPreserves F (isLimitConeLeftOpOfCocone _ hc))
7068

71-
/-- If `F : C ⥤ Dᵒᵖ` preserves limits of `K.left_op : Jᵒᵖ ⥤ C`, then `F.left_op : Cᵒᵖ ⥤ D` preserves
69+
/-- If `F : C ⥤ Dᵒᵖ` preserves limits of `K.leftOp : Jᵒᵖ ⥤ C`, then `F.leftOp : Cᵒᵖ ⥤ D` preserves
7270
colimits of `K : J ⥤ Cᵒᵖ`. -/
7371
def preservesColimitLeftOp (K : J ⥤ Cᵒᵖ) (F : C ⥤ Dᵒᵖ) [PreservesLimit K.leftOp F] :
7472
PreservesColimit K F.leftOp where
7573
preserves {_} hc :=
7674
isColimitCoconeUnopOfCone _ (isLimitOfPreserves F (isLimitConeLeftOpOfCocone _ hc))
7775

78-
/-- If `F : Cᵒᵖ ⥤ D` preserves limits of `K.op : Jᵒᵖ ⥤ Cᵒᵖ`, then `F.right_op : C ⥤ Dᵒᵖ` preserves
76+
/-- If `F : Cᵒᵖ ⥤ D` preserves limits of `K.op : Jᵒᵖ ⥤ Cᵒᵖ`, then `F.rightOp : C ⥤ Dᵒᵖ` preserves
7977
colimits of `K : J ⥤ C`. -/
8078
def preservesColimitRightOp (K : J ⥤ C) (F : Cᵒᵖ ⥤ D) [PreservesLimit K.op F] :
8179
PreservesColimit K F.rightOp where
@@ -98,12 +96,12 @@ variable (J)
9896
def preservesLimitsOfShapeOp (F : C ⥤ D) [PreservesColimitsOfShape Jᵒᵖ F] :
9997
PreservesLimitsOfShape J F.op where preservesLimit {K} := preservesLimitOp K F
10098

101-
/-- If `F : C ⥤ Dᵒᵖ` preserves colimits of shape `Jᵒᵖ`, then `F.left_op : Cᵒᵖ ⥤ D` preserves limits
99+
/-- If `F : C ⥤ Dᵒᵖ` preserves colimits of shape `Jᵒᵖ`, then `F.leftOp : Cᵒᵖ ⥤ D` preserves limits
102100
of shape `J`. -/
103101
def preservesLimitsOfShapeLeftOp (F : C ⥤ Dᵒᵖ) [PreservesColimitsOfShape Jᵒᵖ F] :
104102
PreservesLimitsOfShape J F.leftOp where preservesLimit {K} := preservesLimitLeftOp K F
105103

106-
/-- If `F : Cᵒᵖ ⥤ D` preserves colimits of shape `Jᵒᵖ`, then `F.right_op : C ⥤ Dᵒᵖ` preserves limits
104+
/-- If `F : Cᵒᵖ ⥤ D` preserves colimits of shape `Jᵒᵖ`, then `F.rightOp : C ⥤ Dᵒᵖ` preserves limits
107105
of shape `J`. -/
108106
def preservesLimitsOfShapeRightOp (F : Cᵒᵖ ⥤ D) [PreservesColimitsOfShape Jᵒᵖ F] :
109107
PreservesLimitsOfShape J F.rightOp where preservesLimit {K} := preservesLimitRightOp K F
@@ -118,12 +116,12 @@ def preservesLimitsOfShapeUnop (F : Cᵒᵖ ⥤ Dᵒᵖ) [PreservesColimitsOfSha
118116
def preservesColimitsOfShapeOp (F : C ⥤ D) [PreservesLimitsOfShape Jᵒᵖ F] :
119117
PreservesColimitsOfShape J F.op where preservesColimit {K} := preservesColimitOp K F
120118

121-
/-- If `F : C ⥤ Dᵒᵖ` preserves limits of shape `Jᵒᵖ`, then `F.left_op : Cᵒᵖ ⥤ D` preserves colimits
119+
/-- If `F : C ⥤ Dᵒᵖ` preserves limits of shape `Jᵒᵖ`, then `F.leftOp : Cᵒᵖ ⥤ D` preserves colimits
122120
of shape `J`. -/
123121
def preservesColimitsOfShapeLeftOp (F : C ⥤ Dᵒᵖ) [PreservesLimitsOfShape Jᵒᵖ F] :
124122
PreservesColimitsOfShape J F.leftOp where preservesColimit {K} := preservesColimitLeftOp K F
125123

126-
/-- If `F : Cᵒᵖ ⥤ D` preserves limits of shape `Jᵒᵖ`, then `F.right_op : C ⥤ Dᵒᵖ` preserves colimits
124+
/-- If `F : Cᵒᵖ ⥤ D` preserves limits of shape `Jᵒᵖ`, then `F.rightOp : C ⥤ Dᵒᵖ` preserves colimits
127125
of shape `J`. -/
128126
def preservesColimitsOfShapeRightOp (F : Cᵒᵖ ⥤ D) [PreservesLimitsOfShape Jᵒᵖ F] :
129127
PreservesColimitsOfShape J F.rightOp where preservesColimit {K} := preservesColimitRightOp K F
@@ -139,11 +137,11 @@ end
139137
def preservesLimitsOp (F : C ⥤ D) [PreservesColimits F] : PreservesLimits F.op where
140138
preservesLimitsOfShape {_} _ := preservesLimitsOfShapeOp _ _
141139

142-
/-- If `F : C ⥤ Dᵒᵖ` preserves colimits, then `F.left_op : Cᵒᵖ ⥤ D` preserves limits. -/
140+
/-- If `F : C ⥤ Dᵒᵖ` preserves colimits, then `F.leftOp : Cᵒᵖ ⥤ D` preserves limits. -/
143141
def preservesLimitsLeftOp (F : C ⥤ Dᵒᵖ) [PreservesColimits F] : PreservesLimits F.leftOp where
144142
preservesLimitsOfShape {_} _ := preservesLimitsOfShapeLeftOp _ _
145143

146-
/-- If `F : Cᵒᵖ ⥤ D` preserves colimits, then `F.right_op : C ⥤ Dᵒᵖ` preserves limits. -/
144+
/-- If `F : Cᵒᵖ ⥤ D` preserves colimits, then `F.rightOp : C ⥤ Dᵒᵖ` preserves limits. -/
147145
def preservesLimitsRightOp (F : Cᵒᵖ ⥤ D) [PreservesColimits F] : PreservesLimits F.rightOp where
148146
preservesLimitsOfShape {_} _ := preservesLimitsOfShapeRightOp _ _
149147

@@ -155,39 +153,31 @@ def preservesLimitsUnop (F : Cᵒᵖ ⥤ Dᵒᵖ) [PreservesColimits F] : Preser
155153
def perservesColimitsOp (F : C ⥤ D) [PreservesLimits F] : PreservesColimits F.op where
156154
preservesColimitsOfShape {_} _ := preservesColimitsOfShapeOp _ _
157155

158-
/-- If `F : C ⥤ Dᵒᵖ` preserves limits, then `F.left_op : Cᵒᵖ ⥤ D` preserves colimits. -/
156+
/-- If `F : C ⥤ Dᵒᵖ` preserves limits, then `F.leftOp : Cᵒᵖ ⥤ D` preserves colimits. -/
159157
def preservesColimitsLeftOp (F : C ⥤ Dᵒᵖ) [PreservesLimits F] : PreservesColimits F.leftOp where
160158
preservesColimitsOfShape {_} _ := preservesColimitsOfShapeLeftOp _ _
161159

162-
/-- If `F : Cᵒᵖ ⥤ D` preserves limits, then `F.right_op : C ⥤ Dᵒᵖ` preserves colimits. -/
160+
/-- If `F : Cᵒᵖ ⥤ D` preserves limits, then `F.rightOp : C ⥤ Dᵒᵖ` preserves colimits. -/
163161
def preservesColimitsRightOp (F : Cᵒᵖ ⥤ D) [PreservesLimits F] : PreservesColimits F.rightOp where
164162
preservesColimitsOfShape {_} _ := preservesColimitsOfShapeRightOp _ _
165163

166164
/-- If `F : Cᵒᵖ ⥤ Dᵒᵖ` preserves limits, then `F.unop : C ⥤ D` preserves colimits. -/
167165
def preservesColimitsUnop (F : Cᵒᵖ ⥤ Dᵒᵖ) [PreservesLimits F] : PreservesColimits F.unop where
168166
preservesColimitsOfShape {_} _ := preservesColimitsOfShapeUnop _ _
169167

170-
end
171-
172-
section
173-
174-
-- Preservation of finite (colimits) is only defined when the morphisms of C and D live in the same
175-
-- universe.
176-
variable {C : Type u₁} [Category.{v₁} C] {D : Type u₂} [Category.{v₁} D]
177-
178168
/-- If `F : C ⥤ D` preserves finite colimits, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves finite
179169
limits. -/
180170
def preservesFiniteLimitsOp (F : C ⥤ D) [PreservesFiniteColimits F] :
181171
PreservesFiniteLimits F.op where
182172
preservesFiniteLimits J (_ : SmallCategory J) _ := preservesLimitsOfShapeOp J F
183173

184-
/-- If `F : C ⥤ Dᵒᵖ` preserves finite colimits, then `F.left_op : Cᵒᵖ ⥤ D` preserves finite
174+
/-- If `F : C ⥤ Dᵒᵖ` preserves finite colimits, then `F.leftOp : Cᵒᵖ ⥤ D` preserves finite
185175
limits. -/
186176
def preservesFiniteLimitsLeftOp (F : C ⥤ Dᵒᵖ) [PreservesFiniteColimits F] :
187177
PreservesFiniteLimits F.leftOp where
188178
preservesFiniteLimits J (_ : SmallCategory J) _ := preservesLimitsOfShapeLeftOp J F
189179

190-
/-- If `F : Cᵒᵖ ⥤ D` preserves finite colimits, then `F.right_op : C ⥤ Dᵒᵖ` preserves finite
180+
/-- If `F : Cᵒᵖ ⥤ D` preserves finite colimits, then `F.rightOp : C ⥤ Dᵒᵖ` preserves finite
191181
limits. -/
192182
def preservesFiniteLimitsRightOp (F : Cᵒᵖ ⥤ D) [PreservesFiniteColimits F] :
193183
PreservesFiniteLimits F.rightOp where
@@ -205,13 +195,13 @@ def preservesFiniteColimitsOp (F : C ⥤ D) [PreservesFiniteLimits F] :
205195
PreservesFiniteColimits F.op where
206196
preservesFiniteColimits J (_ : SmallCategory J) _ := preservesColimitsOfShapeOp J F
207197

208-
/-- If `F : C ⥤ Dᵒᵖ` preserves finite limits, then `F.left_op : Cᵒᵖ ⥤ D` preserves finite
198+
/-- If `F : C ⥤ Dᵒᵖ` preserves finite limits, then `F.leftOp : Cᵒᵖ ⥤ D` preserves finite
209199
colimits. -/
210200
def preservesFiniteColimitsLeftOp (F : C ⥤ Dᵒᵖ) [PreservesFiniteLimits F] :
211201
PreservesFiniteColimits F.leftOp where
212202
preservesFiniteColimits J (_ : SmallCategory J) _ := preservesColimitsOfShapeLeftOp J F
213203

214-
/-- If `F : Cᵒᵖ ⥤ D` preserves finite limits, then `F.right_op : C ⥤ Dᵒᵖ` preserves finite
204+
/-- If `F : Cᵒᵖ ⥤ D` preserves finite limits, then `F.rightOp : C ⥤ Dᵒᵖ` preserves finite
215205
colimits. -/
216206
def preservesFiniteColimitsRightOp (F : Cᵒᵖ ⥤ D) [PreservesFiniteLimits F] :
217207
PreservesFiniteColimits F.rightOp where
@@ -223,6 +213,68 @@ def preservesFiniteColimitsUnop (F : Cᵒᵖ ⥤ Dᵒᵖ) [PreservesFiniteLimits
223213
PreservesFiniteColimits F.unop where
224214
preservesFiniteColimits J (_ : SmallCategory J) _ := preservesColimitsOfShapeUnop J F
225215

226-
end
216+
/-- If `F : C ⥤ D` preserves finite coproducts, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves finite
217+
products. -/
218+
def preservesFiniteProductsOp (F : C ⥤ D) [PreservesFiniteCoproducts F] :
219+
PreservesFiniteProducts F.op where
220+
preserves J _ := by
221+
apply (config := { allowSynthFailures := true }) preservesLimitsOfShapeOp
222+
exact preservesColimitsOfShapeOfEquiv (Discrete.opposite J).symm _
223+
224+
/-- If `F : C ⥤ Dᵒᵖ` preserves finite coproducts, then `F.leftOp : Cᵒᵖ ⥤ D` preserves finite
225+
products. -/
226+
def preservesFiniteProductsLeftOp (F : C ⥤ Dᵒᵖ) [PreservesFiniteCoproducts F] :
227+
PreservesFiniteProducts F.leftOp where
228+
preserves J _ := by
229+
apply (config := { allowSynthFailures := true }) preservesLimitsOfShapeLeftOp
230+
exact preservesColimitsOfShapeOfEquiv (Discrete.opposite J).symm _
231+
232+
/-- If `F : Cᵒᵖ ⥤ D` preserves finite coproducts, then `F.rightOp : C ⥤ Dᵒᵖ` preserves finite
233+
products. -/
234+
def preservesFiniteProductsRightOp (F : Cᵒᵖ ⥤ D) [PreservesFiniteCoproducts F] :
235+
PreservesFiniteProducts F.rightOp where
236+
preserves J _ := by
237+
apply (config := { allowSynthFailures := true }) preservesLimitsOfShapeRightOp
238+
exact preservesColimitsOfShapeOfEquiv (Discrete.opposite J).symm _
239+
240+
/-- If `F : Cᵒᵖ ⥤ Dᵒᵖ` preserves finite coproducts, then `F.unop : C ⥤ D` preserves finite
241+
products. -/
242+
def preservesFiniteProductsUnop (F : Cᵒᵖ ⥤ Dᵒᵖ) [PreservesFiniteCoproducts F] :
243+
PreservesFiniteProducts F.unop where
244+
preserves J _ := by
245+
apply (config := { allowSynthFailures := true }) preservesLimitsOfShapeUnop
246+
exact preservesColimitsOfShapeOfEquiv (Discrete.opposite J).symm _
247+
248+
/-- If `F : C ⥤ D` preserves finite products, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves finite
249+
coproducts. -/
250+
def preservesFiniteCoproductsOp (F : C ⥤ D) [PreservesFiniteProducts F] :
251+
PreservesFiniteCoproducts F.op where
252+
preserves J _ := by
253+
apply (config := { allowSynthFailures := true }) preservesColimitsOfShapeOp
254+
exact preservesLimitsOfShapeOfEquiv (Discrete.opposite J).symm _
255+
256+
/-- If `F : C ⥤ Dᵒᵖ` preserves finite products, then `F.leftOp : Cᵒᵖ ⥤ D` preserves finite
257+
coproducts. -/
258+
def preservesFiniteCoproductsLeftOp (F : C ⥤ Dᵒᵖ) [PreservesFiniteProducts F] :
259+
PreservesFiniteCoproducts F.leftOp where
260+
preserves J _ := by
261+
apply (config := { allowSynthFailures := true }) preservesColimitsOfShapeLeftOp
262+
exact preservesLimitsOfShapeOfEquiv (Discrete.opposite J).symm _
263+
264+
/-- If `F : Cᵒᵖ ⥤ D` preserves finite products, then `F.rightOp : C ⥤ Dᵒᵖ` preserves finite
265+
coproducts. -/
266+
def preservesFiniteCoproductsRightOp (F : Cᵒᵖ ⥤ D) [PreservesFiniteProducts F] :
267+
PreservesFiniteCoproducts F.rightOp where
268+
preserves J _ := by
269+
apply (config := { allowSynthFailures := true }) preservesColimitsOfShapeRightOp
270+
exact preservesLimitsOfShapeOfEquiv (Discrete.opposite J).symm _
271+
272+
/-- If `F : Cᵒᵖ ⥤ Dᵒᵖ` preserves finite products, then `F.unop : C ⥤ D` preserves finite
273+
coproducts. -/
274+
def preservesFiniteCoproductsUnop (F : Cᵒᵖ ⥤ Dᵒᵖ) [PreservesFiniteProducts F] :
275+
PreservesFiniteCoproducts F.unop where
276+
preserves J _ := by
277+
apply (config := { allowSynthFailures := true }) preservesColimitsOfShapeUnop
278+
exact preservesLimitsOfShapeOfEquiv (Discrete.opposite J).symm _
227279

228280
end CategoryTheory.Limits

0 commit comments

Comments
 (0)