@@ -33,13 +33,38 @@ def functoriality_is_left_adjoint :
33
33
counit := { app := λ c, { hom := adj.counit.app c.X } } } }
34
34
35
35
/-- A left adjoint preserves colimits. -/
36
- def left_adjoint_preserves_colimits : preserves_colimits F :=
36
+ instance left_adjoint_preserves_colimits : preserves_colimits F :=
37
37
{ preserves_colimits_of_shape := λ J 𝒥,
38
38
{ preserves_colimit := λ F,
39
39
by resetI; exact
40
40
{ preserves := λ c hc, is_colimit_iso_unique_cocone_morphism.inv
41
41
(λ s, (((adj.functoriality_is_left_adjoint _).adj).hom_equiv _ _).unique_of_equiv $
42
- is_colimit_iso_unique_cocone_morphism.hom hc _ ) } } }
42
+ is_colimit_iso_unique_cocone_morphism.hom hc _ ) } } }.
43
+
44
+ omit adj
45
+
46
+ -- TODO the implicit arguments make preserves_colimit* quite hard to use.
47
+ -- This should be refactored at some point. (Possibly including making `is_colimit` a class.)
48
+ def is_colimit_map_cocone (E : C ⥤ D) [is_equivalence E]
49
+ (c : cocone K) (h : is_colimit c) : is_colimit (E.map_cocone c) :=
50
+ begin
51
+ have P : preserves_colimits E := adjunction.left_adjoint_preserves_colimits E.adjunction,
52
+ have P' := P.preserves_colimits_of_shape,
53
+ have P'' := P'.preserves_colimit,
54
+ have P''' := P''.preserves,
55
+ exact P''' h,
56
+ end
57
+
58
+ instance has_colimit_comp_equivalence (E : C ⥤ D) [is_equivalence E] [has_colimit K] :
59
+ has_colimit (K ⋙ E) :=
60
+ { cocone := E.map_cocone (colimit.cocone K),
61
+ is_colimit := is_colimit_map_cocone _ _ _ (colimit.is_colimit K) }
62
+
63
+ def has_colimit_of_comp_equivalence (E : C ⥤ D) [is_equivalence E] [has_colimit (K ⋙ E)] :
64
+ has_colimit K :=
65
+ @has_colimit_of_iso _ _ _ _ (K ⋙ E ⋙ inv E) K
66
+ (@adjunction.has_colimit_comp_equivalence _ _ _ _ _ _ (K ⋙ E) (inv E) _ _)
67
+ ((functor.right_unitor _).symm ≪≫ (iso_whisker_left K (fun_inv_id E)).symm)
43
68
44
69
end preservation_colimits
45
70
@@ -55,13 +80,38 @@ def functoriality_is_right_adjoint :
55
80
counit := { app := λ c, { hom := adj.counit.app c.X, } } } }
56
81
57
82
/-- A right adjoint preserves limits. -/
58
- def right_adjoint_preserves_limits : preserves_limits G :=
83
+ instance right_adjoint_preserves_limits : preserves_limits G :=
59
84
{ preserves_limits_of_shape := λ J 𝒥,
60
85
{ preserves_limit := λ K,
61
86
by resetI; exact
62
87
{ preserves := λ c hc, is_limit_iso_unique_cone_morphism.inv
63
88
(λ s, (((adj.functoriality_is_right_adjoint _).adj).hom_equiv _ _).symm.unique_of_equiv $
64
- is_limit_iso_unique_cone_morphism.hom hc _) } } }
89
+ is_limit_iso_unique_cone_morphism.hom hc _) } } }.
90
+
91
+ omit adj
92
+
93
+ -- TODO the implicit arguments make preserves_limit* quite hard to use.
94
+ -- This should be refactored at some point. (Possibly including making `is_limit` a class.)
95
+ def is_limit_map_cone (E : D ⥤ C) [is_equivalence E]
96
+ (c : cone K) (h : is_limit c) : is_limit (E.map_cone c) :=
97
+ begin
98
+ have P : preserves_limits E := adjunction.right_adjoint_preserves_limits E.inv.adjunction,
99
+ have P' := P.preserves_limits_of_shape,
100
+ have P'' := P'.preserves_limit,
101
+ have P''' := P''.preserves,
102
+ exact P''' h,
103
+ end
104
+
105
+ instance has_limit_comp_equivalence (E : D ⥤ C) [is_equivalence E] [has_limit K] :
106
+ has_limit (K ⋙ E) :=
107
+ { cone := E.map_cone (limit.cone K),
108
+ is_limit := is_limit_map_cone _ _ _ (limit.is_limit K) }
109
+
110
+ def has_limit_of_comp_equivalence (E : D ⥤ C) [is_equivalence E] [has_limit (K ⋙ E)] :
111
+ has_limit K :=
112
+ @has_limit_of_iso _ _ _ _ (K ⋙ E ⋙ inv E) K
113
+ (@adjunction.has_limit_comp_equivalence _ _ _ _ _ _ (K ⋙ E) (inv E) _ _)
114
+ ((iso_whisker_left K (fun_inv_id E)) ≪≫ (functor.right_unitor _))
65
115
66
116
end preservation_limits
67
117
0 commit comments