@@ -9,7 +9,7 @@ import Mathlib.CategoryTheory.Limits.Preserves.Finite
9
9
/-!
10
10
# Limit preservation properties of `functor.op` and related constructions
11
11
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 `
13
13
preserve certain (co)limits.
14
14
15
15
## Future work
@@ -28,26 +28,24 @@ open CategoryTheory
28
28
29
29
namespace CategoryTheory.Limits
30
30
31
- section
32
-
33
31
variable {C : Type u₁} [Category.{v₁} C] {D : Type u₂} [Category.{v₂} D]
34
32
variable {J : Type w} [Category.{w'} J]
35
33
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
37
35
limits of `K : J ⥤ Cᵒᵖ`. -/
38
36
def preservesLimitOp (K : J ⥤ Cᵒᵖ) (F : C ⥤ D) [PreservesColimit K.leftOp F] :
39
37
PreservesLimit K F.op where
40
38
preserves {_} hc :=
41
39
isLimitConeRightOpOfCocone _ (isColimitOfPreserves F (isColimitCoconeLeftOpOfCone _ hc))
42
40
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`
44
42
preserves limits of `K : J ⥤ Cᵒᵖ`. -/
45
43
def preservesLimitLeftOp (K : J ⥤ Cᵒᵖ) (F : C ⥤ Dᵒᵖ) [PreservesColimit K.leftOp F] :
46
44
PreservesLimit K F.leftOp where
47
45
preserves {_} hc :=
48
46
isLimitConeUnopOfCocone _ (isColimitOfPreserves F (isColimitCoconeLeftOpOfCone _ hc))
49
47
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
51
49
limits of `K : J ⥤ C`. -/
52
50
def preservesLimitRightOp (K : J ⥤ C) (F : Cᵒᵖ ⥤ D) [PreservesColimit K.op F] :
53
51
PreservesLimit K F.rightOp where
@@ -61,21 +59,21 @@ def preservesLimitUnop (K : J ⥤ C) (F : Cᵒᵖ ⥤ Dᵒᵖ) [PreservesColimit
61
59
preserves {_} hc :=
62
60
isLimitConeUnopOfCocone _ (isColimitOfPreserves F hc.op)
63
61
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
65
63
colimits of `K : J ⥤ Cᵒᵖ`. -/
66
64
def preservesColimitOp (K : J ⥤ Cᵒᵖ) (F : C ⥤ D) [PreservesLimit K.leftOp F] :
67
65
PreservesColimit K F.op where
68
66
preserves {_} hc :=
69
67
isColimitCoconeRightOpOfCone _ (isLimitOfPreserves F (isLimitConeLeftOpOfCocone _ hc))
70
68
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
72
70
colimits of `K : J ⥤ Cᵒᵖ`. -/
73
71
def preservesColimitLeftOp (K : J ⥤ Cᵒᵖ) (F : C ⥤ Dᵒᵖ) [PreservesLimit K.leftOp F] :
74
72
PreservesColimit K F.leftOp where
75
73
preserves {_} hc :=
76
74
isColimitCoconeUnopOfCone _ (isLimitOfPreserves F (isLimitConeLeftOpOfCocone _ hc))
77
75
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
79
77
colimits of `K : J ⥤ C`. -/
80
78
def preservesColimitRightOp (K : J ⥤ C) (F : Cᵒᵖ ⥤ D) [PreservesLimit K.op F] :
81
79
PreservesColimit K F.rightOp where
@@ -98,12 +96,12 @@ variable (J)
98
96
def preservesLimitsOfShapeOp (F : C ⥤ D) [PreservesColimitsOfShape Jᵒᵖ F] :
99
97
PreservesLimitsOfShape J F.op where preservesLimit {K} := preservesLimitOp K F
100
98
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
102
100
of shape `J`. -/
103
101
def preservesLimitsOfShapeLeftOp (F : C ⥤ Dᵒᵖ) [PreservesColimitsOfShape Jᵒᵖ F] :
104
102
PreservesLimitsOfShape J F.leftOp where preservesLimit {K} := preservesLimitLeftOp K F
105
103
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
107
105
of shape `J`. -/
108
106
def preservesLimitsOfShapeRightOp (F : Cᵒᵖ ⥤ D) [PreservesColimitsOfShape Jᵒᵖ F] :
109
107
PreservesLimitsOfShape J F.rightOp where preservesLimit {K} := preservesLimitRightOp K F
@@ -118,12 +116,12 @@ def preservesLimitsOfShapeUnop (F : Cᵒᵖ ⥤ Dᵒᵖ) [PreservesColimitsOfSha
118
116
def preservesColimitsOfShapeOp (F : C ⥤ D) [PreservesLimitsOfShape Jᵒᵖ F] :
119
117
PreservesColimitsOfShape J F.op where preservesColimit {K} := preservesColimitOp K F
120
118
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
122
120
of shape `J`. -/
123
121
def preservesColimitsOfShapeLeftOp (F : C ⥤ Dᵒᵖ) [PreservesLimitsOfShape Jᵒᵖ F] :
124
122
PreservesColimitsOfShape J F.leftOp where preservesColimit {K} := preservesColimitLeftOp K F
125
123
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
127
125
of shape `J`. -/
128
126
def preservesColimitsOfShapeRightOp (F : Cᵒᵖ ⥤ D) [PreservesLimitsOfShape Jᵒᵖ F] :
129
127
PreservesColimitsOfShape J F.rightOp where preservesColimit {K} := preservesColimitRightOp K F
@@ -139,11 +137,11 @@ end
139
137
def preservesLimitsOp (F : C ⥤ D) [PreservesColimits F] : PreservesLimits F.op where
140
138
preservesLimitsOfShape {_} _ := preservesLimitsOfShapeOp _ _
141
139
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. -/
143
141
def preservesLimitsLeftOp (F : C ⥤ Dᵒᵖ) [PreservesColimits F] : PreservesLimits F.leftOp where
144
142
preservesLimitsOfShape {_} _ := preservesLimitsOfShapeLeftOp _ _
145
143
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. -/
147
145
def preservesLimitsRightOp (F : Cᵒᵖ ⥤ D) [PreservesColimits F] : PreservesLimits F.rightOp where
148
146
preservesLimitsOfShape {_} _ := preservesLimitsOfShapeRightOp _ _
149
147
@@ -155,39 +153,31 @@ def preservesLimitsUnop (F : Cᵒᵖ ⥤ Dᵒᵖ) [PreservesColimits F] : Preser
155
153
def perservesColimitsOp (F : C ⥤ D) [PreservesLimits F] : PreservesColimits F.op where
156
154
preservesColimitsOfShape {_} _ := preservesColimitsOfShapeOp _ _
157
155
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. -/
159
157
def preservesColimitsLeftOp (F : C ⥤ Dᵒᵖ) [PreservesLimits F] : PreservesColimits F.leftOp where
160
158
preservesColimitsOfShape {_} _ := preservesColimitsOfShapeLeftOp _ _
161
159
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. -/
163
161
def preservesColimitsRightOp (F : Cᵒᵖ ⥤ D) [PreservesLimits F] : PreservesColimits F.rightOp where
164
162
preservesColimitsOfShape {_} _ := preservesColimitsOfShapeRightOp _ _
165
163
166
164
/-- If `F : Cᵒᵖ ⥤ Dᵒᵖ` preserves limits, then `F.unop : C ⥤ D` preserves colimits. -/
167
165
def preservesColimitsUnop (F : Cᵒᵖ ⥤ Dᵒᵖ) [PreservesLimits F] : PreservesColimits F.unop where
168
166
preservesColimitsOfShape {_} _ := preservesColimitsOfShapeUnop _ _
169
167
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
-
178
168
/-- If `F : C ⥤ D` preserves finite colimits, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves finite
179
169
limits. -/
180
170
def preservesFiniteLimitsOp (F : C ⥤ D) [PreservesFiniteColimits F] :
181
171
PreservesFiniteLimits F.op where
182
172
preservesFiniteLimits J (_ : SmallCategory J) _ := preservesLimitsOfShapeOp J F
183
173
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
185
175
limits. -/
186
176
def preservesFiniteLimitsLeftOp (F : C ⥤ Dᵒᵖ) [PreservesFiniteColimits F] :
187
177
PreservesFiniteLimits F.leftOp where
188
178
preservesFiniteLimits J (_ : SmallCategory J) _ := preservesLimitsOfShapeLeftOp J F
189
179
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
191
181
limits. -/
192
182
def preservesFiniteLimitsRightOp (F : Cᵒᵖ ⥤ D) [PreservesFiniteColimits F] :
193
183
PreservesFiniteLimits F.rightOp where
@@ -205,13 +195,13 @@ def preservesFiniteColimitsOp (F : C ⥤ D) [PreservesFiniteLimits F] :
205
195
PreservesFiniteColimits F.op where
206
196
preservesFiniteColimits J (_ : SmallCategory J) _ := preservesColimitsOfShapeOp J F
207
197
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
209
199
colimits. -/
210
200
def preservesFiniteColimitsLeftOp (F : C ⥤ Dᵒᵖ) [PreservesFiniteLimits F] :
211
201
PreservesFiniteColimits F.leftOp where
212
202
preservesFiniteColimits J (_ : SmallCategory J) _ := preservesColimitsOfShapeLeftOp J F
213
203
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
215
205
colimits. -/
216
206
def preservesFiniteColimitsRightOp (F : Cᵒᵖ ⥤ D) [PreservesFiniteLimits F] :
217
207
PreservesFiniteColimits F.rightOp where
@@ -223,6 +213,68 @@ def preservesFiniteColimitsUnop (F : Cᵒᵖ ⥤ Dᵒᵖ) [PreservesFiniteLimits
223
213
PreservesFiniteColimits F.unop where
224
214
preservesFiniteColimits J (_ : SmallCategory J) _ := preservesColimitsOfShapeUnop J F
225
215
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 _
227
279
228
280
end CategoryTheory.Limits
0 commit comments