Skip to content

Commit 6fc141a

Browse files
Add additive categories infrastructure
Extracting AdditiveCategories.v from stable categories formalization (HoTT#2288). **Provides:** - `AdditiveCategory`: Categories with zero objects, biproducts, and abelian group structure on hom-sets - Helper functions for accessing biproduct components - Universal property operations with uniqueness (both product and coproduct) - `AdditiveFunctor`: Preserves zero objects, biproducts, and morphism addition - Main theorem: `additive_functor_preserves_zero_morphisms` - Identity and composition of additive functors **Changes from original:** - Fixed imports (removed non-existent ZeroMorphismLemmas.v) - Changed to `Class` with implicit `ZeroObject` instance - Added complete abelian group structure on hom-sets: - `add_morphism` operation with commutativity, associativity - Zero morphism as identity, existence of inverses - Bilinearity of composition (distributivity) - Removed 8 unused wrapper lemmas (e.g., `add_beta_l`, `add_mixed_r`) - Added `add_prod_unique` for product/coproduct duality - Updated transport lemma names to match Core.v - Applied HoTT style conventions Depends on: HoTT#2293 (ZeroObjects), HoTT#2300 (Biproducts) @jdchristensen The main new addition (no pun intended) is the abelian group structure on hom-sets, which makes this a proper additive category (not just a category with zero objects and biproducts). Also I have probably overlooked a few things. Will be looking over again, but wanted to get the PR submitted.
1 parent 97e533b commit 6fc141a

File tree

1 file changed

+315
-0
lines changed

1 file changed

+315
-0
lines changed
Lines changed: 315 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,315 @@
1+
(** * Additive categories
2+
3+
Categories enriched over abelian groups with zero objects and biproducts.
4+
*)
5+
6+
From HoTT Require Import Basics Types.
7+
From HoTT.Categories Require Import Category Functor NaturalTransformation.
8+
From HoTT.Categories.Additive Require Import ZeroObjects Biproducts.
9+
10+
(** * Additive categories *)
11+
12+
(** ** Definition
13+
14+
An additive category has a zero object and biproducts for all pairs
15+
of objects. This is a key step toward abelian categories.
16+
*)
17+
18+
Class AdditiveCategory := {
19+
cat : PreCategory;
20+
add_zero :: ZeroObject cat;
21+
add_biproduct : forall (X Y : object cat), Biproduct X Y;
22+
23+
(** Addition of morphisms *)
24+
add_morphism : forall {X Y : object cat},
25+
morphism cat X Y -> morphism cat X Y -> morphism cat X Y;
26+
27+
(** Addition is associative *)
28+
add_morphism_assoc : forall {X Y : object cat} (f g h : morphism cat X Y),
29+
add_morphism (add_morphism f g) h = add_morphism f (add_morphism g h);
30+
31+
(** Addition is commutative *)
32+
add_morphism_comm : forall {X Y : object cat} (f g : morphism cat X Y),
33+
add_morphism f g = add_morphism g f;
34+
35+
(** Zero morphism is the additive identity (left) *)
36+
add_morphism_zero_l : forall {X Y : object cat} (f : morphism cat X Y),
37+
add_morphism (@zero_morphism cat add_zero X Y) f = f;
38+
39+
(** Zero morphism is the additive identity (right) *)
40+
add_morphism_zero_r : forall {X Y : object cat} (f : morphism cat X Y),
41+
add_morphism f (@zero_morphism cat add_zero X Y) = f;
42+
43+
(** Every morphism has an additive inverse *)
44+
add_morphism_inverse : forall {X Y : object cat} (f : morphism cat X Y),
45+
{g : morphism cat X Y &
46+
add_morphism f g = @zero_morphism cat add_zero X Y};
47+
48+
(** Composition is bilinear - left distributivity *)
49+
composition_bilinear_l : forall {X Y Z : object cat}
50+
(f g : morphism cat X Y) (h : morphism cat Y Z),
51+
(h o add_morphism f g)%morphism =
52+
add_morphism (h o f) (h o g);
53+
54+
(** Composition is bilinear - right distributivity *)
55+
composition_bilinear_r : forall {X Y Z : object cat}
56+
(f : morphism cat X Y) (g h : morphism cat Y Z),
57+
(add_morphism g h o f)%morphism =
58+
add_morphism (g o f) (h o f)
59+
}.
60+
61+
Coercion cat : AdditiveCategory >-> PreCategory.
62+
63+
(** ** Helper functions *)
64+
65+
(** Access the zero object. *)
66+
Definition zero_obj (A : AdditiveCategory) : object A
67+
:= @zero A add_zero.
68+
69+
(** Zero morphism in an additive category. *)
70+
Definition add_zero_morphism (A : AdditiveCategory) (X Y : object A)
71+
: morphism A X Y
72+
:= @zero_morphism A add_zero X Y.
73+
74+
(** Helper functions to access biproduct components. *)
75+
Definition add_biproduct_data (A : AdditiveCategory) (X Y : object A)
76+
: BiproductData X Y
77+
:= biproduct_data (@add_biproduct A X Y).
78+
79+
Definition add_biproduct_obj (A : AdditiveCategory) (X Y : object A)
80+
: object A
81+
:= biproduct_obj (add_biproduct_data A X Y).
82+
83+
(** Notation for biproduct object. *)
84+
Notation "X ⊕ Y" := (add_biproduct_obj _ X Y)
85+
(at level 40, left associativity).
86+
87+
(** Biproduct injections. *)
88+
Definition add_inl {A : AdditiveCategory} {X Y : object A}
89+
: morphism A X (X ⊕ Y)
90+
:= inl (add_biproduct_data A X Y).
91+
92+
Definition add_inr {A : AdditiveCategory} {X Y : object A}
93+
: morphism A Y (X ⊕ Y)
94+
:= inr (add_biproduct_data A X Y).
95+
96+
(** Biproduct projections. *)
97+
Definition add_outl {A : AdditiveCategory} {X Y : object A}
98+
: morphism A (X ⊕ Y) X
99+
:= outl (add_biproduct_data A X Y).
100+
101+
Definition add_outr {A : AdditiveCategory} {X Y : object A}
102+
: morphism A (X ⊕ Y) Y
103+
:= outr (add_biproduct_data A X Y).
104+
105+
(** ** Universal property operations *)
106+
107+
Section AdditiveOperations.
108+
Context (A : AdditiveCategory).
109+
110+
(** Universal property of biproducts as coproducts. *)
111+
Definition add_coprod_mor {X Y Z : object A}
112+
(f : morphism A X Z) (g : morphism A Y Z)
113+
: morphism A (X ⊕ Y) Z
114+
:= biproduct_coprod_mor (@add_biproduct A X Y) Z f g.
115+
116+
Definition add_coprod_unique {X Y Z : object A}
117+
(f : morphism A X Z) (g : morphism A Y Z)
118+
(h : morphism A (X ⊕ Y) Z)
119+
(Hl : (h o add_inl = f)%morphism)
120+
(Hr : (h o add_inr = g)%morphism)
121+
: h = add_coprod_mor f g
122+
:= @biproduct_coprod_unique A add_zero X Y
123+
(@add_biproduct A X Y) Z f g h Hl Hr.
124+
125+
(** Universal property of biproducts as products. *)
126+
Definition add_prod_mor {X Y Z : object A}
127+
(f : morphism A Z X) (g : morphism A Z Y)
128+
: morphism A Z (X ⊕ Y)
129+
:= biproduct_prod_mor (@add_biproduct A X Y) Z f g.
130+
131+
Definition add_prod_unique {X Y Z : object A}
132+
(f : morphism A Z X) (g : morphism A Z Y)
133+
(h : morphism A Z (X ⊕ Y))
134+
(Hl : (add_outl o h = f)%morphism)
135+
(Hr : (add_outr o h = g)%morphism)
136+
: h = add_prod_mor f g.
137+
Proof.
138+
unfold add_prod_mor.
139+
set (B := @add_biproduct A X Y).
140+
set (c := @center _ (prod_universal (biproduct_universal B) Z f g)).
141+
assert (p : (h; (Hl, Hr)) = c).
142+
1: apply (@path_contr _
143+
(prod_universal (biproduct_universal B) Z f g)).
144+
exact (ap pr1 p).
145+
Qed.
146+
147+
End AdditiveOperations.
148+
149+
(** * Additive functors *)
150+
151+
(** ** Definition
152+
153+
An additive functor preserves the additive structure: zero objects,
154+
biproducts, and morphism addition.
155+
*)
156+
157+
Record AdditiveFunctor (A B : AdditiveCategory) := {
158+
add_functor :> Functor A B;
159+
160+
preserves_zero :
161+
object_of add_functor (zero_obj A) = zero_obj B;
162+
163+
preserves_biproduct : forall (X Y : object A),
164+
object_of add_functor (X ⊕ Y) =
165+
(object_of add_functor X ⊕ object_of add_functor Y);
166+
167+
(** Additive functors preserve addition of morphisms *)
168+
preserves_addition : forall {X Y : object A} (f g : morphism A X Y),
169+
morphism_of add_functor (add_morphism f g) =
170+
add_morphism (morphism_of add_functor f)
171+
(morphism_of add_functor g)
172+
}.
173+
174+
(** ** Properties of additive functors *)
175+
176+
Section AdditiveFunctorProperties.
177+
Context (A B : AdditiveCategory) (F : AdditiveFunctor A B).
178+
179+
(** Helper lemmas for preservation properties. *)
180+
181+
(** Additive functors preserve initial morphisms. *)
182+
Local Lemma functor_preserves_initial_morphism (Y : object A)
183+
: transport (fun W => morphism B W (object_of F Y))
184+
(@preserves_zero A B F)
185+
(morphism_of F
186+
(@morphism_from_initial A
187+
(initialobject_zeroobject (@add_zero A)) Y)) =
188+
@morphism_from_initial B
189+
(initialobject_zeroobject (@add_zero B))
190+
(object_of F Y).
191+
Proof.
192+
rapply path_contr.
193+
Qed.
194+
195+
(** Additive functors preserve terminal morphisms. *)
196+
Local Lemma functor_preserves_terminal_morphism (X : object A)
197+
: transport (fun W => morphism B (object_of F X) W)
198+
(@preserves_zero A B F)
199+
(morphism_of F
200+
(@morphism_to_terminal A
201+
(terminalobject_zeroobject (@add_zero A)) X)) =
202+
@morphism_to_terminal B
203+
(terminalobject_zeroobject (@add_zero B))
204+
(object_of F X).
205+
Proof.
206+
rapply path_contr.
207+
Qed.
208+
209+
(** Transporting morphisms across an equality. *)
210+
Local Lemma transport_morphism_compose {C : PreCategory}
211+
{W X Y Z : C} (p : W = X)
212+
(f : morphism C Y W) (g : morphism C W Z)
213+
: transport (fun U => morphism C Y Z) p (g o f)%morphism =
214+
(transport (fun U => morphism C U Z) p g o
215+
transport (fun U => morphism C Y U) p f)%morphism.
216+
Proof.
217+
destruct p. reflexivity.
218+
Qed.
219+
220+
(** F preserves the zero morphism components. *)
221+
Local Lemma F_preserves_zero_morphism_factorization (X Y : object A)
222+
: morphism_of F (add_zero_morphism A X Y) =
223+
(morphism_of F
224+
(@morphism_from_initial A
225+
(initialobject_zeroobject (@add_zero A)) Y) o
226+
morphism_of F
227+
(@morphism_to_terminal A
228+
(terminalobject_zeroobject (@add_zero A)) X))%morphism.
229+
Proof.
230+
unfold add_zero_morphism, zero_morphism.
231+
apply composition_of.
232+
Qed.
233+
234+
(** F preserves composition through zero. *)
235+
Local Lemma F_preserves_composition_through_zero (X Y : object A)
236+
: (morphism_of F
237+
(@morphism_from_initial A
238+
(initialobject_zeroobject (@add_zero A)) Y) o
239+
morphism_of F
240+
(@morphism_to_terminal A
241+
(terminalobject_zeroobject (@add_zero A)) X))%morphism =
242+
(@morphism_from_initial B
243+
(initialobject_zeroobject (@add_zero B)) (object_of F Y) o
244+
@morphism_to_terminal B
245+
(terminalobject_zeroobject (@add_zero B)) (object_of F X))%morphism.
246+
Proof.
247+
set (p := @preserves_zero A B F).
248+
symmetry.
249+
transitivity
250+
((transport (fun W => morphism B W (object_of F Y)) p
251+
(morphism_of F
252+
(@morphism_from_initial A
253+
(initialobject_zeroobject (@add_zero A)) Y)) o
254+
transport (fun W => morphism B (object_of F X) W) p
255+
(morphism_of F
256+
(@morphism_to_terminal A
257+
(terminalobject_zeroobject (@add_zero A)) X)))%morphism).
258+
2: apply transport_compose_middle.
259+
apply ap011.
260+
- symmetry. exact (functor_preserves_initial_morphism Y).
261+
- symmetry. exact (functor_preserves_terminal_morphism X).
262+
Qed.
263+
264+
(** ** Main theorem: additive functors preserve zero morphisms *)
265+
266+
Theorem additive_functor_preserves_zero_morphisms (X Y : object A)
267+
: morphism_of F (add_zero_morphism A X Y) =
268+
add_zero_morphism B (object_of F X) (object_of F Y).
269+
Proof.
270+
rewrite F_preserves_zero_morphism_factorization.
271+
unfold add_zero_morphism, zero_morphism.
272+
exact (F_preserves_composition_through_zero X Y).
273+
Qed.
274+
275+
End AdditiveFunctorProperties.
276+
277+
(** * Examples and constructions *)
278+
279+
(** The identity functor is additive. *)
280+
Definition id_additive_functor (A : AdditiveCategory)
281+
: AdditiveFunctor A A
282+
:= {|
283+
add_functor := 1%functor;
284+
preserves_zero := idpath;
285+
preserves_biproduct := fun X Y => idpath;
286+
preserves_addition := fun X Y f g => idpath
287+
|}.
288+
289+
(** Composition of additive functors is additive. *)
290+
Definition compose_additive_functors {A B C : AdditiveCategory}
291+
(G : AdditiveFunctor B C) (F : AdditiveFunctor A B)
292+
: AdditiveFunctor A C.
293+
Proof.
294+
refine {|
295+
add_functor := (G o F)%functor;
296+
preserves_zero :=
297+
ap (object_of G) (@preserves_zero A B F) @
298+
(@preserves_zero B C G);
299+
preserves_biproduct := fun X Y =>
300+
ap (object_of G) (@preserves_biproduct A B F X Y) @
301+
@preserves_biproduct B C G (object_of F X) (object_of F Y);
302+
preserves_addition := _
303+
|}.
304+
intros X Y f g.
305+
simpl.
306+
rewrite (@preserves_addition A B F X Y f g).
307+
apply (@preserves_addition B C G (object_of F X) (object_of F Y)).
308+
Defined.
309+
310+
(** * Export hints *)
311+
312+
Hint Rewrite
313+
@additive_functor_preserves_zero_morphisms
314+
: additive_simplify.
315+

0 commit comments

Comments
 (0)