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.
(** * Semi-additive categories
Categories with zero objects and biproducts, which automatically
have commutative monoid structures on hom-sets. *)
From HoTT Require Import Basics.Overture Basics.PathGroupoids Basics.Tactics.From HoTT.Classes.interfaces Require Import abstract_algebra.From HoTT.Categories Require Import Category.Core.From HoTT.Categories.Additive Require Import ZeroObjects Biproducts.LocalOpen Scope morphism_scope.(** This lets us use "+" for the [SgOp] instance and "0" for the [MonUnit] instance defined below. *)LocalOpen Scope mc_add_scope.(** ** Definition of semi-additive category *)ClassSemiAdditiveCategory := {
cat : PreCategory;
semiadditive_zero :: ZeroObject cat;
semiadditive_biproduct :: forall (XY : object cat),
Biproduct semiadditive_zero X Y
}.Coercioncat : SemiAdditiveCategory >-> PreCategory.(** Notation for biproduct objects *)LocalNotation"X ⊕ Y" := (semiadditive_biproduct X Y).(** ** Morphism addition via biproducts Addition is the codiagonal composed with the pairing morphism. *)SectionMorphismAddition.Context {C : SemiAdditiveCategory} {XY : object C}.(** Codiagonal composed with pairing. *)#[export] Instancesgop_morphism : SgOp (morphism C X Y)
:= funfg =>
biproduct_codiagonal Y o biproduct_prod_mor (Y ⊕ Y) f g.(** The zero morphism is the unit for addition. *)#[export] Instancemonunit_morphism : MonUnit (morphism C X Y)
:= zero_morphism X Y.EndMorphismAddition.(** ** Identity laws for morphism addition *)SectionIdentityLaws.Context {C : SemiAdditiveCategory}.(** Zero is a left identity for morphism addition. *)Definitionzero_left_identity {XY : object C} (f : morphism C X Y)
: 0 + f = f
:= biproduct_codiagonal_prod_zero_l f.(** Zero is a right identity for morphism addition. *)Definitionzero_right_identity {XY : object C} (f : morphism C X Y)
: f + 0 = f
:= biproduct_codiagonal_prod_zero_r f.EndIdentityLaws.(** ** Commutativity of morphism addition *)
C: SemiAdditiveCategory X, Y: C
Commutative sgop_morphism
C: SemiAdditiveCategory X, Y: C
Commutative sgop_morphism
C: SemiAdditiveCategory X, Y: C f, g: morphism C X Y
sgop_morphism f g = sgop_morphism g f
C: SemiAdditiveCategory X, Y: C f, g: morphism C X Y
biproduct_codiagonal Y o biproduct_prod_mor (Y ⊕ Y) f g =
biproduct_codiagonal Y o biproduct_prod_mor (Y ⊕ Y) g f
C: SemiAdditiveCategory X, Y: C f, g: morphism C X Y
biproduct_codiagonal Y o biproduct_prod_mor (Y ⊕ Y) f g =
biproduct_codiagonal Y o (biproduct_swap o biproduct_prod_mor (Y ⊕ Y) f g)
C: SemiAdditiveCategory X, Y: C f, g: morphism C X Y
biproduct_codiagonal Y o biproduct_prod_mor (Y ⊕ Y) f g =
biproduct_codiagonal Y o biproduct_swap o biproduct_prod_mor (Y ⊕ Y) f g
C: SemiAdditiveCategory X, Y: C f, g: morphism C X Y
biproduct_codiagonal Y o biproduct_prod_mor (Y ⊕ Y) f g =
biproduct_codiagonal Y o biproduct_prod_mor (Y ⊕ Y) f g
reflexivity.Qed.(** ** Associativity of morphism addition *)SectionAssociativity.Context {C : SemiAdditiveCategory}.(** Addition is natural in the domain. *)
C: SemiAdditiveCategory X, Y, W: C f, g: morphism C X Y a: morphism C W X
(f + g) o a = f o a + g o a
C: SemiAdditiveCategory X, Y, W: C f, g: morphism C X Y a: morphism C W X
(f + g) o a = f o a + g o a
C: SemiAdditiveCategory X, Y, W: C f, g: morphism C X Y a: morphism C W X
biproduct_codiagonal Y o biproduct_prod_mor (Y ⊕ Y) f g o a =
biproduct_codiagonal Y o biproduct_prod_mor (Y ⊕ Y) (f o a) (g o a)
C: SemiAdditiveCategory X, Y, W: C f, g: morphism C X Y a: morphism C W X
biproduct_codiagonal Y o (biproduct_prod_mor (Y ⊕ Y) f g o a) =
biproduct_codiagonal Y o biproduct_prod_mor (Y ⊕ Y) (f o a) (g o a)
apply ap, biproduct_prod_mor_nat.Qed.(** Addition is natural in the codomain. *)
C: SemiAdditiveCategory X, Y, Y': C f, g: morphism C X Y a: morphism C Y Y'
a o (f + g) = a o f + a o g
C: SemiAdditiveCategory X, Y, Y': C f, g: morphism C X Y a: morphism C Y Y'
a o (f + g) = a o f + a o g
C: SemiAdditiveCategory X, Y, Y': C f, g: morphism C X Y a: morphism C Y Y'
a o (biproduct_codiagonal Y o biproduct_prod_mor (Y ⊕ Y) f g) =
biproduct_codiagonal Y' o biproduct_prod_mor (Y' ⊕ Y') (a o f) (a o g)
C: SemiAdditiveCategory X, Y, Y': C f, g: morphism C X Y a: morphism C Y Y'
a o biproduct_codiagonal Y o biproduct_prod_mor (Y ⊕ Y) f g =
biproduct_codiagonal Y' o biproduct_prod_mor (Y' ⊕ Y') (a o f) (a o g)
C: SemiAdditiveCategory X, Y, Y': C f, g: morphism C X Y a: morphism C Y Y'
biproduct_coprod_mor (Y ⊕ Y) Y' a a o biproduct_prod_mor (Y ⊕ Y) f g =
biproduct_codiagonal Y' o biproduct_prod_mor (Y' ⊕ Y') (a o f) (a o g)
C: SemiAdditiveCategory X, Y, Y': C f, g: morphism C X Y a: morphism C Y Y'
biproduct_codiagonal Y' o biproduct_sum_map a a
o biproduct_prod_mor (Y ⊕ Y) f g =
biproduct_codiagonal Y' o biproduct_prod_mor (Y' ⊕ Y') (a o f) (a o g)
C: SemiAdditiveCategory X, Y, Y': C f, g: morphism C X Y a: morphism C Y Y'
biproduct_codiagonal Y'
o (biproduct_sum_map a a o biproduct_prod_mor (Y ⊕ Y) f g) =
biproduct_codiagonal Y' o biproduct_prod_mor (Y' ⊕ Y') (a o f) (a o g)
C: SemiAdditiveCategory X, Y, Y': C f, g: morphism C X Y a: morphism C Y Y'
biproduct_codiagonal Y' o biproduct_prod_mor (Y' ⊕ Y') (a o f) (a o g) =
biproduct_codiagonal Y' o biproduct_prod_mor (Y' ⊕ Y') (a o f) (a o g)
reflexivity.Qed.(** Sum of pairings is the pairing of the sums. *)
C: SemiAdditiveCategory X, Y, Y': C f1, f2: morphism C X Y g1, g2: morphism C X Y'
C: SemiAdditiveCategory X, Y, Y': C f1, f2: morphism C X Y g1, g2: morphism C X Y'
outr (Y ⊕ Y') o biproduct_prod_mor (Y ⊕ Y') f1 g1 +
outr (Y ⊕ Y') o biproduct_prod_mor (Y ⊕ Y') f2 g2 =
g1 + g2
C: SemiAdditiveCategory X, Y, Y': C f1, f2: morphism C X Y g1, g2: morphism C X Y'
g1 + g2 = g1 + g2
reflexivity.Qed.(** Associativity follows by functoriality of pairing and codiagonal. *)
C: SemiAdditiveCategory X, Y: C f, g, h: morphism C X Y
f + (g + h) = f + g + h
C: SemiAdditiveCategory X, Y: C f, g, h: morphism C X Y
f + (g + h) = f + g + h
C: SemiAdditiveCategory X, Y: C f, g, h: morphism C X Y
f + 0 + (g + h) = f + g + h
C: SemiAdditiveCategory X, Y: C f, g, h: morphism C X Y
biproduct_codiagonal Y
o (biproduct_prod_mor (Y ⊕ Y) f g + biproduct_prod_mor (Y ⊕ Y) 0 h) =
f + g + h
C: SemiAdditiveCategory X, Y: C f, g, h: morphism C X Y
biproduct_codiagonal Y o biproduct_prod_mor (Y ⊕ Y) f g +
biproduct_codiagonal Y o biproduct_prod_mor (Y ⊕ Y) 0 h =
f + g + h
exact (ap (funw => (f + g) + w) (zero_left_identity h)).Qed.EndAssociativity.(** ** Main theorem: morphism sets form commutative monoids *)
C: SemiAdditiveCategory X, Y: C
IsCommutativeMonoid (morphism C X Y)
C: SemiAdditiveCategory X, Y: C
IsCommutativeMonoid (morphism C X Y)
C: SemiAdditiveCategory X, Y: C
IsHSet (morphism C X Y)
C: SemiAdditiveCategory X, Y: C
Associative sg_op
C: SemiAdditiveCategory X, Y: C
LeftIdentity sg_op 0
C: SemiAdditiveCategory X, Y: C
RightIdentity sg_op 0
C: SemiAdditiveCategory X, Y: C
Commutative sg_op
C: SemiAdditiveCategory X, Y: C
IsHSet (morphism C X Y)
exact _.
C: SemiAdditiveCategory X, Y: C
Associative sg_op
exact morphism_addition_associative.
C: SemiAdditiveCategory X, Y: C
LeftIdentity sg_op 0
exact zero_left_identity.
C: SemiAdditiveCategory X, Y: C
RightIdentity sg_op 0
exact zero_right_identity.
C: SemiAdditiveCategory X, Y: C
Commutative sg_op
exact morphism_addition_commutative.Defined.(** ** Uniqueness of the enrichment The canonical addition is the unique family of operations on hom-sets with units that distributes over composition. Commutativity and associativity of [op] are not assumed; they follow from uniqueness. *)SectionEnrichmentUniqueness.Context {C : SemiAdditiveCategory}
(op : forall (XY : object C), morphism C X Y -> morphism C X Y -> morphism C X Y)
(op_zero : forall (XY : object C), morphism C X Y)
(op_zero_l : forall (XY : object C) (f : morphism C X Y),
op X Y (op_zero X Y) f = f)
(op_zero_r : forall (XY : object C) (f : morphism C X Y),
op X Y f (op_zero X Y) = f)
(op_postcompose : forall (XYZ : object C)
(h : morphism C Y Z) (fg : morphism C X Y),
h o op X Y f g = op X Z (h o f) (h o g))
(op_precompose : forall (XYZ : object C)
(fg : morphism C Y Z) (h : morphism C X Y),
op Y Z f g o h = op X Z (f o h) (g o h))
(op_zero_postcompose : forall (XYZ : object C) (h : morphism C Y Z),
h o op_zero X Y = op_zero X Z).(** The unit of any such operation is the zero morphism. *)
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f = f op_zero_r: forall (X0Y0 : C) (f : morphism C X0 Y0), op X0 Y0 f (op_zero X0 Y0) = f op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (fg : morphism C X0 Y0),
h o op X0 Y0 f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0Y0Z : C) (fg : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C
op_zero X Y = zero_morphism X Y
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f = f op_zero_r: forall (X0Y0 : C) (f : morphism C X0 Y0), op X0 Y0 f (op_zero X0 Y0) = f op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (fg : morphism C X0 Y0),
h o op X0 Y0 f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0Y0Z : C) (fg : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C
op_zero X Y = zero_morphism X Y
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f = f op_zero_r: forall (X0Y0 : C) (f : morphism C X0 Y0), op X0 Y0 f (op_zero X0 Y0) = f op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (fg : morphism C X0 Y0),
h o op X0 Y0 f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0Y0Z : C) (fg : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C
zero_morphism semiadditive_zero Y o op_zero X semiadditive_zero =
zero_morphism X Y
apply morphism_through_zero_is_zero.Qed.(** Any such operation decomposes the identity of a self-biproduct. *)
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C
op (X ⊕ X) (X ⊕ X) (inl (X ⊕ X) o outl (X ⊕ X)) (inr (X ⊕ X) o outr (X ⊕ X)) =
1
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C
op (X ⊕ X) (X ⊕ X) (inl (X ⊕ X) o outl (X ⊕ X)) (inr (X ⊕ X) o outr (X ⊕ X)) =
1
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B B (inl B o outl B) (inr B o outr B) = 1
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B B (inl B o outl B) (inr B o outr B) =
biproduct_prod_mor B (outl B) (outr B)
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
biproduct_prod_mor B (outl B) (outr B) = 1
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B B (inl B o outl B) (inr B o outr B) =
biproduct_prod_mor B (outl B) (outr B)
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
outl B o op B B (inl B o outl B) (inr B o outr B) = outl B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
outr B o op B B (inl B o outl B) (inr B o outr B) = outr B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
outl B o op B B (inl B o outl B) (inr B o outr B) = outl B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B X (outl B o (inl B o outl B)) (outl B o (inr B o outr B)) = outl B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B X (outl B o inl B o outl B) (outl B o inr B o outr B) = outl B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B X (1 o outl B) (outl B o inr B o outr B) = outl B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B X (1 o outl B) (zero_morphism X X o outr B) = outl B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B X (outl B) (zero_morphism X X o outr B) = outl B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B X (outl B) (zero_morphism B X) = outl B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B X (outl B) (op_zero B X) = outl B
apply op_zero_r.
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
outr B o op B B (inl B o outl B) (inr B o outr B) = outr B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B X (outr B o (inl B o outl B)) (outr B o (inr B o outr B)) = outr B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B X (outr B o inl B o outl B) (outr B o inr B o outr B) = outr B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B X (zero_morphism X X o outl B) (outr B o inr B o outr B) = outr B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B X (zero_morphism X X o outl B) (1 o outr B) = outr B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B X (zero_morphism X X o outl B) (outr B) = outr B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B X (zero_morphism B X) (outr B) = outr B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
op B X (op_zero B X) (outr B) = outr B
apply op_zero_l.
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
biproduct_prod_mor B (outl B) (outr B) = 1
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
1 = biproduct_prod_mor B (outl B) (outr B)
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
outl B o 1 = outl B
C: SemiAdditiveCategory op: forallX0Y : C, morphism C X0 Y -> morphism C X0 Y -> morphism C X0 Y op_zero: forallX0Y : C, morphism C X0 Y op_zero_l: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y (op_zero X0 Y) f = f op_zero_r: forall (X0Y : C) (f : morphism C X0 Y), op X0 Y f (op_zero X0 Y) = f op_postcompose: forall (X0YZ : C) (h : morphism C Y Z) (fg : morphism C X0 Y),
h o op X0 Y f g = op X0 Z (h o f) (h o g) op_precompose: forall (X0YZ : C) (fg : morphism C Y Z) (h : morphism C X0 Y),
op Y Z f g o h = op X0 Z (f o h) (g o h) op_zero_postcompose: forall (X0YZ : C) (h : morphism C Y Z), h o op_zero X0 Y = op_zero X0 Z X: C B:= X ⊕ X: Biproduct semiadditive_zero X X
outr B o 1 = outr B
all: apply right_identity.Qed.(** The canonical addition is the unique such operation. *)
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
op X Y f g = f + g
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
op X Y f g = f + g
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
f + g = op X Y f g
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
biproduct_coprod_mor (Y ⊕ Y) Y 11 o biproduct_prod_mor (Y ⊕ Y) f g =
op X Y f g
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
biproduct_coprod_mor (Y ⊕ Y) Y 11 o (1 o biproduct_prod_mor (Y ⊕ Y) f g) =
op X Y f g
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
biproduct_coprod_mor (Y ⊕ Y) Y 11
o (op (Y ⊕ Y) (Y ⊕ Y) (inl (Y ⊕ Y) o outl (Y ⊕ Y))
(inr (Y ⊕ Y) o outr (Y ⊕ Y))
o biproduct_prod_mor (Y ⊕ Y) f g) =
op X Y f g
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
biproduct_coprod_mor (Y ⊕ Y) Y 11
o op (Y ⊕ Y) (Y ⊕ Y) (inl (Y ⊕ Y) o outl (Y ⊕ Y))
(inr (Y ⊕ Y) o outr (Y ⊕ Y))
o biproduct_prod_mor (Y ⊕ Y) f g = op X Y f g
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
op (Y ⊕ Y) Y
(biproduct_coprod_mor (Y ⊕ Y) Y 11 o (inl (Y ⊕ Y) o outl (Y ⊕ Y)))
(biproduct_coprod_mor (Y ⊕ Y) Y 11 o (inr (Y ⊕ Y) o outr (Y ⊕ Y)))
o biproduct_prod_mor (Y ⊕ Y) f g = op X Y f g
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
op X Y
(biproduct_coprod_mor (Y ⊕ Y) Y 11 o (inl (Y ⊕ Y) o outl (Y ⊕ Y))
o biproduct_prod_mor (Y ⊕ Y) f g)
(biproduct_coprod_mor (Y ⊕ Y) Y 11 o (inr (Y ⊕ Y) o outr (Y ⊕ Y))
o biproduct_prod_mor (Y ⊕ Y) f g) =
op X Y f g
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
biproduct_coprod_mor (Y ⊕ Y) Y 11 o (inl (Y ⊕ Y) o outl (Y ⊕ Y))
o biproduct_prod_mor (Y ⊕ Y) f g = f
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
biproduct_coprod_mor (Y ⊕ Y) Y 11 o (inr (Y ⊕ Y) o outr (Y ⊕ Y))
o biproduct_prod_mor (Y ⊕ Y) f g = g
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
biproduct_coprod_mor (Y ⊕ Y) Y 11 o (inl (Y ⊕ Y) o outl (Y ⊕ Y))
o biproduct_prod_mor (Y ⊕ Y) f g = f
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
biproduct_coprod_mor (Y ⊕ Y) Y 11
o (inl (Y ⊕ Y) o (outl (Y ⊕ Y) o biproduct_prod_mor (Y ⊕ Y) f g)) = f
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
biproduct_coprod_mor (Y ⊕ Y) Y 11 o (inl (Y ⊕ Y) o f) = f
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
biproduct_coprod_mor (Y ⊕ Y) Y 11 o inl (Y ⊕ Y) o f = f
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
1 o f = f
apply left_identity.
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
biproduct_coprod_mor (Y ⊕ Y) Y 11 o (inr (Y ⊕ Y) o outr (Y ⊕ Y))
o biproduct_prod_mor (Y ⊕ Y) f g = g
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
biproduct_coprod_mor (Y ⊕ Y) Y 11
o (inr (Y ⊕ Y) o (outr (Y ⊕ Y) o biproduct_prod_mor (Y ⊕ Y) f g)) = g
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
biproduct_coprod_mor (Y ⊕ Y) Y 11 o (inr (Y ⊕ Y) o g) = g
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y
biproduct_coprod_mor (Y ⊕ Y) Y 11 o inr (Y ⊕ Y) o g = g
C: SemiAdditiveCategory op: forallX0Y0 : C, morphism C X0 Y0 -> morphism C X0 Y0 -> morphism C X0 Y0 op_zero: forallX0Y0 : C, morphism C X0 Y0 op_zero_l: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 (op_zero X0 Y0) f0 = f0 op_zero_r: forall (X0Y0 : C) (f0 : morphism C X0 Y0), op X0 Y0 f0 (op_zero X0 Y0) = f0 op_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z) (f0g0 : morphism C X0 Y0),
h o op X0 Y0 f0 g0 = op X0 Z (h o f0) (h o g0) op_precompose: forall (X0Y0Z : C) (f0g0 : morphism C Y0 Z) (h : morphism C X0 Y0),
op Y0 Z f0 g0 o h = op X0 Z (f0 o h) (g0 o h) op_zero_postcompose: forall (X0Y0Z : C) (h : morphism C Y0 Z), h o op_zero X0 Y0 = op_zero X0 Z X, Y: C f, g: morphism C X Y