Built with Alectryon. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
(** * Additive categories
Semi-additive categories in which morphism addition admits inverses,
so that hom-sets are abelian groups and composition is bilinear. *)
From HoTT Require Import Basics.Overture Basics.Tactics.From HoTT.Classes.interfaces Require Import canonical_names abstract_algebra.From HoTT.Categories Require Import Category.Core Functor.Core.From HoTT.Categories.Functor Require Import Identity Composition.Core.From HoTT.Categories.Additive Require Import ZeroObjects SemiAdditive.From HoTT.Algebra.AbGroups Require Import AbelianGroup.LocalOpen Scope morphism_scope.(** This lets us use "+", "-" and "0" notation for the commutative monoid structure on hom-sets defined in SemiAdditive.v. *)LocalOpen Scope mc_add_scope.(** ** Definition of additive category The commutative monoid structure on hom-sets of a semi-additive category is canonical, so an additive category only needs to assume that each morphism has an additive inverse. *)ClassAdditiveCategory := {
additive_semiadditive :: SemiAdditiveCategory;
additive_inverse :: forall (XY : object additive_semiadditive),
Inverse (morphism additive_semiadditive X Y);
additive_inverse_l : forall {XY : object additive_semiadditive}
(f : morphism additive_semiadditive X Y),
(- f) + f = 0;
}.Coercionadditive_semiadditive : AdditiveCategory >-> SemiAdditiveCategory.(** ** Hom-sets are abelian groups *)SectionHomAbGroup.Context {A : AdditiveCategory} (XY : object A).(** The bundled abelian group of morphisms from [X] to [Y]. *)Definitionabgroup_hom : AbGroup
:= Build_AbGroup' (morphism A X Y) _ _ _ additive_inverse_l.#[export] Instanceisabgroup_morphisms : IsAbGroup (morphism A X Y)
:= @isabgroup_abgroup abgroup_hom.EndHomAbGroup.(** ** Negation and composition *)(** A left additive inverse equals the negation. *)Definitionhom_moveL_1V {A : AdditiveCategory} {XY : object A}
{fg : morphism A X Y} (H : g + f = 0)
: g = - f
:= grp_moveL_1V (G:=abgroup_hom X Y) H.(** Negation is compatible with precomposition. *)
A: AdditiveCategory X, Y, W: A f: morphism A X Y a: morphism A W X
- f o a = - (f o a)
A: AdditiveCategory X, Y, W: A f: morphism A X Y a: morphism A W X
- f o a = - (f o a)
A: AdditiveCategory X, Y, W: A f: morphism A X Y a: morphism A W X
- f o a + f o a = 0
A: AdditiveCategory X, Y, W: A f: morphism A X Y a: morphism A W X
(- f + f) o a = 0
A: AdditiveCategory X, Y, W: A f: morphism A X Y a: morphism A W X
0 o a = 0
napply zero_morphism_left.Qed.(** Negation is compatible with postcomposition. *)
A: AdditiveCategory X, Y, W: A a: morphism A Y W f: morphism A X Y
a o - f = - (a o f)
A: AdditiveCategory X, Y, W: A a: morphism A Y W f: morphism A X Y
a o - f = - (a o f)
A: AdditiveCategory X, Y, W: A a: morphism A Y W f: morphism A X Y
a o - f + a o f = 0
A: AdditiveCategory X, Y, W: A a: morphism A Y W f: morphism A X Y
a o (- f + f) = 0
A: AdditiveCategory X, Y, W: A a: morphism A Y W f: morphism A X Y
a o 0 = 0
napply zero_morphism_right.Qed.(** ** Additive functors A functor between additive categories is additive when its action on each hom-set is a monoid homomorphism for the canonical addition. Such functors automatically preserve zero morphisms and negation. *)RecordAdditiveFunctor (AB : AdditiveCategory) := {
addfunctor :> Functor A B;
ismonoidpreserving_addfunctor :: forall (XY : object A),
IsMonoidPreserving (@morphism_of _ _ addfunctor X Y);
}.Arguments addfunctor {A B} F : rename.Arguments ismonoidpreserving_addfunctor {A B} F X Y : rename.(** The identity functor is additive. *)
A: AdditiveCategory
AdditiveFunctor A A
A: AdditiveCategory
AdditiveFunctor A A
A: AdditiveCategory
Functor A A
A: AdditiveCategory
forallXY : A, IsMonoidPreserving (morphism_of ?addfunctor (d:=Y))
A: AdditiveCategory
Functor A A
exact1%functor.
A: AdditiveCategory
forallXY : A, IsMonoidPreserving (morphism_of 1 (d:=Y))