Skip to content

Commit 82670e8

Browse files
feat(CategoryTheory/Abelian): Criterion for full subcategory of abelian category to be abelian (leanprover-community#36483)
If `P` is an object property in an abelian category and - `P` contains zero, - `P` is closed under kernels and cokernels, - `P` is closed under finite products, then the full subcategory defined by `P` is abelian.
1 parent 15f8632 commit 82670e8

3 files changed

Lines changed: 76 additions & 0 deletions

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2377,6 +2377,7 @@ public import Mathlib.CategoryTheory.Abelian.SerreClass.Bousfield
23772377
public import Mathlib.CategoryTheory.Abelian.SerreClass.Localization
23782378
public import Mathlib.CategoryTheory.Abelian.SerreClass.MorphismProperty
23792379
public import Mathlib.CategoryTheory.Abelian.ShortExact
2380+
public import Mathlib.CategoryTheory.Abelian.Subcategory
23802381
public import Mathlib.CategoryTheory.Abelian.Subobject
23812382
public import Mathlib.CategoryTheory.Abelian.Transfer
23822383
public import Mathlib.CategoryTheory.Abelian.Yoneda
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/-
2+
Copyright (c) 2026 Justus Springer. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Justus Springer
5+
-/
6+
module
7+
8+
public import Mathlib.CategoryTheory.ObjectProperty.FiniteProducts
9+
public import Mathlib.CategoryTheory.ObjectProperty.Kernels
10+
11+
/-!
12+
# Subcategories of abelian categories
13+
14+
Let `C` be an abelian category. Given `P : ObjectProperty C` which contains
15+
zero, is closed under kernels, cokernels and finite products, we show that the
16+
full subcategory defined by `P` is abelian.
17+
18+
-/
19+
20+
@[expose] public section
21+
22+
namespace CategoryTheory.ObjectProperty
23+
24+
open Limits
25+
26+
variable {C : Type*} [Category* C] (P : ObjectProperty C)
27+
28+
lemma preservesMonomorphisms_ι_of_isNormalEpiCategory [HasZeroMorphisms C] [HasFiniteCoproducts C]
29+
[HasKernels C] [HasCokernels C] [IsNormalEpiCategory C] [HasZeroObject C] [P.ContainsZero]
30+
[P.IsClosedUnderKernels] : P.ι.PreservesMonomorphisms :=
31+
have := P.preservesKernels_ι
32+
NormalEpiCategory.preservesMonomorphisms_of_preservesKernels P.ι
33+
34+
instance [Abelian C] [P.ContainsZero] [P.IsClosedUnderKernels] [P.IsClosedUnderCokernels] :
35+
IsNormalMonoCategory P.FullSubcategory where
36+
normalMonoOfMono {X Y} f :=
37+
have := P.preservesMonomorphisms_ι_of_isNormalEpiCategory
38+
⟨{Z := .mk _ (P.prop_cokernel f.hom X.property Y.property)
39+
g := P.homMk (cokernel.π f.hom)
40+
w := by cat_disch
41+
isLimit := isLimitOfReflects P.ι ((KernelFork.isLimitMapConeEquiv _ _).symm
42+
(Abelian.monoIsKernelOfCokernel _ (cokernelIsCokernel (P.ι.map f)) :))}⟩
43+
44+
lemma preservesEpimorphisms_ι_of_isNormalMonoCategory [HasZeroMorphisms C] [HasFiniteProducts C]
45+
[HasKernels C] [HasCokernels C] [IsNormalMonoCategory C] [HasZeroObject C] [P.ContainsZero]
46+
[P.IsClosedUnderCokernels] : P.ι.PreservesEpimorphisms :=
47+
have := P.preservesCokernels_ι
48+
NormalMonoCategory.preservesEpimorphisms_of_preservesCokernels P.ι
49+
50+
instance [Abelian C] [P.ContainsZero] [P.IsClosedUnderKernels] [P.IsClosedUnderCokernels] :
51+
IsNormalEpiCategory P.FullSubcategory where
52+
normalEpiOfEpi {X Y} f :=
53+
have := P.preservesEpimorphisms_ι_of_isNormalMonoCategory
54+
⟨{W := .mk _ (P.prop_kernel f.hom X.property Y.property)
55+
g := P.homMk (kernel.ι f.hom)
56+
w := by cat_disch
57+
isColimit := isColimitOfReflects P.ι ((CokernelCofork.isColimitMapCoconeEquiv _ _).symm
58+
(Abelian.epiIsCokernelOfKernel _ (kernelIsKernel (P.ι.map f)) :))}⟩
59+
60+
instance [Abelian C] [P.ContainsZero] [P.IsClosedUnderKernels] [P.IsClosedUnderCokernels]
61+
[P.IsClosedUnderFiniteProducts] : Abelian P.FullSubcategory where
62+
63+
end CategoryTheory.ObjectProperty

Mathlib/CategoryTheory/ObjectProperty/Kernels.lean

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,12 @@ noncomputable def createsKernels [P.IsClosedUnderKernels] {X Y : P.FullSubcatego
100100
· exact (IsLimit.postcomposeInvEquiv _ _).symm (kernelIsKernel f.hom)
101101
· exact P.prop_kernel f.hom X.property Y.property
102102

103+
lemma preservesKernels_ι [HasKernels C] [P.IsClosedUnderKernels] ⦃X Y : P.FullSubcategory⦄
104+
(f : X ⟶ Y) : PreservesLimit (parallelPair f 0) P.ι := by
105+
have := P.createsKernels f
106+
have := P.hasLimit_parallelPair_comp_ι f
107+
exact preservesLimit_of_createsLimit_and_hasLimit _ _
108+
103109
instance [P.IsClosedUnderKernels] [HasKernels C] : HasKernels P.FullSubcategory where
104110
has_limit f :=
105111
letI := P.createsKernels f
@@ -142,6 +148,12 @@ noncomputable def createsCokernels [P.IsClosedUnderCokernels] {X Y : P.FullSubca
142148
· exact (IsColimit.precomposeHomEquiv _ _).symm (cokernelIsCokernel f.hom)
143149
· exact P.prop_cokernel f.hom X.property Y.property
144150

151+
lemma preservesCokernels_ι [HasCokernels C] [P.IsClosedUnderCokernels] ⦃X Y : P.FullSubcategory⦄
152+
(f : X ⟶ Y) : PreservesColimit (parallelPair f 0) P.ι := by
153+
have := P.createsCokernels f
154+
have := P.hasColimit_parallelPair_comp_ι f
155+
exact preservesColimit_of_createsColimit_and_hasColimit _ _
156+
145157
instance [P.IsClosedUnderCokernels] [HasCokernels C] : HasCokernels P.FullSubcategory where
146158
has_colimit f :=
147159
letI := P.createsCokernels f

0 commit comments

Comments
 (0)