Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 9ed4366

Browse files
committed
feat(category_theory/limits): limit preservation properties of functor.left_op and similar (#12168)
1 parent 900ce6f commit 9ed4366

File tree

1 file changed

+233
-0
lines changed

1 file changed

+233
-0
lines changed
Lines changed: 233 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,233 @@
1+
/-
2+
Copyright (c) 2022 Markus Himmel. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Markus Himmel
5+
-/
6+
import category_theory.limits.opposites
7+
import category_theory.limits.preserves.finite
8+
9+
/-!
10+
# Limit preservation properties of `functor.op` and related constructions
11+
12+
We formulate conditions about `F` which imply that `F.op`, `F.unop`, `F.left_op` and `F.right_op`
13+
preserve certain (co)limits.
14+
15+
## Future work
16+
17+
* Dually, it is possible to formulate conditions about `F.op` ec. for `F` to preserve certain
18+
(co)limits.
19+
20+
-/
21+
22+
universes w w' v₁ v₂ u₁ u₂
23+
24+
noncomputable theory
25+
26+
open category_theory
27+
28+
namespace category_theory.limits
29+
30+
section
31+
variables {C : Type u₁} [category.{v₁} C] {D : Type u₂} [category.{v₂} D]
32+
variables {J : Type w} [category.{w'} J]
33+
34+
/-- If `F : C ⥤ D` preserves colimits of `K.left_op : Jᵒᵖ ⥤ C`, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves
35+
limits of `K : J ⥤ Cᵒᵖ`. -/
36+
def preserves_limit_op (K : J ⥤ Cᵒᵖ) (F : C ⥤ D) [preserves_colimit K.left_op F] :
37+
preserves_limit K F.op :=
38+
{ preserves := λ c hc, is_limit_cone_right_op_of_cocone _
39+
(is_colimit_of_preserves F (is_colimit_cocone_left_op_of_cone _ hc)) }
40+
41+
/-- If `F : C ⥤ Dᵒᵖ` preserves colimits of `K.left_op : Jᵒᵖ ⥤ C`, then `F.left_op : Cᵒᵖ ⥤ D`
42+
preserves limits of `K : J ⥤ Cᵒᵖ`. -/
43+
def preserves_limit_left_op (K : J ⥤ Cᵒᵖ) (F : C ⥤ Dᵒᵖ) [preserves_colimit K.left_op F] :
44+
preserves_limit K F.left_op :=
45+
{ preserves := λ c hc, is_limit_cone_unop_of_cocone _
46+
(is_colimit_of_preserves F (is_colimit_cocone_left_op_of_cone _ hc)) }
47+
48+
/-- If `F : Cᵒᵖ ⥤ D` preserves colimits of `K.op : Jᵒᵖ ⥤ Cᵒᵖ`, then `F.right_op : C ⥤ Dᵒᵖ` preserves
49+
limits of `K : J ⥤ C`. -/
50+
def preserves_limit_right_op (K : J ⥤ C) (F : Cᵒᵖ ⥤ D) [preserves_colimit K.op F] :
51+
preserves_limit K F.right_op :=
52+
{ preserves := λ c hc, is_limit_cone_right_op_of_cocone _
53+
(is_colimit_of_preserves F (is_colimit_cone_op _ hc)) }
54+
55+
/-- If `F : Cᵒᵖ ⥤ Dᵒᵖ` preserves colimits of `K.op : Jᵒᵖ ⥤ Cᵒᵖ`, then `F.unop : C ⥤ D` preserves
56+
limits of `K : J ⥤ C`. -/
57+
def preserves_limit_unop (K : J ⥤ C) (F : Cᵒᵖ ⥤ Dᵒᵖ) [preserves_colimit K.op F] :
58+
preserves_limit K F.unop :=
59+
{ preserves := λ c hc, is_limit_cone_unop_of_cocone _
60+
(is_colimit_of_preserves F (is_colimit_cone_op _ hc)) }
61+
62+
/-- If `F : C ⥤ D` preserves limits of `K.left_op : Jᵒᵖ ⥤ C`, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves
63+
colimits of `K : J ⥤ Cᵒᵖ`. -/
64+
def preserves_colimit_op (K : J ⥤ Cᵒᵖ) (F : C ⥤ D) [preserves_limit K.left_op F] :
65+
preserves_colimit K F.op :=
66+
{ preserves := λ c hc, is_colimit_cocone_right_op_of_cone _
67+
(is_limit_of_preserves F (is_limit_cone_left_op_of_cocone _ hc)) }
68+
69+
/-- If `F : C ⥤ Dᵒᵖ` preserves limits of `K.left_op : Jᵒᵖ ⥤ C`, then `F.left_op : Cᵒᵖ ⥤ D` preserves
70+
colimits of `K : J ⥤ Cᵒᵖ`. -/
71+
def preserves_colimit_left_op (K : J ⥤ Cᵒᵖ) (F : C ⥤ Dᵒᵖ) [preserves_limit K.left_op F] :
72+
preserves_colimit K F.left_op :=
73+
{ preserves := λ c hc, is_colimit_cocone_unop_of_cone _
74+
(is_limit_of_preserves F (is_limit_cone_left_op_of_cocone _ hc)) }
75+
76+
/-- If `F : Cᵒᵖ ⥤ D` preserves limits of `K.op : Jᵒᵖ ⥤ Cᵒᵖ`, then `F.right_op : C ⥤ Dᵒᵖ` preserves
77+
colimits of `K : J ⥤ C`. -/
78+
def preserves_colimit_right_op (K : J ⥤ C) (F : Cᵒᵖ ⥤ D) [preserves_limit K.op F] :
79+
preserves_colimit K F.right_op :=
80+
{ preserves := λ c hc, is_colimit_cocone_right_op_of_cone _
81+
(is_limit_of_preserves F (is_limit_cocone_op _ hc)) }
82+
83+
/-- If `F : Cᵒᵖ ⥤ Dᵒᵖ` preserves limits of `K.op : Jᵒᵖ ⥤ Cᵒᵖ`, then `F.unop : C ⥤ D` preserves
84+
colimits of `K : J ⥤ C`. -/
85+
def preserves_colimit_unop (K : J ⥤ C) (F : Cᵒᵖ ⥤ Dᵒᵖ) [preserves_limit K.op F] :
86+
preserves_colimit K F.unop :=
87+
{ preserves := λ c hc, is_colimit_cocone_unop_of_cone _
88+
(is_limit_of_preserves F (is_limit_cocone_op _ hc)) }
89+
90+
section
91+
variables (J)
92+
93+
/-- If `F : C ⥤ D` preserves colimits of shape `Jᵒᵖ`, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves limits of
94+
shape `J`. -/
95+
def preserves_limits_of_shape_op (F : C ⥤ D) [preserves_colimits_of_shape Jᵒᵖ F] :
96+
preserves_limits_of_shape J F.op :=
97+
{ preserves_limit := λ K, preserves_limit_op K F }
98+
99+
/-- If `F : C ⥤ Dᵒᵖ` preserves colimits of shape `Jᵒᵖ`, then `F.left_op : Cᵒᵖ ⥤ D` preserves limits
100+
of shape `J`. -/
101+
def preserves_limits_of_shape_left_op (F : C ⥤ Dᵒᵖ) [preserves_colimits_of_shape Jᵒᵖ F] :
102+
preserves_limits_of_shape J F.left_op :=
103+
{ preserves_limit := λ K, preserves_limit_left_op K F }
104+
105+
/-- If `F : Cᵒᵖ ⥤ D` preserves colimits of shape `Jᵒᵖ`, then `F.right_op : C ⥤ Dᵒᵖ` preserves limits
106+
of shape `J`. -/
107+
def preserves_limits_of_shape_right_op (F : Cᵒᵖ ⥤ D) [preserves_colimits_of_shape Jᵒᵖ F] :
108+
preserves_limits_of_shape J F.right_op :=
109+
{ preserves_limit := λ K, preserves_limit_right_op K F }
110+
111+
/-- If `F : Cᵒᵖ ⥤ Dᵒᵖ` preserves colimits of shape `Jᵒᵖ`, then `F.unop : C ⥤ D` preserves limits of
112+
shape `J`. -/
113+
def preserves_limits_of_shape_unop (F : Cᵒᵖ ⥤ Dᵒᵖ) [preserves_colimits_of_shape Jᵒᵖ F] :
114+
preserves_limits_of_shape J F.unop :=
115+
{ preserves_limit := λ K, preserves_limit_unop K F }
116+
117+
/-- If `F : C ⥤ D` preserves limits of shape `Jᵒᵖ`, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves colimits of
118+
shape `J`. -/
119+
def preserves_colimits_of_shape_op (F : C ⥤ D) [preserves_limits_of_shape Jᵒᵖ F] :
120+
preserves_colimits_of_shape J F.op :=
121+
{ preserves_colimit := λ K, preserves_colimit_op K F }
122+
123+
/-- If `F : C ⥤ Dᵒᵖ` preserves limits of shape `Jᵒᵖ`, then `F.left_op : Cᵒᵖ ⥤ D` preserves colimits
124+
of shape `J`. -/
125+
def preserves_colimits_of_shape_left_op (F : C ⥤ Dᵒᵖ) [preserves_limits_of_shape Jᵒᵖ F] :
126+
preserves_colimits_of_shape J F.left_op :=
127+
{ preserves_colimit := λ K, preserves_colimit_left_op K F }
128+
129+
/-- If `F : Cᵒᵖ ⥤ D` preserves limits of shape `Jᵒᵖ`, then `F.right_op : C ⥤ Dᵒᵖ` preserves colimits
130+
of shape `J`. -/
131+
def preserves_colimits_of_shape_right_op (F : Cᵒᵖ ⥤ D) [preserves_limits_of_shape Jᵒᵖ F] :
132+
preserves_colimits_of_shape J F.right_op :=
133+
{ preserves_colimit := λ K, preserves_colimit_right_op K F }
134+
135+
/-- If `F : Cᵒᵖ ⥤ Dᵒᵖ` preserves limits of shape `Jᵒᵖ`, then `F.unop : C ⥤ D` preserves colimits
136+
of shape `J`. -/
137+
def preserves_colimits_of_shape_unop (F : Cᵒᵖ ⥤ Dᵒᵖ) [preserves_limits_of_shape Jᵒᵖ F] :
138+
preserves_colimits_of_shape J F.unop :=
139+
{ preserves_colimit := λ K, preserves_colimit_unop K F }
140+
141+
end
142+
143+
/-- If `F : C ⥤ D` preserves colimits, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves limits. -/
144+
def preserves_limits_op (F : C ⥤ D) [preserves_colimits F] : preserves_limits F.op :=
145+
{ preserves_limits_of_shape := λ J _, by exactI preserves_limits_of_shape_op J F }
146+
147+
/-- If `F : C ⥤ Dᵒᵖ` preserves colimits, then `F.left_op : Cᵒᵖ ⥤ D` preserves limits. -/
148+
def preserves_limits_left_op (F : C ⥤ Dᵒᵖ) [preserves_colimits F] : preserves_limits F.left_op :=
149+
{ preserves_limits_of_shape := λ J _, by exactI preserves_limits_of_shape_left_op J F }
150+
151+
/-- If `F : Cᵒᵖ ⥤ D` preserves colimits, then `F.right_op : C ⥤ Dᵒᵖ` preserves limits. -/
152+
def preserves_limits_right_op (F : Cᵒᵖ ⥤ D) [preserves_colimits F] : preserves_limits F.right_op :=
153+
{ preserves_limits_of_shape := λ J _, by exactI preserves_limits_of_shape_right_op J F }
154+
155+
/-- If `F : Cᵒᵖ ⥤ Dᵒᵖ` preserves colimits, then `F.unop : C ⥤ D` preserves limits. -/
156+
def preserves_limits_unop (F : Cᵒᵖ ⥤ Dᵒᵖ) [preserves_colimits F] : preserves_limits F.unop :=
157+
{ preserves_limits_of_shape := λ J _, by exactI preserves_limits_of_shape_unop J F }
158+
159+
/-- If `F : C ⥤ D` preserves limits, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves colimits. -/
160+
def perserves_colimits_op (F : C ⥤ D) [preserves_limits F] : preserves_colimits F.op :=
161+
{ preserves_colimits_of_shape := λ J _, by exactI preserves_colimits_of_shape_op J F }
162+
163+
/-- If `F : C ⥤ Dᵒᵖ` preserves limits, then `F.left_op : Cᵒᵖ ⥤ D` preserves colimits. -/
164+
def preserves_colimits_left_op (F : C ⥤ Dᵒᵖ) [preserves_limits F] : preserves_colimits F.left_op :=
165+
{ preserves_colimits_of_shape := λ J _, by exactI preserves_colimits_of_shape_left_op J F }
166+
167+
/-- If `F : Cᵒᵖ ⥤ D` preserves limits, then `F.right_op : C ⥤ Dᵒᵖ` preserves colimits. -/
168+
def preserves_colimits_right_op (F : Cᵒᵖ ⥤ D) [preserves_limits F] :
169+
preserves_colimits F.right_op :=
170+
{ preserves_colimits_of_shape := λ J _, by exactI preserves_colimits_of_shape_right_op J F }
171+
172+
/-- If `F : Cᵒᵖ ⥤ Dᵒᵖ` preserves limits, then `F.unop : C ⥤ D` preserves colimits. -/
173+
def preserves_colimits_unop (F : Cᵒᵖ ⥤ Dᵒᵖ) [preserves_limits F] : preserves_colimits F.unop :=
174+
{ preserves_colimits_of_shape := λ J _, by exactI preserves_colimits_of_shape_unop J F }
175+
176+
end
177+
178+
section
179+
-- Preservation of finite (colimits) is only defined when the morphisms of C and D live in the same
180+
-- universe.
181+
variables {C : Type u₁} [category.{v₁} C] {D : Type u₂} [category.{v₁} D]
182+
183+
/-- If `F : C ⥤ D` preserves finite colimits, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves finite
184+
limits. -/
185+
def preserves_finite_limits_op (F : C ⥤ D) [preserves_finite_colimits F] :
186+
preserves_finite_limits F.op :=
187+
{ preserves_finite_limits := λ J _ _, by exactI preserves_limits_of_shape_op J F }
188+
189+
/-- If `F : C ⥤ Dᵒᵖ` preserves finite colimits, then `F.left_op : Cᵒᵖ ⥤ D` preserves finite
190+
limits. -/
191+
def preserves_finite_limits_left_op (F : C ⥤ Dᵒᵖ) [preserves_finite_colimits F] :
192+
preserves_finite_limits F.left_op :=
193+
{ preserves_finite_limits := λ J _ _, by exactI preserves_limits_of_shape_left_op J F }
194+
195+
/-- If `F : Cᵒᵖ ⥤ D` preserves finite colimits, then `F.right_op : C ⥤ Dᵒᵖ` preserves finite
196+
limits. -/
197+
def preserves_finite_limits_right_op (F : Cᵒᵖ ⥤ D) [preserves_finite_colimits F] :
198+
preserves_finite_limits F.right_op :=
199+
{ preserves_finite_limits := λ J _ _, by exactI preserves_limits_of_shape_right_op J F }
200+
201+
/-- If `F : Cᵒᵖ ⥤ Dᵒᵖ` preserves finite colimits, then `F.unop : C ⥤ D` preserves finite
202+
limits. -/
203+
def preserves_finite_limits_unop (F : Cᵒᵖ ⥤ Dᵒᵖ) [preserves_finite_colimits F] :
204+
preserves_finite_limits F.unop :=
205+
{ preserves_finite_limits := λ J _ _, by exactI preserves_limits_of_shape_unop J F }
206+
207+
/-- If `F : C ⥤ D` preserves finite limits, then `F.op : Cᵒᵖ ⥤ Dᵒᵖ` preserves finite
208+
colimits. -/
209+
def preserves_finite_colimits_op (F : C ⥤ D) [preserves_finite_limits F] :
210+
preserves_finite_colimits F.op :=
211+
{ preserves_finite_colimits := λ J _ _, by exactI preserves_colimits_of_shape_op J F }
212+
213+
/-- If `F : C ⥤ Dᵒᵖ` preserves finite limits, then `F.left_op : Cᵒᵖ ⥤ D` preserves finite
214+
colimits. -/
215+
def preserves_finite_colimits_left_op (F : C ⥤ Dᵒᵖ) [preserves_finite_limits F] :
216+
preserves_finite_colimits F.left_op :=
217+
{ preserves_finite_colimits := λ J _ _, by exactI preserves_colimits_of_shape_left_op J F }
218+
219+
/-- If `F : Cᵒᵖ ⥤ D` preserves finite limits, then `F.right_op : C ⥤ Dᵒᵖ` preserves finite
220+
colimits. -/
221+
def preserves_finite_colimits_right_op (F : Cᵒᵖ ⥤ D) [preserves_finite_limits F] :
222+
preserves_finite_colimits F.right_op :=
223+
{ preserves_finite_colimits := λ J _ _, by exactI preserves_colimits_of_shape_right_op J F }
224+
225+
/-- If `F : Cᵒᵖ ⥤ Dᵒᵖ` preserves finite limits, then `F.unop : C ⥤ D` preserves finite
226+
colimits. -/
227+
def preserves_finite_colimits_unop (F : Cᵒᵖ ⥤ Dᵒᵖ) [preserves_finite_limits F] :
228+
preserves_finite_colimits F.unop :=
229+
{ preserves_finite_colimits := λ J _ _, by exactI preserves_colimits_of_shape_unop J F }
230+
231+
end
232+
233+
end category_theory.limits

0 commit comments

Comments
 (0)