# mathlibdocumentation

category_theory.limits.shapes.biproducts

# Biproducts and binary biproducts #

We introduce the notion of (finite) biproducts and binary biproducts.

These are slightly unusual relative to the other shapes in the library, as they are simultaneously limits and colimits. (Zero objects are similar; they are "biterminal".)

We treat first the case of a general category with zero morphisms, and subsequently the case of a preadditive category.

In a category with zero morphisms, we model the (binary) biproduct of `P Q : C` using a `binary_bicone`, which has a cone point `X`, and morphisms `fst : X ⟶ P`, `snd : X ⟶ Q`, `inl : P ⟶ X` and `inr : X ⟶ Q`, such that `inl ≫ fst = 𝟙 P`, `inl ≫ snd = 0`, `inr ≫ fst = 0`, and `inr ≫ snd = 𝟙 Q`. Such a `binary_bicone` is a biproduct if the cone is a limit cone, and the cocone is a colimit cocone.

• any `binary_biproduct` satisfies `total : fst ≫ inl + snd ≫ inr = 𝟙 X`
• any `binary_product` is a `binary_biproduct`
• any `binary_coproduct` is a `binary_biproduct`

For biproducts indexed by a `fintype J`, a `bicone` again consists of a cone point `X` and morphisms `π j : X ⟶ F j` and `ι j : F j ⟶ X` for each `j`, such that `ι j ≫ π j'` is the identity when `j = j'` and zero otherwise.

• any `biproduct` satisfies `total : ∑ j : J, biproduct.π f j ≫ biproduct.ι f j = 𝟙 (⨁ f)`
• any `product` is a `biproduct`
• any `coproduct` is a `biproduct`

## Notation #

As `⊕` is already taken for the sum of types, we introduce the notation `X ⊞ Y` for a binary biproduct. We introduce `⨁ f` for the indexed biproduct.

