@@ -33,94 +33,146 @@ instance op_epi_of_mono {A B : C} (f : A ⟶ B) [mono f] : epi f.op :=
3333⟨λ Z g h eq, quiver.hom.unop_inj ((cancel_mono f).1 (quiver.hom.op_inj eq))⟩
3434
3535/--
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`
3737such that `f ≫ retraction f = 𝟙 X`.
3838
3939Every split monomorphism is a monomorphism.
4040-/
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) :=
4343(retraction : Y ⟶ X)
4444(id' : f ≫ retraction = 𝟙 X . obviously)
4545
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+
4657/--
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`
4859such that `section_ f ≫ f = 𝟙 Y`.
4960(Note that `section` is a reserved keyword, so we append an underscore.)
5061
5162Every split epimorphism is an epimorphism.
5263-/
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) :=
5566(section_ : Y ⟶ X)
5667(id' : section_ ≫ f = 𝟙 Y . obviously)
5768
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+
5880/-- 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+
6084@[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+
6392/-- 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 _)
6696
6797/-- 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 :=
6999⟨⟨retraction f, ⟨by simp, by simp [← cancel_epi f]⟩⟩⟩
70100
71101/--
72102The chosen section of a split epimorphism.
73103(Note that `section` is a reserved keyword, so we append an underscore.)
74104-/
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+
76108@[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+
79116/-- 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 _)
82120
83121/-- 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 :=
85123⟨⟨section_ f, ⟨by simp [← cancel_mono f], by simp⟩⟩⟩
86124
87125/-- Every iso is a split mono. -/
88126@[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 }
92129
93130/-- Every iso is a split epi. -/
94131@[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 }
98137
99138/-- Every split mono is a mono. -/
100139@[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 }
103145
104146/-- Every split epi is an epi. -/
105147@[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)⟩⟩⟩
108155
109156/-- 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'
113160
114161/-- 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'
118170
119171/-- A category where every morphism has a `trunc` retraction is computably a groupoid. -/
120172-- FIXME this has unnecessarily become noncomputable!
121173noncomputable
122174def 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)) :
124176 groupoid.{v₁} C :=
125177begin
126178 apply groupoid.of_is_iso,
@@ -135,36 +187,48 @@ variables (C)
135187
136188/-- A split mono category is a category in which every monomorphism is split. -/
137189class 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)
139191
140192/-- A split epi category is a category in which every epimorphism is split. -/
141193class 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)
143195
144196end
145197
146198/-- In a category in which every monomorphism is split, every monomorphism splits. This is not an
147199 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 _
150203
151204/-- In a category in which every epimorphism is split, every epimorphism splits. This is not an
152205 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 _
155208
156209section
157210variables {D : Type u₂} [category.{v₂} D]
158211
159212/-- 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),
162217 id' := by { rw [←functor.map_comp, split_mono.id, functor.map_id], } }
163218
164219/-- 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_),
167224 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+
168232end
169233
170234end category_theory
0 commit comments