|
| 1 | +/- |
| 2 | +Copyright (c) 2022 Riccardo Brasca. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Riccardo Brasca |
| 5 | +-/ |
| 6 | + |
| 7 | +import category_theory.abelian.pseudoelements |
| 8 | + |
| 9 | +/-! |
| 10 | +# Pseudoelements and pullbacks |
| 11 | +Borceux claims in Proposition 1.9.5 that the pseudoelement constructed in |
| 12 | +`category_theory.abelian.pseudoelement.pseudo_pullback` is unique. We show here that this claim is |
| 13 | +false. This means in particular that we cannot have an extensionality principle for pullbacks in |
| 14 | +terms of pseudoelements. |
| 15 | +
|
| 16 | +## Implementation details |
| 17 | +The construction, suggested in https://mathoverflow.net/a/419951/7845, is the following. |
| 18 | +We work in the category of `Module ℤ` and we consider the special case of `ℚ ⊞ ℚ` (that is the |
| 19 | +pullback over the terminal object). We consider the pseudoelements associated to `x : ℚ ⟶ ℚ ⊞ ℚ` |
| 20 | +given by `t ↦ (t, 2 * t)` and `y : ℚ ⟶ ℚ ⊞ ℚ` given by `t ↦ (t, t)`. |
| 21 | +
|
| 22 | +## Main results |
| 23 | +* `category_theory.abelian.pseudoelement.exist_ne_and_fst_eq_fst_and_snd_eq_snd` : there are two |
| 24 | + pseudoelements `x y : ℚ ⊞ ℚ` such that `x ≠ y`, `biprod.fst x = biprod.fst y` and |
| 25 | + `biprod.snd x = biprod.snd y`. |
| 26 | +
|
| 27 | +## References |
| 28 | +* [F. Borceux, *Handbook of Categorical Algebra 2*][borceux-vol2] |
| 29 | +-/ |
| 30 | + |
| 31 | +open category_theory.abelian category_theory category_theory.limits Module linear_map |
| 32 | + |
| 33 | +noncomputable theory |
| 34 | + |
| 35 | +namespace category_theory.abelian.pseudoelement |
| 36 | + |
| 37 | +/-- `x` is given by `t ↦ (t, 2 * t)`. -/ |
| 38 | +def x : over ((of ℤ ℚ) ⊞ (of ℤ ℚ)) := |
| 39 | +begin |
| 40 | + constructor, |
| 41 | + exact biprod.lift (of_hom id) (of_hom (2 * id)), |
| 42 | +end |
| 43 | + |
| 44 | +/-- `y` is given by `t ↦ (t, t)`. -/ |
| 45 | +def y : over ((of ℤ ℚ) ⊞ (of ℤ ℚ)) := |
| 46 | +begin |
| 47 | + constructor, |
| 48 | + exact biprod.lift (of_hom id) (of_hom id), |
| 49 | +end |
| 50 | + |
| 51 | +/-- `biprod.fst ≫ x` is pseudoequal to `biprod.fst y`. -/ |
| 52 | +lemma fst_x_pseudo_eq_fst_y : pseudo_equal _ (app biprod.fst x) (app biprod.fst y) := |
| 53 | +begin |
| 54 | + refine ⟨of ℤ ℚ, (of_hom id), (of_hom id), |
| 55 | + category_struct.id.epi (of ℤ ℚ), _, _⟩, |
| 56 | + { exact (Module.epi_iff_surjective _).2 (λ a, ⟨(a : ℚ), by simp⟩) }, |
| 57 | + { dsimp [x, y], |
| 58 | + simp } |
| 59 | +end |
| 60 | + |
| 61 | +/-- `biprod.snd ≫ x` is pseudoequal to `biprod.snd y`. -/ |
| 62 | +lemma snd_x_pseudo_eq_snd_y : pseudo_equal _ |
| 63 | + (app biprod.snd x) (app biprod.snd y) := |
| 64 | +begin |
| 65 | + refine ⟨of ℤ ℚ, (of_hom id), 2 • (of_hom id), |
| 66 | + category_struct.id.epi (of ℤ ℚ), _, _⟩, |
| 67 | + { refine (Module.epi_iff_surjective _).2 (λ a, ⟨(a/2 : ℚ), _⟩), |
| 68 | + simp only [two_smul, add_apply, of_hom_apply, id_coe, id.def], |
| 69 | + convert add_halves' _, |
| 70 | + change char_zero ℚ, |
| 71 | + apply_instance }, |
| 72 | + { dsimp [x, y], |
| 73 | + exact concrete_category.hom_ext _ _ (λ a, by simpa) } |
| 74 | +end |
| 75 | + |
| 76 | +/-- `x` is not pseudoequal to `y`. -/ |
| 77 | +lemma x_not_pseudo_eq : ¬(pseudo_equal _ x y) := |
| 78 | +begin |
| 79 | + intro h, |
| 80 | + replace h := Module.eq_range_of_pseudoequal h, |
| 81 | + dsimp [x, y] at h, |
| 82 | + let φ := (biprod.lift (of_hom (id : ℚ →ₗ[ℤ] ℚ)) (of_hom (2 * id))), |
| 83 | + have mem_range := mem_range_self φ (1 : ℚ), |
| 84 | + rw h at mem_range, |
| 85 | + obtain ⟨a, ha⟩ := mem_range, |
| 86 | + rw [← Module.id_apply (φ (1 : ℚ)), ← biprod.total, ← linear_map.comp_apply, ← comp_def, |
| 87 | + preadditive.comp_add] at ha, |
| 88 | + let π₁ := (biprod.fst : (of ℤ ℚ) ⊞ (of ℤ ℚ) ⟶ _), |
| 89 | + have ha₁ := congr_arg π₁ ha, |
| 90 | + simp only [← linear_map.comp_apply, ← comp_def] at ha₁, |
| 91 | + simp only [biprod.lift_fst, of_hom_apply, id_coe, id.def, preadditive.add_comp, category.assoc, |
| 92 | + biprod.inl_fst, category.comp_id, biprod.inr_fst, limits.comp_zero, add_zero] at ha₁, |
| 93 | + let π₂ := (biprod.snd : (of ℤ ℚ) ⊞ (of ℤ ℚ) ⟶ _), |
| 94 | + have ha₂ := congr_arg π₂ ha, |
| 95 | + simp only [← linear_map.comp_apply, ← comp_def] at ha₂, |
| 96 | + have : (2 : ℚ →ₗ[ℤ] ℚ) 1 = 1 + 1 := rfl, |
| 97 | + simp only [ha₁, this, biprod.lift_snd, of_hom_apply, id_coe, id.def, preadditive.add_comp, |
| 98 | + category.assoc, biprod.inl_snd, limits.comp_zero, biprod.inr_snd, category.comp_id, zero_add, |
| 99 | + mul_apply, self_eq_add_left] at ha₂, |
| 100 | + exact @one_ne_zero ℚ _ _ ha₂, |
| 101 | +end |
| 102 | + |
| 103 | +local attribute [instance] pseudoelement.setoid |
| 104 | + |
| 105 | +open_locale pseudoelement |
| 106 | + |
| 107 | +/-- `biprod.fst ⟦x⟧ = biprod.fst ⟦y⟧`. -/ |
| 108 | +lemma fst_mk_x_eq_fst_mk_y : (biprod.fst : (of ℤ ℚ) ⊞ (of ℤ ℚ) ⟶ _) ⟦x⟧ = |
| 109 | + (biprod.fst : (of ℤ ℚ) ⊞ (of ℤ ℚ) ⟶ _) ⟦y⟧ := |
| 110 | +by simpa only [abelian.pseudoelement.pseudo_apply_mk, quotient.eq] using fst_x_pseudo_eq_fst_y |
| 111 | + |
| 112 | +/-- `biprod.snd ⟦x⟧ = biprod.snd ⟦y⟧`. -/ |
| 113 | +lemma snd_mk_x_eq_snd_mk_y : (biprod.snd : (of ℤ ℚ) ⊞ (of ℤ ℚ) ⟶ _) ⟦x⟧ = |
| 114 | + (biprod.snd : (of ℤ ℚ) ⊞ (of ℤ ℚ) ⟶ _) ⟦y⟧ := |
| 115 | +by simpa only [abelian.pseudoelement.pseudo_apply_mk, quotient.eq] using snd_x_pseudo_eq_snd_y |
| 116 | + |
| 117 | +/-- `⟦x⟧ ≠ ⟦y⟧`. -/ |
| 118 | +lemma mk_x_ne_mk_y : ⟦x⟧ ≠ ⟦y⟧ := |
| 119 | +λ h, x_not_pseudo_eq $ quotient.eq.1 h |
| 120 | + |
| 121 | +/-- There are two pseudoelements `x y : ℚ ⊞ ℚ` such that `x ≠ y`, `biprod.fst x = biprod.fst y` and |
| 122 | + `biprod.snd x = biprod.snd y`. -/ |
| 123 | +lemma exist_ne_and_fst_eq_fst_and_snd_eq_snd : ∃ x y : (of ℤ ℚ) ⊞ (of ℤ ℚ), |
| 124 | + x ≠ y ∧ |
| 125 | + (biprod.fst : (of ℤ ℚ) ⊞ (of ℤ ℚ) ⟶ _) x = (biprod.fst : (of ℤ ℚ) ⊞ (of ℤ ℚ) ⟶ _) y ∧ |
| 126 | + (biprod.snd : (of ℤ ℚ) ⊞ (of ℤ ℚ) ⟶ _) x = (biprod.snd : (of ℤ ℚ) ⊞ (of ℤ ℚ) ⟶ _) y:= |
| 127 | +⟨⟦x⟧, ⟦y⟧, mk_x_ne_mk_y, fst_mk_x_eq_fst_mk_y, snd_mk_x_eq_snd_mk_y⟩ |
| 128 | + |
| 129 | +end category_theory.abelian.pseudoelement |
0 commit comments