@@ -33,94 +33,146 @@ instance op_epi_of_mono {A B : C} (f : A ⟶ B) [mono f] : epi f.op :=
33
33
⟨λ Z g h eq, quiver.hom.unop_inj ((cancel_mono f).1 (quiver.hom.op_inj eq))⟩
34
34
35
35
/--
36
- A split monomorphism is a morphism `f : X ⟶ Y` admitting a retraction `retraction f : Y ⟶ X`
36
+ A split monomorphism is a morphism `f : X ⟶ Y` with a given retraction `retraction f : Y ⟶ X`
37
37
such that `f ≫ retraction f = 𝟙 X`.
38
38
39
39
Every split monomorphism is a monomorphism.
40
40
-/
41
- @[ext]
42
- class split_mono {X Y : C} (f : X ⟶ Y) :=
41
+ @[ext, nolint has_nonempty_instance ]
42
+ structure split_mono {X Y : C} (f : X ⟶ Y) :=
43
43
(retraction : Y ⟶ X)
44
44
(id' : f ≫ retraction = 𝟙 X . obviously)
45
45
46
+ restate_axiom split_mono.id'
47
+ attribute [simp, reassoc] split_mono.id
48
+
49
+ /-- `is_split_mono f` is the assertion that `f` admits a retraction -/
50
+ class is_split_mono {X Y : C} (f : X ⟶ Y) : Prop :=
51
+ (exists_split_mono : nonempty (split_mono f))
52
+
53
+ /-- A constructor for `is_split_mono f` taking a `split_mono f` as an argument -/
54
+ lemma is_split_mono.mk' {X Y : C} {f : X ⟶ Y} (sm : split_mono f) :
55
+ is_split_mono f := ⟨nonempty.intro sm⟩
56
+
46
57
/--
47
- A split epimorphism is a morphism `f : X ⟶ Y` admitting a section `section_ f : Y ⟶ X`
58
+ A split epimorphism is a morphism `f : X ⟶ Y` with a given section `section_ f : Y ⟶ X`
48
59
such that `section_ f ≫ f = 𝟙 Y`.
49
60
(Note that `section` is a reserved keyword, so we append an underscore.)
50
61
51
62
Every split epimorphism is an epimorphism.
52
63
-/
53
- @[ext]
54
- class split_epi {X Y : C} (f : X ⟶ Y) :=
64
+ @[ext, nolint has_nonempty_instance ]
65
+ structure split_epi {X Y : C} (f : X ⟶ Y) :=
55
66
(section_ : Y ⟶ X)
56
67
(id' : section_ ≫ f = 𝟙 Y . obviously)
57
68
69
+ restate_axiom split_epi.id'
70
+ attribute [simp, reassoc] split_epi.id
71
+
72
+ /-- `is_split_epi f` is the assertion that `f` admits a section -/
73
+ class is_split_epi {X Y : C} (f : X ⟶ Y) : Prop :=
74
+ (exists_split_epi : nonempty (split_epi f))
75
+
76
+ /-- A constructor for `is_split_epi f` taking a `split_epi f` as an argument -/
77
+ lemma is_split_epi.mk' {X Y : C} {f : X ⟶ Y} (se : split_epi f) :
78
+ is_split_epi f := ⟨nonempty.intro se⟩
79
+
58
80
/-- The chosen retraction of a split monomorphism. -/
59
- def retraction {X Y : C} (f : X ⟶ Y) [split_mono f] : Y ⟶ X := split_mono.retraction f
81
+ noncomputable def retraction {X Y : C} (f : X ⟶ Y) [hf : is_split_mono f] : Y ⟶ X :=
82
+ hf.exists_split_mono.some.retraction
83
+
60
84
@[simp, reassoc]
61
- lemma split_mono.id {X Y : C} (f : X ⟶ Y) [split_mono f] : f ≫ retraction f = 𝟙 X :=
62
- split_mono.id'
85
+ lemma is_split_mono.id {X Y : C} (f : X ⟶ Y) [hf : is_split_mono f] : f ≫ retraction f = 𝟙 X :=
86
+ hf.exists_split_mono.some.id
87
+
88
+ /-- The retraction of a split monomorphism has an obvious section. -/
89
+ def split_mono.split_epi {X Y : C} {f : X ⟶ Y} (sm : split_mono f) : split_epi (sm.retraction) :=
90
+ { section_ := f, }
91
+
63
92
/-- The retraction of a split monomorphism is itself a split epimorphism. -/
64
- instance retraction_split_epi {X Y : C} (f : X ⟶ Y) [split_mono f] : split_epi (retraction f) :=
65
- { section_ := f }
93
+ instance retraction_is_split_epi {X Y : C} (f : X ⟶ Y) [hf : is_split_mono f] :
94
+ is_split_epi (retraction f) :=
95
+ is_split_epi.mk' (split_mono.split_epi _)
66
96
67
97
/-- A split mono which is epi is an iso. -/
68
- lemma is_iso_of_epi_of_split_mono {X Y : C} (f : X ⟶ Y) [split_mono f] [epi f] : is_iso f :=
98
+ lemma is_iso_of_epi_of_is_split_mono {X Y : C} (f : X ⟶ Y) [is_split_mono f] [epi f] : is_iso f :=
69
99
⟨⟨retraction f, ⟨by simp, by simp [← cancel_epi f]⟩⟩⟩
70
100
71
101
/--
72
102
The chosen section of a split epimorphism.
73
103
(Note that `section` is a reserved keyword, so we append an underscore.)
74
104
-/
75
- def section_ {X Y : C} (f : X ⟶ Y) [split_epi f] : Y ⟶ X := split_epi.section_ f
105
+ noncomputable def section_ {X Y : C} (f : X ⟶ Y) [hf : is_split_epi f] : Y ⟶ X :=
106
+ hf.exists_split_epi.some.section_
107
+
76
108
@[simp, reassoc]
77
- lemma split_epi.id {X Y : C} (f : X ⟶ Y) [split_epi f] : section_ f ≫ f = 𝟙 Y :=
78
- split_epi.id'
109
+ lemma is_split_epi.id {X Y : C} (f : X ⟶ Y) [hf : is_split_epi f] : section_ f ≫ f = 𝟙 Y :=
110
+ hf.exists_split_epi.some.id
111
+
112
+ /-- The section of a split epimorphism has an obvious retraction. -/
113
+ def split_epi.split_mono {X Y : C} {f : X ⟶ Y} (se : split_epi f) : split_mono (se.section_) :=
114
+ { retraction := f, }
115
+
79
116
/-- The section of a split epimorphism is itself a split monomorphism. -/
80
- instance section_split_mono {X Y : C} (f : X ⟶ Y) [split_epi f] : split_mono (section_ f) :=
81
- { retraction := f }
117
+ instance section_is_split_mono {X Y : C} (f : X ⟶ Y) [hf : is_split_epi f] :
118
+ is_split_mono (section_ f) :=
119
+ is_split_mono.mk' (split_epi.split_mono _)
82
120
83
121
/-- A split epi which is mono is an iso. -/
84
- lemma is_iso_of_mono_of_split_epi {X Y : C} (f : X ⟶ Y) [mono f] [split_epi f] : is_iso f :=
122
+ lemma is_iso_of_mono_of_is_split_epi {X Y : C} (f : X ⟶ Y) [mono f] [is_split_epi f] : is_iso f :=
85
123
⟨⟨section_ f, ⟨by simp [← cancel_mono f], by simp⟩⟩⟩
86
124
87
125
/-- Every iso is a split mono. -/
88
126
@[priority 100 ]
89
- noncomputable
90
- instance split_mono.of_iso {X Y : C} (f : X ⟶ Y) [is_iso f] : split_mono f :=
91
- { retraction := inv f }
127
+ instance is_split_mono.of_iso {X Y : C} (f : X ⟶ Y) [is_iso f] : is_split_mono f :=
128
+ is_split_mono.mk' { retraction := inv f }
92
129
93
130
/-- Every iso is a split epi. -/
94
131
@[priority 100 ]
95
- noncomputable
96
- instance split_epi.of_iso {X Y : C} (f : X ⟶ Y) [is_iso f] : split_epi f :=
97
- { section_ := inv f }
132
+ instance is_split_epi.of_iso {X Y : C} (f : X ⟶ Y) [is_iso f] : is_split_epi f :=
133
+ is_split_epi.mk' { section_ := inv f }
134
+
135
+ lemma split_mono.mono {X Y : C} {f : X ⟶ Y} (sm : split_mono f) : mono f :=
136
+ { right_cancellation := λ Z g h w, begin replace w := w =≫ sm.retraction, simpa using w, end }
98
137
99
138
/-- Every split mono is a mono. -/
100
139
@[priority 100 ]
101
- instance split_mono.mono {X Y : C} (f : X ⟶ Y) [split_mono f] : mono f :=
102
- { right_cancellation := λ Z g h w, begin replace w := w =≫ retraction f, simpa using w, end }
140
+ instance is_split_mono.mono {X Y : C} (f : X ⟶ Y) [hf : is_split_mono f] : mono f :=
141
+ hf.exists_split_mono.some.mono
142
+
143
+ lemma split_epi.epi {X Y : C} {f : X ⟶ Y} (se : split_epi f) : epi f :=
144
+ { left_cancellation := λ Z g h w, begin replace w := se.section_ ≫= w, simpa using w, end }
103
145
104
146
/-- Every split epi is an epi. -/
105
147
@[priority 100 ]
106
- instance split_epi.epi {X Y : C} (f : X ⟶ Y) [split_epi f] : epi f :=
107
- { left_cancellation := λ Z g h w, begin replace w := section_ f ≫= w, simpa using w, end }
148
+ instance is_split_epi.epi {X Y : C} (f : X ⟶ Y) [hf : is_split_epi f] : epi f :=
149
+ hf.exists_split_epi.some.epi
150
+
151
+ /-- Every split mono whose retraction is mono is an iso. -/
152
+ lemma is_iso.of_mono_retraction' {X Y : C} {f : X ⟶ Y} (hf : split_mono f)
153
+ [mono $ hf.retraction] : is_iso f :=
154
+ ⟨⟨hf.retraction, ⟨by simp, (cancel_mono_id $ hf.retraction).mp (by simp)⟩⟩⟩
108
155
109
156
/-- Every split mono whose retraction is mono is an iso. -/
110
- lemma is_iso.of_mono_retraction {X Y : C} { f : X ⟶ Y} [split_mono f] [mono $ retraction f]
111
- : is_iso f :=
112
- ⟨⟨retraction f, ⟨ by simp, (cancel_mono_id $ retraction f).mp ( by simp)⟩⟩⟩
157
+ lemma is_iso.of_mono_retraction {X Y : C} ( f : X ⟶ Y) [hf : is_split_mono f]
158
+ [hf' : mono $ retraction f] : is_iso f :=
159
+ @is_iso.of_mono_retraction' _ _ _ _ _ hf.exists_split_mono.some hf'
113
160
114
161
/-- Every split epi whose section is epi is an iso. -/
115
- lemma is_iso.of_epi_section {X Y : C} {f : X ⟶ Y} [split_epi f] [epi $ section_ f]
116
- : is_iso f :=
117
- ⟨⟨section_ f, ⟨(cancel_epi_id $ section_ f).mp (by simp), by simp⟩⟩⟩
162
+ lemma is_iso.of_epi_section' {X Y : C} {f : X ⟶ Y} (hf : split_epi f)
163
+ [epi $ hf.section_] : is_iso f :=
164
+ ⟨⟨hf.section_, ⟨(cancel_epi_id $ hf.section_).mp (by simp), by simp⟩⟩⟩
165
+
166
+ /-- Every split epi whose section is epi is an iso. -/
167
+ lemma is_iso.of_epi_section {X Y : C} (f : X ⟶ Y) [hf : is_split_epi f]
168
+ [hf' : epi $ section_ f] : is_iso f :=
169
+ @is_iso.of_epi_section' _ _ _ _ _ hf.exists_split_epi.some hf'
118
170
119
171
/-- A category where every morphism has a `trunc` retraction is computably a groupoid. -/
120
172
-- FIXME this has unnecessarily become noncomputable!
121
173
noncomputable
122
174
def groupoid.of_trunc_split_mono
123
- (all_split_mono : ∀ {X Y : C} (f : X ⟶ Y), trunc (split_mono f)) :
175
+ (all_split_mono : ∀ {X Y : C} (f : X ⟶ Y), trunc (is_split_mono f)) :
124
176
groupoid.{v₁} C :=
125
177
begin
126
178
apply groupoid.of_is_iso,
@@ -135,36 +187,48 @@ variables (C)
135
187
136
188
/-- A split mono category is a category in which every monomorphism is split. -/
137
189
class split_mono_category :=
138
- (split_mono_of_mono : ∀ {X Y : C} (f : X ⟶ Y) [mono f], split_mono f)
190
+ (is_split_mono_of_mono : ∀ {X Y : C} (f : X ⟶ Y) [mono f], is_split_mono f)
139
191
140
192
/-- A split epi category is a category in which every epimorphism is split. -/
141
193
class split_epi_category :=
142
- (split_epi_of_epi : ∀ {X Y : C} (f : X ⟶ Y) [epi f], split_epi f)
194
+ (is_split_epi_of_epi : ∀ {X Y : C} (f : X ⟶ Y) [epi f], is_split_epi f)
143
195
144
196
end
145
197
146
198
/-- In a category in which every monomorphism is split, every monomorphism splits. This is not an
147
199
instance because it would create an instance loop. -/
148
- def split_mono_of_mono [split_mono_category C] {X Y : C} (f : X ⟶ Y) [mono f] : split_mono f :=
149
- split_mono_category.split_mono_of_mono _
200
+ lemma is_split_mono_of_mono [split_mono_category C] {X Y : C} (f : X ⟶ Y) [mono f] :
201
+ is_split_mono f :=
202
+ split_mono_category.is_split_mono_of_mono _
150
203
151
204
/-- In a category in which every epimorphism is split, every epimorphism splits. This is not an
152
205
instance because it would create an instance loop. -/
153
- def split_epi_of_epi [split_epi_category C] {X Y : C} (f : X ⟶ Y) [epi f] : split_epi f :=
154
- split_epi_category.split_epi_of_epi _
206
+ lemma is_split_epi_of_epi [split_epi_category C] {X Y : C} (f : X ⟶ Y) [epi f] :
207
+ is_split_epi f := split_epi_category.is_split_epi_of_epi _
155
208
156
209
section
157
210
variables {D : Type u₂} [category.{v₂} D]
158
211
159
212
/-- Split monomorphisms are also absolute monomorphisms. -/
160
- instance {X Y : C} (f : X ⟶ Y) [split_mono f] (F : C ⥤ D) : split_mono (F.map f) :=
161
- { retraction := F.map (retraction f),
213
+ @[simps]
214
+ def split_mono.map {X Y : C} {f : X ⟶ Y} (sm : split_mono f) (F : C ⥤ D ) :
215
+ split_mono (F.map f) :=
216
+ { retraction := F.map (sm.retraction),
162
217
id' := by { rw [←functor.map_comp, split_mono.id, functor.map_id], } }
163
218
164
219
/-- Split epimorphisms are also absolute epimorphisms. -/
165
- instance {X Y : C} (f : X ⟶ Y) [split_epi f] (F : C ⥤ D) : split_epi (F.map f) :=
166
- { section_ := F.map (section_ f),
220
+ @[simps]
221
+ def split_epi.map {X Y : C} {f : X ⟶ Y} (se : split_epi f) (F : C ⥤ D ) :
222
+ split_epi (F.map f) :=
223
+ { section_ := F.map (se.section_),
167
224
id' := by { rw [←functor.map_comp, split_epi.id, functor.map_id], } }
225
+
226
+ instance {X Y : C} (f : X ⟶ Y) [hf : is_split_mono f] (F : C ⥤ D) : is_split_mono (F.map f) :=
227
+ is_split_mono.mk' (hf.exists_split_mono.some.map F)
228
+
229
+ instance {X Y : C} (f : X ⟶ Y) [hf : is_split_epi f] (F : C ⥤ D) : is_split_epi (F.map f) :=
230
+ is_split_epi.mk' (hf.exists_split_epi.some.map F)
231
+
168
232
end
169
233
170
234
end category_theory
0 commit comments