Library HoTT.Categories.Additive.Additive
Additive categories
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.
Local Open Scope morphism_scope.
This lets us use "+", "-" and "0" notation for the commutative monoid
structure on hom-sets defined in SemiAdditive.v.
Local Open Scope mc_add_scope.
Definition of additive category
Class AdditiveCategory := {
additive_semiadditive :: SemiAdditiveCategory;
additive_inverse :: ∀ (X Y : object additive_semiadditive),
Inverse (morphism additive_semiadditive X Y);
additive_inverse_l : ∀ {X Y : object additive_semiadditive}
(f : morphism additive_semiadditive X Y),
(- f) + f = 0;
}.
Coercion additive_semiadditive : AdditiveCategory >-> SemiAdditiveCategory.
Definition abgroup_hom : AbGroup
:= Build_AbGroup' (morphism A X Y) _ _ _ additive_inverse_l.
#[export] Instance isabgroup_morphisms : IsAbGroup (morphism A X Y)
:= @isabgroup_abgroup abgroup_hom.
End HomAbGroup.
:= Build_AbGroup' (morphism A X Y) _ _ _ additive_inverse_l.
#[export] Instance isabgroup_morphisms : IsAbGroup (morphism A X Y)
:= @isabgroup_abgroup abgroup_hom.
End HomAbGroup.
Definition hom_moveL_1V {A : AdditiveCategory} {X Y : object A}
{f g : morphism A X Y} (H : g + f = 0)
: g = - f
:= grp_moveL_1V (G:=abgroup_hom X Y) H.
{f g : morphism A X Y} (H : g + f = 0)
: g = - f
:= grp_moveL_1V (G:=abgroup_hom X Y) H.
Negation is compatible with precomposition.
Definition inverse_precompose {A : AdditiveCategory} {X Y W : object A}
(f : morphism A X Y) (a : morphism A W X)
: (- f) o a = - (f o a).
Proof.
apply hom_moveL_1V.
lhs_V napply addition_precompose.
lhs napply (ap (fun g ⇒ g o a) (additive_inverse_l f)).
napply zero_morphism_left.
Qed.
(f : morphism A X Y) (a : morphism A W X)
: (- f) o a = - (f o a).
Proof.
apply hom_moveL_1V.
lhs_V napply addition_precompose.
lhs napply (ap (fun g ⇒ g o a) (additive_inverse_l f)).
napply zero_morphism_left.
Qed.
Negation is compatible with postcomposition.
Definition inverse_postcompose {A : AdditiveCategory} {X Y W : object A}
(a : morphism A Y W) (f : morphism A X Y)
: a o (- f) = - (a o f).
Proof.
apply hom_moveL_1V.
lhs_V napply addition_postcompose.
lhs napply (ap (fun g ⇒ a o g) (additive_inverse_l f)).
napply zero_morphism_right.
Qed.
(a : morphism A Y W) (f : morphism A X Y)
: a o (- f) = - (a o f).
Proof.
apply hom_moveL_1V.
lhs_V napply addition_postcompose.
lhs napply (ap (fun g ⇒ a o g) (additive_inverse_l f)).
napply zero_morphism_right.
Qed.
Additive functors
Record AdditiveFunctor (A B : AdditiveCategory) := {
addfunctor :> Functor A B;
ismonoidpreserving_addfunctor :: ∀ (X Y : 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.
Definition id_additive_functor (A : AdditiveCategory)
: AdditiveFunctor A A.
Proof.
snapply Build_AdditiveFunctor.
- exact 1%functor.
- intros X Y.
rapply id_monoid_morphism.
Defined.
: AdditiveFunctor A A.
Proof.
snapply Build_AdditiveFunctor.
- exact 1%functor.
- intros X Y.
rapply id_monoid_morphism.
Defined.
Additive functors compose.
Definition compose_additive_functors {A B C : AdditiveCategory}
(G : AdditiveFunctor B C) (F : AdditiveFunctor A B)
: AdditiveFunctor A C.
Proof.
snapply Build_AdditiveFunctor.
- exact (G o F)%functor.
- intros X Y.
rapply compose_monoid_morphism.
Defined.
(G : AdditiveFunctor B C) (F : AdditiveFunctor A B)
: AdditiveFunctor A C.
Proof.
snapply Build_AdditiveFunctor.
- exact (G o F)%functor.
- intros X Y.
rapply compose_monoid_morphism.
Defined.