Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 4b45a71

Browse files
feat(counterexamples/pseudoelement): add counterexample to uniqueness in category_theory.abelian.pseudoelement.pseudo_pullback (#13387)
Borceux claims that the pseudoelement constructed in `category_theory.abelian.pseudoelement.pseudo_pullback` is unique. We show here that this claim is false.
1 parent 73ec5b2 commit 4b45a71

File tree

2 files changed

+157
-2
lines changed

2 files changed

+157
-2
lines changed

counterexamples/pseudoelement.lean

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
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

src/category_theory/abelian/pseudoelements.lean

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Markus Himmel
55
-/
66
import category_theory.abelian.exact
77
import category_theory.over
8+
import algebra.category.Module.abelian
89

910
/-!
1011
# Pseudoelements in abelian categories
@@ -399,8 +400,8 @@ variable [limits.has_pullbacks C]
399400
/-- If `f : P ⟶ R` and `g : Q ⟶ R` are morphisms and `p : P` and `q : Q` are pseudoelements such
400401
that `f p = g q`, then there is some `s : pullback f g` such that `fst s = p` and `snd s = q`.
401402
402-
Remark: Borceux claims that `s` is unique. I was unable to transform his proof sketch into
403-
a pen-and-paper proof of this fact, so naturally I was not able to formalize the proof. -/
403+
Remark: Borceux claims that `s` is unique, but this is false. See
404+
`counterexamples/pseudoelement` for details. -/
404405
theorem pseudo_pullback {P Q R : C} {f : P ⟶ R} {g : Q ⟶ R} {p : P} {q : Q} : f p = g q →
405406
∃ s, (pullback.fst : pullback f g ⟶ P) s = p ∧ (pullback.snd : pullback f g ⟶ Q) s = q :=
406407
quotient.induction_on₂ p q $ λ x y h,
@@ -414,5 +415,30 @@ begin
414415
quotient.sound ⟨Z, 𝟙 Z, b, by apply_instance, eb, by rwa category.id_comp⟩⟩⟩
415416
end
416417

418+
section module
419+
420+
local attribute [-instance] hom_to_fun
421+
422+
/-- In the category `Module R`, if `x` and `y` are pseudoequal, then the range of the associated
423+
morphisms is the same. -/
424+
lemma Module.eq_range_of_pseudoequal {R : Type*} [comm_ring R] {G : Module R} {x y : over G}
425+
(h : pseudo_equal G x y) : x.hom.range = y.hom.range :=
426+
begin
427+
obtain ⟨P, p, q, hp, hq, H⟩ := h,
428+
refine submodule.ext (λ a, ⟨λ ha, _, λ ha, _⟩),
429+
{ obtain ⟨a', ha'⟩ := ha,
430+
obtain ⟨a'', ha''⟩ := (Module.epi_iff_surjective p).1 hp a',
431+
refine ⟨q a'', _⟩,
432+
rw [← linear_map.comp_apply, ← Module.comp_def, ← H, Module.comp_def, linear_map.comp_apply,
433+
ha'', ha'] },
434+
{ obtain ⟨a', ha'⟩ := ha,
435+
obtain ⟨a'', ha''⟩ := (Module.epi_iff_surjective q).1 hq a',
436+
refine ⟨p a'', _⟩,
437+
rw [← linear_map.comp_apply, ← Module.comp_def, H, Module.comp_def, linear_map.comp_apply,
438+
ha'', ha'] }
439+
end
440+
441+
end module
442+
417443
end pseudoelement
418444
end category_theory.abelian

0 commit comments

Comments
 (0)