@[nolint]
structure category_theory.limits.bicone {J : Type v} [decidable_eq J] {C : Type u} (F : J → C) :
Type (max u v)
• X : C
• π : Π (j : J), c.X F j
• ι : Π (j : J), F j c.X
• ι_π : ∀ (j j' : J), c.ι j c.π j' = dite (j = j') (λ (h : j = j'), (λ (h : ¬j = j'), 0)

A `c : bicone F` is:

• an object `c.X` and
• morphisms `π j : X ⟶ F j` and `ι j : F j ⟶ X` for each `j`,
• such that `ι j ≫ π j'` is the identity when `j = j'` and zero otherwise.
@[simp]
theorem category_theory.limits.bicone_ι_π_self {J : Type v} [decidable_eq J] {C : Type u} {F : J → C} (j : J) :
B.ι j B.π j = 𝟙 (F j)
@[simp]
theorem category_theory.limits.bicone_ι_π_ne {J : Type v} [decidable_eq J] {C : Type u} {F : J → C} {j j' : J} (h : j j') :
B.ι j B.π j' = 0
@[simp]
theorem category_theory.limits.bicone.to_cone_π_app {J : Type v} [decidable_eq J] {C : Type u} {F : J → C} (j : category_theory.discrete J) :
B.to_cone.π.app j = B.π j
@[simp]
theorem category_theory.limits.bicone.to_cone_X {J : Type v} [decidable_eq J] {C : Type u} {F : J → C}  :
B.to_cone.X = B.X
def category_theory.limits.bicone.to_cone {J : Type v} [decidable_eq J] {C : Type u} {F : J → C}  :

Extract the cone from a bicone.

Equations
def category_theory.limits.bicone.to_cocone {J : Type v} [decidable_eq J] {C : Type u} {F : J → C}  :

Extract the cocone from a bicone.

Equations
@[simp]
theorem category_theory.limits.bicone.to_cocone_ι_app {J : Type v} [decidable_eq J] {C : Type u} {F : J → C} (j : category_theory.discrete J) :
B.to_cocone.ι.app j = B.ι j
@[simp]
theorem category_theory.limits.bicone.to_cocone_X {J : Type v} [decidable_eq J] {C : Type u} {F : J → C}  :
@[nolint]
structure category_theory.limits.limit_bicone {J : Type v} [decidable_eq J] {C : Type u} (F : J → C) :
Type (max u v)
• bicone :
• is_limit :
• is_colimit :

A bicone over `F : J → C`, which is both a limit cone and a colimit cocone.

@[class]
structure category_theory.limits.has_biproduct {J : Type v} [decidable_eq J] {C : Type u} (F : J → C) :
Prop
• exists_biproduct :

`has_biproduct F` expresses the mere existence of a bicone which is simultaneously a limit and a colimit of the diagram `F`.

Instances
theorem category_theory.limits.has_biproduct.mk {J : Type v} [decidable_eq J] {C : Type u} {F : J → C}  :
def category_theory.limits.get_biproduct_data {J : Type v} [decidable_eq J] {C : Type u} (F : J → C)  :

Use the axiom of choice to extract explicit `biproduct_data F` from `has_biproduct F`.

Equations
def category_theory.limits.biproduct.bicone {J : Type v} [decidable_eq J] {C : Type u} (F : J → C)  :

A bicone for `F` which is both a limit cone and a colimit cocone.

Equations
def category_theory.limits.biproduct.is_limit {J : Type v} [decidable_eq J] {C : Type u} (F : J → C)  :

`biproduct.bicone F` is a limit cone.

Equations
def category_theory.limits.biproduct.is_colimit {J : Type v} [decidable_eq J] {C : Type u} (F : J → C)  :

`biproduct.bicone F` is a colimit cocone.

Equations
@[instance]
def category_theory.limits.has_product_of_has_biproduct {J : Type v} [decidable_eq J] {C : Type u} {F : J → C}  :
@[instance]
def category_theory.limits.has_coproduct_of_has_biproduct {J : Type v} [decidable_eq J] {C : Type u} {F : J → C}  :
@[class]
structure category_theory.limits.has_biproducts_of_shape (J : Type v) [decidable_eq J] (C : Type u)  :
Prop
• has_biproduct : ∀ (F : J → C),

`C` has biproducts of shape `J` if we have a limit and a colimit, with the same cone points, of every function `F : J → C`.

Instances
@[class]
structure category_theory.limits.has_finite_biproducts (C : Type u)  :
Prop
• has_biproducts_of_shape : ∀ (J : Type ?) [_inst_4 : [_inst_5 : fintype J],

`has_finite_biproducts C` represents a choice of biproduct for every family of objects in `C` indexed by a finite type with decidable equality.

Instances
@[instance]
@[instance]
def category_theory.limits.biproduct_iso {J : Type v} [decidable_eq J] {C : Type u} (F : J → C)  :
F F

The isomorphism between the specified limit and the specified colimit for a functor with a bilimit.

Equations
def category_theory.limits.biproduct {J : Type v} [decidable_eq J] {C : Type u} (f : J → C)  :
C

`biproduct f` computes the biproduct of a family of elements `f`. (It is defined as an abbreviation for `limit (discrete.functor f)`, so for most facts about `biproduct f`, you will just use general facts about limits and colimits.)

def category_theory.limits.biproduct.π {J : Type v} [decidable_eq J] {C : Type u} (f : J → C) (b : J) :
f f b

The projection onto a summand of a biproduct.

@[simp]
theorem category_theory.limits.biproduct.bicone_π {J : Type v} [decidable_eq J] {C : Type u} (f : J → C) (b : J) :
def category_theory.limits.biproduct.ι {J : Type v} [decidable_eq J] {C : Type u} (f : J → C) (b : J) :
f b f

The inclusion into a summand of a biproduct.

@[simp]
theorem category_theory.limits.biproduct.bicone_ι {J : Type v} [decidable_eq J] {C : Type u} (f : J → C) (b : J) :
theorem category_theory.limits.biproduct.ι_π {J : Type v} [decidable_eq J] {C : Type u} (f : J → C) (j j' : J) :
= dite (j = j') (λ (h : j = j'), (λ (h : ¬j = j'), 0)
theorem category_theory.limits.biproduct.ι_π_assoc {J : Type v} [decidable_eq J] {C : Type u} (f : J → C) (j j' : J) {X' : C} (f' : f j' X') :
= dite (j = j') (λ (h : j = j'), (λ (h : ¬j = j'), 0) f'
@[simp]
theorem category_theory.limits.biproduct.ι_π_self_assoc {J : Type v} [decidable_eq J] {C : Type u} (f : J → C) (j : J) {X' : C} (f' : f j X') :
@[simp]
theorem category_theory.limits.biproduct.ι_π_self {J : Type v} [decidable_eq J] {C : Type u} (f : J → C) (j : J) :
@[simp]
theorem category_theory.limits.biproduct.ι_π_ne {J : Type v} [decidable_eq J] {C : Type u} (f : J → C) {j j' : J} (h : j j') :
@[simp]
theorem category_theory.limits.biproduct.ι_π_ne_assoc {J : Type v} [decidable_eq J] {C : Type u} (f : J → C) {j j' : J} (h : j j') {X' : C} (f' : f j' X') :
= 0 f'
def category_theory.limits.biproduct.lift {J : Type v} [decidable_eq J] {C : Type u} {f : J → C} {P : C} (p : Π (b : J), P f b) :
P f

Given a collection of maps into the summands, we obtain a map into the biproduct.

def category_theory.limits.biproduct.desc {J : Type v} [decidable_eq J] {C : Type u} {f : J → C} {P : C} (p : Π (b : J), f b P) :
f P

Given a collection of maps out of the summands, we obtain a map out of the biproduct.

@[simp]
theorem category_theory.limits.biproduct.lift_π_assoc {J : Type v} [decidable_eq J] {C : Type u} {f : J → C} {P : C} (p : Π (b : J), P f b) (j : J) {X' : C} (f' : f j X') :
= p j f'
@[simp]
theorem category_theory.limits.biproduct.lift_π {J : Type v} [decidable_eq J] {C : Type u} {f : J → C} {P : C} (p : Π (b : J), P f b) (j : J) :
@[simp]
theorem category_theory.limits.biproduct.ι_desc {J : Type v} [decidable_eq J] {C : Type u} {f : J → C} {P : C} (p : Π (b : J), f b P) (j : J) :
@[simp]
theorem category_theory.limits.biproduct.ι_desc_assoc {J : Type v} [decidable_eq J] {C : Type u} {f : J → C} {P : C} (p : Π (b : J), f b P) (j : J) {X' : C} (f' : P X') :
= p j f'
def category_theory.limits.biproduct.map {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {f g : J → C} (p : Π (b : J), f b g b) :
f g

Given a collection of maps between corresponding summands of a pair of biproducts indexed by the same type, we obtain a map between the biproducts.

def category_theory.limits.biproduct.map' {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {f g : J → C} (p : Π (b : J), f b g b) :
f g

An alternative to `biproduct.map` constructed via colimits. This construction only exists in order to show it is equal to `biproduct.map`.

@[ext]
theorem category_theory.limits.biproduct.hom_ext {J : Type v} [decidable_eq J] {C : Type u} {f : J → C} {Z : C} (g h : Z f) (w : ∀ (j : J), ) :
g = h
@[ext]
theorem category_theory.limits.biproduct.hom_ext' {J : Type v} [decidable_eq J] {C : Type u} {f : J → C} {Z : C} (g h : f Z) (w : ∀ (j : J), ) :
g = h
theorem category_theory.limits.biproduct.map_eq_map' {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {f g : J → C} (p : Π (b : J), f b g b) :
@[simp]
theorem category_theory.limits.biproduct.map_π {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {f g : J → C} (p : Π (j : J), f j g j) (j : J) :
@[simp]
theorem category_theory.limits.biproduct.map_π_assoc {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {f g : J → C} (p : Π (j : J), f j g j) (j : J) {X' : C} (f' : g j X') :
@[simp]
theorem category_theory.limits.biproduct.ι_map_assoc {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {f g : J → C} (p : Π (j : J), f j g j) (j : J) {X' : C} (f' : ( λ (j : J), g j) X') :
@[simp]
theorem category_theory.limits.biproduct.ι_map {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {f g : J → C} (p : Π (j : J), f j g j) (j : J) :
@[simp]
theorem category_theory.limits.biproduct.map_desc_assoc {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {f g : J → C} (p : Π (j : J), f j g j) {P : C} (k : Π (j : J), g j P) {X' : C} (f' : P X') :
@[simp]
theorem category_theory.limits.biproduct.map_desc {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {f g : J → C} (p : Π (j : J), f j g j) {P : C} (k : Π (j : J), g j P) :
@[simp]
theorem category_theory.limits.biproduct.lift_map_assoc {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {f g : J → C} {P : C} (k : Π (j : J), P f j) (p : Π (j : J), f j g j) {X' : C} (f' : ( λ (j : J), g j) X') :
@[simp]
theorem category_theory.limits.biproduct.lift_map {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {f g : J → C} {P : C} (k : Π (j : J), P f j) (p : Π (j : J), f j g j) :
@[simp]
theorem category_theory.limits.biproduct.map_iso_inv {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {f g : J → C} (p : Π (b : J), f b g b) :
@[simp]
theorem category_theory.limits.biproduct.map_iso_hom {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {f g : J → C} (p : Π (b : J), f b g b) :
def category_theory.limits.biproduct.map_iso {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {f g : J → C} (p : Π (b : J), f b g b) :
f g

Given a collection of isomorphisms between corresponding summands of a pair of biproducts indexed by the same type, we obtain an isomorphism between the biproducts.

Equations
def category_theory.limits.biproduct.matrix {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g : K → C} (m : Π (j : J) (k : K), f j g k) :
f g

Convert a (dependently typed) matrix to a morphism of biproducts.

Equations
@[simp]
theorem category_theory.limits.biproduct.matrix_π {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g : K → C} (m : Π (j : J) (k : K), f j g k) (k : K) :
@[simp]
theorem category_theory.limits.biproduct.matrix_π_assoc {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g : K → C} (m : Π (j : J) (k : K), f j g k) (k : K) {X' : C} (f' : g k X') :
@[simp]
theorem category_theory.limits.biproduct.ι_matrix_assoc {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g : K → C} (m : Π (j : J) (k : K), f j g k) (j : J) {X' : C} (f' : ( λ (k : K), g k) X') :
@[simp]
theorem category_theory.limits.biproduct.ι_matrix {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g : K → C} (m : Π (j : J) (k : K), f j g k) (j : J) :
def category_theory.limits.biproduct.components {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g : K → C} (m : f g) (j : J) (k : K) :
f j g k

Extract the matrix components from a morphism of biproducts.

Equations
@[simp]
theorem category_theory.limits.biproduct.matrix_components {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g : K → C} (m : Π (j : J) (k : K), f j g k) (j : J) (k : K) :
@[simp]
theorem category_theory.limits.biproduct.components_matrix {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g : K → C} (m : f g) :
def category_theory.limits.biproduct.matrix_equiv {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g : K → C}  :
( f g) Π (j : J) (k : K), f j g k

Morphisms between direct sums are matrices.

Equations
@[simp]
theorem category_theory.limits.biproduct.matrix_equiv_symm_apply {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g : K → C} (m : Π (j : J) (k : K), (λ (j : J), f j) j (λ (k : K), g k) k) :
@[simp]
theorem category_theory.limits.biproduct.matrix_equiv_apply {J : Type v} [decidable_eq J] {C : Type u} [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g : K → C} (m : f g) (j : J) (k : K) :
@[instance]
def category_theory.limits.biproduct.ι_mono {J : Type v} [decidable_eq J] {C : Type u} (f : J → C) (b : J) :
Equations
@[instance]
def category_theory.limits.biproduct.π_epi {J : Type v} [decidable_eq J] {C : Type u} (f : J → C) (b : J) :
Equations
@[nolint]
structure category_theory.limits.binary_bicone {C : Type u} (P Q : C) :
Type (max u v)

A binary bicone for a pair of objects `P Q : C` consists of the cone point `X`, maps from `X` to both `P` and `Q`, and maps from both `P` and `Q` to `X`, so that `inl ≫ fst = 𝟙 P`, `inl ≫ snd = 0`, `inr ≫ fst = 0`, and `inr ≫ snd = 𝟙 Q`

@[simp]
theorem category_theory.limits.binary_bicone.inl_fst {C : Type u} {P Q : C}  :
c.inl c.fst = 𝟙 P
@[simp]
theorem category_theory.limits.binary_bicone.inl_snd {C : Type u} {P Q : C}  :
c.inl c.snd = 0
@[simp]
theorem category_theory.limits.binary_bicone.inr_fst {C : Type u} {P Q : C}  :
c.inr c.fst = 0
@[simp]
theorem category_theory.limits.binary_bicone.inr_snd {C : Type u} {P Q : C}  :
c.inr c.snd = 𝟙 Q
@[simp]
theorem category_theory.limits.binary_bicone.inr_snd_assoc {C : Type u} {P Q : C} {X' : C} (f' : Q X') :
c.inr c.snd f' = f'
@[simp]
theorem category_theory.limits.binary_bicone.inl_fst_assoc {C : Type u} {P Q : C} {X' : C} (f' : P X') :
c.inl c.fst f' = f'
@[simp]
theorem category_theory.limits.binary_bicone.inr_fst_assoc {C : Type u} {P Q : C} {X' : C} (f' : P X') :
c.inr c.fst f' = 0 f'
@[simp]
theorem category_theory.limits.binary_bicone.inl_snd_assoc {C : Type u} {P Q : C} {X' : C} (f' : Q X') :
c.inl c.snd f' = 0 f'
def category_theory.limits.binary_bicone.to_cone {C : Type u} {P Q : C}  :

Extract the cone from a binary bicone.

Equations
@[simp]
theorem category_theory.limits.binary_bicone.to_cone_X {C : Type u} {P Q : C}  :
c.to_cone.X = c.X
@[simp]
@[simp]

Extract the cocone from a binary bicone.

Equations
@[simp]
theorem category_theory.limits.binary_bicone.to_cocone_X {C : Type u} {P Q : C}  :
@[simp]
@[simp]
@[simp]
theorem category_theory.limits.bicone.to_binary_bicone_inl {C : Type u} {X Y : C}  :

Convert a `bicone` over a function on `walking_pair` to a binary_bicone.

Equations
@[simp]
theorem category_theory.limits.bicone.to_binary_bicone_X {C : Type u} {X Y : C}  :
@[simp]
theorem category_theory.limits.bicone.to_binary_bicone_fst {C : Type u} {X Y : C}  :
@[simp]
theorem category_theory.limits.bicone.to_binary_bicone_snd {C : Type u} {X Y : C}  :
@[simp]
theorem category_theory.limits.bicone.to_binary_bicone_inr {C : Type u} {X Y : C}  :

If the cone obtained from a bicone over `pair X Y` is a limit cone, so is the cone obtained by converting that bicone to a binary_bicone, then to a cone.

Equations

If the cocone obtained from a bicone over `pair X Y` is a colimit cocone, so is the cocone obtained by converting that bicone to a binary_bicone, then to a cocone.

Equations
@[nolint]
structure category_theory.limits.binary_biproduct_data {C : Type u} (P Q : C) :
Type (max u v)
• bicone :
• is_limit :
• is_colimit :

A bicone over `P Q : C`, which is both a limit cone and a colimit cocone.

@[class]
structure category_theory.limits.has_binary_biproduct {C : Type u} (P Q : C) :
Prop
• exists_binary_biproduct :

`has_binary_biproduct P Q` expresses the mere existence of a bicone which is simultaneously a limit and a colimit of the diagram `pair P Q`.

Instances
theorem category_theory.limits.has_binary_biproduct.mk {C : Type u} {P Q : C}  :

Use the axiom of choice to extract explicit `binary_biproduct_data F` from `has_binary_biproduct F`.

Equations

A bicone for `P Q` which is both a limit cone and a colimit cocone.

Equations

`binary_biproduct.bicone P Q` is a limit cone.

Equations

`binary_biproduct.bicone P Q` is a colimit cocone.

Equations
@[class]
structure category_theory.limits.has_binary_biproducts (C : Type u)  :
Prop
• has_binary_biproduct : ∀ (P Q : C),

`has_binary_biproducts C` represents the existence of a bicone which is simultaneously a limit and a colimit of the diagram `pair P Q`, for every `P Q : C`.

Instances

A category with finite biproducts has binary biproducts.

This is not an instance as typically in concrete categories there will be an alternative construction with nicer definitional properties.

@[instance]
@[instance]
@[instance]
@[instance]
def category_theory.limits.biprod_iso {C : Type u} (X Y : C)  :
X Y X ⨿ Y

The isomorphism between the specified binary product and the specified binary coproduct for a pair for a binary biproduct.

Equations
def category_theory.limits.biprod {C : Type u} (X Y : C)  :
C

An arbitrary choice of biproduct of a pair of objects.

def category_theory.limits.biprod.fst {C : Type u} {X Y : C}  :
X Y X

The projection onto the first summand of a binary biproduct.

def category_theory.limits.biprod.snd {C : Type u} {X Y : C}  :
X Y Y

The projection onto the second summand of a binary biproduct.

def category_theory.limits.biprod.inl {C : Type u} {X Y : C}  :
X X Y

The inclusion into the first summand of a binary biproduct.

def category_theory.limits.biprod.inr {C : Type u} {X Y : C}  :
Y X Y

The inclusion into the second summand of a binary biproduct.

@[simp]
@[simp]
@[simp]
@[simp]
@[simp]
@[simp]
theorem category_theory.limits.biprod.inl_fst_assoc {C : Type u} {X Y : C} {X' : C} (f' : X X') :
@[simp]
@[simp]
theorem category_theory.limits.biprod.inl_snd_assoc {C : Type u} {X Y : C} {X' : C} (f' : Y X') :
@[simp]
@[simp]
theorem category_theory.limits.biprod.inr_fst_assoc {C : Type u} {X Y : C} {X' : C} (f' : X X') :
@[simp]
@[simp]
theorem category_theory.limits.biprod.inr_snd_assoc {C : Type u} {X Y : C} {X' : C} (f' : Y X') :
def category_theory.limits.biprod.lift {C : Type u} {W X Y : C} (f : W X) (g : W Y) :
W X Y

Given a pair of maps into the summands of a binary biproduct, we obtain a map into the binary biproduct.

def category_theory.limits.biprod.desc {C : Type u} {W X Y : C} (f : X W) (g : Y W) :
X Y W

Given a pair of maps out of the summands of a binary biproduct, we obtain a map out of the binary biproduct.

@[simp]
theorem category_theory.limits.biprod.lift_fst_assoc {C : Type u} {W X Y : C} (f : W X) (g : W Y) {X' : C} (f' : X X') :
@[simp]
theorem category_theory.limits.biprod.lift_fst {C : Type u} {W X Y : C} (f : W X) (g : W Y) :
@[simp]
theorem category_theory.limits.biprod.lift_snd {C : Type u} {W X Y : C} (f : W X) (g : W Y) :
@[simp]
theorem category_theory.limits.biprod.lift_snd_assoc {C : Type u} {W X Y : C} (f : W X) (g : W Y) {X' : C} (f' : Y X') :
@[simp]
theorem category_theory.limits.biprod.inl_desc_assoc {C : Type u} {W X Y : C} (f : X W) (g : Y W) {X' : C} (f' : W X') :
@[simp]
theorem category_theory.limits.biprod.inl_desc {C : Type u} {W X Y : C} (f : X W) (g : Y W) :
@[simp]
theorem category_theory.limits.biprod.inr_desc_assoc {C : Type u} {W X Y : C} (f : X W) (g : Y W) {X' : C} (f' : W X') :
@[simp]
theorem category_theory.limits.biprod.inr_desc {C : Type u} {W X Y : C} (f : X W) (g : Y W) :
@[instance]
def category_theory.limits.biprod.mono_lift_of_mono_left {C : Type u} {W X Y : C} (f : W X) (g : W Y)  :
@[instance]
def category_theory.limits.biprod.mono_lift_of_mono_right {C : Type u} {W X Y : C} (f : W X) (g : W Y)  :
@[instance]
def category_theory.limits.biprod.epi_desc_of_epi_left {C : Type u} {W X Y : C} (f : X W) (g : Y W)  :
@[instance]
def category_theory.limits.biprod.epi_desc_of_epi_right {C : Type u} {W X Y : C} (f : X W) (g : Y W)  :
def category_theory.limits.biprod.map {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) :
W X Y Z

Given a pair of maps between the summands of a pair of binary biproducts, we obtain a map between the binary biproducts.

def category_theory.limits.biprod.map' {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) :
W X Y Z

An alternative to `biprod.map` constructed via colimits. This construction only exists in order to show it is equal to `biprod.map`.

@[ext]
theorem category_theory.limits.biprod.hom_ext {C : Type u} {X Y Z : C} (f g : Z X Y)  :
f = g
@[ext]
theorem category_theory.limits.biprod.hom_ext' {C : Type u} {X Y Z : C} (f g : X Y Z)  :
f = g
theorem category_theory.limits.biprod.map_eq_map' {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) :
@[instance]
Equations
@[instance]
Equations
@[instance]
Equations
@[instance]
Equations
@[simp]
theorem category_theory.limits.biprod.map_fst_assoc {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) {X' : C} (f' : Y X') :
@[simp]
theorem category_theory.limits.biprod.map_fst {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) :
@[simp]
theorem category_theory.limits.biprod.map_snd {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) :
@[simp]
theorem category_theory.limits.biprod.map_snd_assoc {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) {X' : C} (f' : Z X') :
@[simp]
theorem category_theory.limits.biprod.inl_map {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) :
@[simp]
theorem category_theory.limits.biprod.inl_map_assoc {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) {X' : C} (f' : Y Z X') :
@[simp]
theorem category_theory.limits.biprod.inr_map {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) :
@[simp]
theorem category_theory.limits.biprod.inr_map_assoc {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) {X' : C} (f' : Y Z X') :
def category_theory.limits.biprod.map_iso {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) :
W X Y Z

Given a pair of isomorphisms between the summands of a pair of binary biproducts, we obtain an isomorphism between the binary biproducts.

Equations
@[simp]
theorem category_theory.limits.biprod.map_iso_hom {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) :
@[simp]
theorem category_theory.limits.biprod.map_iso_inv {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) :
def category_theory.limits.biprod.braiding {C : Type u} (P Q : C) :
P Q Q P

The braiding isomorphism which swaps a binary biproduct.

Equations
@[simp]
@[simp]
@[simp]
def category_theory.limits.biprod.braiding' {C : Type u} (P Q : C) :
P Q Q P

An alternative formula for the braiding isomorphism which swaps a binary biproduct, using the fact that the biproduct is a coproduct.

Equations
@[simp]
theorem category_theory.limits.biprod.braid_natural_assoc {C : Type u} {W X Y Z : C} (f : X Y) (g : Z W) {X' : C} (f' : W Y X') :
theorem category_theory.limits.biprod.braid_natural {C : Type u} {W X Y Z : C} (f : X Y) (g : Z W) :

The braiding isomorphism can be passed through a map by swapping the order.

theorem category_theory.limits.biprod.braiding_map_braiding_assoc {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) {X' : C} (f' : Z Y X') :
theorem category_theory.limits.biprod.braiding_map_braiding {C : Type u} {W X Y Z : C} (f : W Y) (g : X Z) :
@[simp]
@[simp]
theorem category_theory.limits.biprod.symmetry_assoc {C : Type u} (P Q : C) {X' : C} (f' : P Q X') :
= f'
theorem category_theory.limits.biprod.symmetry {C : Type u} (P Q : C) :
= 𝟙 (P Q)

The braiding isomorphism is symmetric.

theorem category_theory.limits.has_biproduct_of_total {C : Type u} {J : Type v} [decidable_eq J] [fintype J] {f : J → C} (total : ∑ (j : J), b.π j b.ι j = 𝟙 b.X) :

In a preadditive category, we can construct a biproduct for `f : J → C` from any bicone `b` for `f` satisfying `total : ∑ j : J, b.π j ≫ b.ι j = 𝟙 b.X`.

(That is, such a bicone is a limit cone and a colimit cocone.)

theorem category_theory.limits.has_biproduct.of_has_product {C : Type u} {J : Type v} [decidable_eq J] [fintype J] (f : J → C)  :

In a preadditive category, if the product over `f : J → C` exists, then the biproduct over `f` exists.

theorem category_theory.limits.has_biproduct.of_has_coproduct {C : Type u} {J : Type v} [decidable_eq J] [fintype J] (f : J → C)  :

In a preadditive category, if the coproduct over `f : J → C` exists, then the biproduct over `f` exists.

A preadditive category with finite products has finite biproducts.

A preadditive category with finite coproducts has finite biproducts.

@[simp]
theorem category_theory.limits.biproduct.total {C : Type u} {J : Type v} [decidable_eq J] [fintype J] {f : J → C}  :
∑ (j : J), = 𝟙 ( f)

In any preadditive category, any biproduct satsifies `∑ j : J, biproduct.π f j ≫ biproduct.ι f j = 𝟙 (⨁ f)`

theorem category_theory.limits.biproduct.lift_eq {C : Type u} {J : Type v} [decidable_eq J] [fintype J] {f : J → C} {T : C} {g : Π (j : J), T f j} :
= ∑ (j : J),
theorem category_theory.limits.biproduct.desc_eq {C : Type u} {J : Type v} [decidable_eq J] [fintype J] {f : J → C} {T : C} {g : Π (j : J), f j T} :
= ∑ (j : J),
@[simp]
theorem category_theory.limits.biproduct.lift_desc {C : Type u} {J : Type v} [decidable_eq J] [fintype J] {f : J → C} {T U : C} {g : Π (j : J), T f j} {h : Π (j : J), f j U} :
= ∑ (j : J), g j h j
@[simp]
theorem category_theory.limits.biproduct.lift_desc_assoc {C : Type u} {J : Type v} [decidable_eq J] [fintype J] {f : J → C} {T U : C} {g : Π (j : J), T f j} {h : Π (j : J), f j U} {X' : C} (f' : U X') :
= (∑ (j : J), g j h j) f'
theorem category_theory.limits.biproduct.map_eq {C : Type u} {J : Type v} [decidable_eq J] [fintype J] {f g : J → C} {h : Π (j : J), f j g j} :
= ∑ (j : J),
@[simp]
theorem category_theory.limits.biproduct.matrix_desc_assoc {C : Type u} {J : Type v} [decidable_eq J] [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g : K → C} (m : Π (j : J) (k : K), f j g k) {P : C} (x : Π (k : K), g k P) {X' : C} (f' : P X') :
= category_theory.limits.biproduct.desc (λ (j : J), ∑ (k : K), m j k x k) f'
@[simp]
theorem category_theory.limits.biproduct.matrix_desc {C : Type u} {J : Type v} [decidable_eq J] [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g : K → C} (m : Π (j : J) (k : K), f j g k) {P : C} (x : Π (k : K), g k P) :
= category_theory.limits.biproduct.desc (λ (j : J), ∑ (k : K), m j k x k)
@[simp]
theorem category_theory.limits.biproduct.lift_matrix {C : Type u} {J : Type v} [decidable_eq J] [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g : K → C} {P : C} (x : Π (j : J), P f j) (m : Π (j : J) (k : K), f j g k) :
= category_theory.limits.biproduct.lift (λ (k : K), ∑ (j : J), x j m j k)
@[simp]
theorem category_theory.limits.biproduct.lift_matrix_assoc {C : Type u} {J : Type v} [decidable_eq J] [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g : K → C} {P : C} (x : Π (j : J), P f j) (m : Π (j : J) (k : K), f j g k) {X' : C} (f' : ( λ (k : K), g k) X') :
= category_theory.limits.biproduct.lift (λ (k : K), ∑ (j : J), x j m j k) f'
theorem category_theory.limits.biproduct.matrix_map_assoc {C : Type u} {J : Type v} [decidable_eq J] [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g h : K → C} (m : Π (j : J) (k : K), f j g k) (n : Π (k : K), g k h k) {X' : C} (f' : ( λ (k : K), h k) X') :
= category_theory.limits.biproduct.matrix (λ (j : J) (k : K), m j k n k) f'
theorem category_theory.limits.biproduct.matrix_map {C : Type u} {J : Type v} [decidable_eq J] [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f : J → C} {g h : K → C} (m : Π (j : J) (k : K), f j g k) (n : Π (k : K), g k h k) :
= category_theory.limits.biproduct.matrix (λ (j : J) (k : K), m j k n k)
theorem category_theory.limits.biproduct.map_matrix {C : Type u} {J : Type v} [decidable_eq J] [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f g : J → C} {h : K → C} (m : Π (k : J), f k g k) (n : Π (j : J) (k : K), g j h k) :
= category_theory.limits.biproduct.matrix (λ (j : J) (k : K), m j n j k)
theorem category_theory.limits.biproduct.map_matrix_assoc {C : Type u} {J : Type v} [decidable_eq J] [fintype J] {K : Type v} [fintype K] [decidable_eq K] {f g : J → C} {h : K → C} (m : Π (k : J), f k g k) (n : Π (j : J) (k : K), g j h k) {X' : C} (f' : ( λ (k : K), h k) X') :
= category_theory.limits.biproduct.matrix (λ (j : J) (k : K), m j n j k) f'
theorem category_theory.limits.has_binary_biproduct_of_total {C : Type u} {X Y : C} (total : b.fst b.inl + b.snd b.inr = 𝟙 b.X) :

In a preadditive category, we can construct a binary biproduct for `X Y : C` from any binary bicone `b` satisfying `total : b.fst ≫ b.inl + b.snd ≫ b.inr = 𝟙 b.X`.

(That is, such a bicone is a limit cone and a colimit cocone.)

In a preadditive category, if the product of `X` and `Y` exists, then the binary biproduct of `X` and `Y` exists.

In a preadditive category, if all binary products exist, then all binary biproducts exist.

In a preadditive category, if the coproduct of `X` and `Y` exists, then the binary biproduct of `X` and `Y` exists.

In a preadditive category, if all binary coproducts exist, then all binary biproducts exist.

@[simp]

In any preadditive category, any binary biproduct satsifies `biprod.fst ≫ biprod.inl + biprod.snd ≫ biprod.inr = 𝟙 (X ⊞ Y)`.

theorem category_theory.limits.biprod.lift_eq {C : Type u} {X Y : C} {T : C} {f : T X} {g : T Y} :
theorem category_theory.limits.biprod.desc_eq {C : Type u} {X Y : C} {T : C} {f : X T} {g : Y T} :
@[simp]
theorem category_theory.limits.biprod.lift_desc {C : Type u} {X Y : C} {T U : C} {f : T X} {g : T Y} {h : X U} {i : Y U} :
= f h + g i
@[simp]
theorem category_theory.limits.biprod.lift_desc_assoc {C : Type u} {X Y : C} {T U : C} {f : T X} {g : T Y} {h : X U} {i : Y U} {X' : C} (f' : U X') :
= (f h + g i) f'
theorem category_theory.limits.biprod.map_eq {C : Type u} {W X Y Z : C} {f : W Y} {g : X Z} :