@@ -30,8 +30,8 @@ Each of these has a dual.
30
30
## Main statements
31
31
32
32
* `equalizer.ι_mono` states that every equalizer map is a monomorphism
33
- * `is_iso_limit_cone_parallel_pair_of_self` states that the identity on the domain of `f` is an equalizer
34
- of `f` and `f`.
33
+ * `is_iso_limit_cone_parallel_pair_of_self` states that the identity on the domain of `f` is an
34
+ equalizer of `f` and `f`.
35
35
36
36
## Implementation notes
37
37
As with the other special shapes in the limits library, all the definitions here are given as
@@ -138,6 +138,19 @@ abbreviation cofork (f g : X ⟶ Y) := cocone (parallel_pair f g)
138
138
139
139
variables {f g : X ⟶ Y}
140
140
141
+ /-- A fork `t` on the parallel pair `f g : X ⟶ Y` consists of two morphisms `t.π.app zero : t.X ⟶ X`
142
+ and `t.π.app one : t.X ⟶ Y`. Of these, only the first one is interesting, and we give it the
143
+ shorter name `fork.ι t`. -/
144
+ abbreviation fork.ι (t : fork f g) := t.π.app zero
145
+
146
+ /-- A cofork `t` on the parallel_pair `f g : X ⟶ Y` consists of two morphisms
147
+ `t.ι.app zero : X ⟶ t.X` and `t.ι.app one : Y ⟶ t.X`. Of these, only the second one is
148
+ interesting, and we give it the shorter name `cofork.π t`. -/
149
+ abbreviation cofork.π (t : cofork f g) := t.ι.app one
150
+
151
+ @[simp] lemma fork.ι_eq_app_zero (t : fork f g) : t.ι = t.π.app zero := rfl
152
+ @[simp] lemma cofork.π_eq_app_one (t : cofork f g) : t.π = t.ι.app one := rfl
153
+
141
154
@[simp, reassoc] lemma fork.app_zero_left (s : fork f g) :
142
155
s.π.app zero ≫ f = s.π.app one :=
143
156
by rw [←s.w left, parallel_pair_map_left]
@@ -175,38 +188,19 @@ def fork.of_ι {P : C} (ι : P ⟶ X) (w : ι ≫ f = ι ≫ g) : fork f g :=
175
188
def cofork.of_π {P : C} (π : Y ⟶ P) (w : f ≫ π = g ≫ π) : cofork f g :=
176
189
{ X := P,
177
190
ι :=
178
- { app := λ X, begin cases X, exact f ≫ π, exact π, end ,
179
- naturality' := λ X Y f,
180
- begin
181
- cases X; cases Y; cases f; dsimp; simp,
182
- { dsimp, simp, },
183
- { exact w.symm },
184
- { dsimp, simp, },
185
- end } }
186
-
187
- /-- A fork `t` on the parallel pair `f g : X ⟶ Y` consists of two morphisms `t.π.app zero : t.X ⟶ X`
188
- and `t.π.app one : t.X ⟶ Y`. Of these, only the first one is interesting, and we give it the
189
- shorter name `fork.ι t`. -/
190
- abbreviation fork.ι (t : fork f g) := t.π.app zero
191
-
192
- /-- A cofork `t` on the parallel_pair `f g : X ⟶ Y` consists of two morphisms
193
- `t.ι.app zero : X ⟶ t.X` and `t.ι.app one : Y ⟶ t.X`. Of these, only the second one is
194
- interesting, and we give it the shorter name `cofork.π t`. -/
195
- abbreviation cofork.π (t : cofork f g) := t.ι.app one
191
+ { app := λ X, walking_parallel_pair.cases_on X (f ≫ π) π,
192
+ naturality' := λ i j f, by { cases f; dsimp; simp [w] } } } -- See note [dsimp, simp]
196
193
197
- @[simp] lemma fork.ι_of_ι {P : C} (ι : P ⟶ X) (w : ι ≫ f = ι ≫ g) :
198
- fork.ι (fork.of_ι ι w) = ι := rfl
199
- @[simp] lemma cofork.π_of_π {P : C} (π : Y ⟶ P) (w : f ≫ π = g ≫ π) :
200
- cofork.π (cofork.of_π π w) = π := rfl
201
-
202
- lemma fork.ι_eq_app_zero (t : fork f g) : fork.ι t = t.π.app zero := rfl
203
- lemma cofork.π_eq_app_one (t : cofork f g) : cofork.π t = t.ι.app one := rfl
194
+ lemma fork.ι_of_ι {P : C} (ι : P ⟶ X) (w : ι ≫ f = ι ≫ g) :
195
+ (fork.of_ι ι w).ι = ι := rfl
196
+ lemma cofork.π_of_π {P : C} (π : Y ⟶ P) (w : f ≫ π = g ≫ π) :
197
+ (cofork.of_π π w).π = π := rfl
204
198
205
199
@[reassoc]
206
- lemma fork.condition (t : fork f g) : fork .ι t ≫ f = fork.ι t ≫ g :=
200
+ lemma fork.condition (t : fork f g) : t .ι ≫ f = t.ι ≫ g :=
207
201
by rw [t.app_zero_left, t.app_zero_right]
208
202
@[reassoc]
209
- lemma cofork.condition (t : cofork f g) : f ≫ cofork .π t = g ≫ cofork.π t :=
203
+ lemma cofork.condition (t : cofork f g) : f ≫ t .π = g ≫ t.π :=
210
204
by rw [t.left_app_one, t.right_app_one]
211
205
212
206
/-- To check whether two maps are equalized by both maps of a fork, it suffices to check it for the
@@ -735,26 +729,18 @@ variables {C} [split_mono f]
735
729
A split mono `f` equalizes `(retraction f ≫ f)` and `(𝟙 Y)`.
736
730
Here we build the cone, and show in `split_mono_equalizes` that it is a limit cone.
737
731
-/
732
+ @[simps {rhs_md := semireducible}]
738
733
def cone_of_split_mono : cone (parallel_pair (𝟙 Y) (retraction f ≫ f)) :=
739
- fork.of_ι f (by tidy)
740
-
741
- @[simp] lemma cone_of_split_mono_π_app_zero : (cone_of_split_mono f).π.app zero = f := rfl
742
- @[simp] lemma cone_of_split_mono_π_app_one : (cone_of_split_mono f).π.app one = f ≫ 𝟙 Y := rfl
734
+ fork.of_ι f (by simp)
743
735
744
736
/--
745
737
A split mono `f` equalizes `(retraction f ≫ f)` and `(𝟙 Y)`.
746
738
-/
747
739
def split_mono_equalizes {X Y : C} (f : X ⟶ Y) [split_mono f] : is_limit (cone_of_split_mono f) :=
748
- { lift := λ s, s.π.app zero ≫ retraction f,
749
- fac' := λ s,
750
- begin
751
- rintros (⟨⟩|⟨⟩),
752
- { rw [cone_of_split_mono_π_app_zero],
753
- erw [category.assoc, ← s.π.naturality right, s.π.naturality left, category.comp_id], },
754
- { erw [cone_of_split_mono_π_app_one, category.comp_id, category.assoc,
755
- ← s.π.naturality right, category.id_comp], }
756
- end ,
757
- uniq' := λ s m w, begin rw ←(w zero), simp, end , }
740
+ fork.is_limit.mk' _ $ λ s,
741
+ ⟨s.ι ≫ retraction f,
742
+ by { dsimp, rw [category.assoc, ←s.condition], apply category.comp_id },
743
+ λ m hm, by simp [←hm]⟩
758
744
759
745
end
760
746
@@ -766,26 +752,19 @@ variables {C} [split_epi f]
766
752
A split epi `f` coequalizes `(f ≫ section_ f)` and `(𝟙 X)`.
767
753
Here we build the cocone, and show in `split_epi_coequalizes` that it is a colimit cocone.
768
754
-/
755
+ @[simps {rhs_md := semireducible}]
769
756
def cocone_of_split_epi : cocone (parallel_pair (𝟙 X) (f ≫ section_ f)) :=
770
- cofork.of_π f (by tidy)
771
-
772
- @[simp] lemma cocone_of_split_epi_ι_app_one : (cocone_of_split_epi f).ι.app one = f := rfl
773
- @[simp] lemma cocone_of_split_epi_ι_app_zero : (cocone_of_split_epi f).ι.app zero = 𝟙 X ≫ f := rfl
757
+ cofork.of_π f (by simp)
774
758
775
759
/--
776
760
A split epi `f` coequalizes `(f ≫ section_ f)` and `(𝟙 X)`.
777
761
-/
778
- def split_epi_coequalizes {X Y : C} (f : X ⟶ Y) [split_epi f] : is_colimit (cocone_of_split_epi f) :=
779
- { desc := λ s, section_ f ≫ s.ι.app one,
780
- fac' := λ s,
781
- begin
782
- rintros (⟨⟩|⟨⟩),
783
- { erw [cocone_of_split_epi_ι_app_zero, category.assoc, category.id_comp, ←category.assoc,
784
- s.ι.naturality right, functor.const.obj_map, category.comp_id], },
785
- { erw [cocone_of_split_epi_ι_app_one, ←category.assoc, s.ι.naturality right,
786
- ←s.ι.naturality left, category.id_comp] }
787
- end ,
788
- uniq' := λ s m w, begin rw ←(w one), simp, end , }
762
+ def split_epi_coequalizes {X Y : C} (f : X ⟶ Y) [split_epi f] :
763
+ is_colimit (cocone_of_split_epi f) :=
764
+ cofork.is_colimit.mk' _ $ λ s,
765
+ ⟨section_ f ≫ s.π,
766
+ by { dsimp, rw [← category.assoc, ← s.condition, category.id_comp] },
767
+ λ m hm, by simp [← hm]⟩
789
768
790
769
end
791
770
0 commit comments