[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cone (Discrete.functor f)
j : Discrete J
⊢ (fun s => ∑ j : J, NatTrans.app s.π { as := j } ≫ Bicone.ι b j) s ≫ NatTrans.app (Bicone.toCone b).π j =
    NatTrans.app s.π j
[PROOFSTEP]
cases j
[GOAL]
case mk
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cone (Discrete.functor f)
as✝ : J
⊢ (fun s => ∑ j : J, NatTrans.app s.π { as := j } ≫ Bicone.ι b j) s ≫ NatTrans.app (Bicone.toCone b).π { as := as✝ } =
    NatTrans.app s.π { as := as✝ }
[PROOFSTEP]
simp only [sum_comp, Category.assoc, Bicone.toCone_π_app, b.ι_π, comp_dite]
  -- See note [dsimp, simp].
[GOAL]
case mk
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cone (Discrete.functor f)
as✝ : J
⊢ (∑ x : J,
      if h : x = as✝ then NatTrans.app s.π { as := x } ≫ eqToHom (_ : f x = f as✝)
      else NatTrans.app s.π { as := x } ≫ 0) =
    NatTrans.app s.π { as := as✝ }
[PROOFSTEP]
dsimp
[GOAL]
case mk
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cone (Discrete.functor f)
as✝ : J
⊢ (∑ x : J,
      if h : x = as✝ then NatTrans.app s.π { as := x } ≫ eqToHom (_ : f x = f as✝)
      else NatTrans.app s.π { as := x } ≫ 0) =
    NatTrans.app s.π { as := as✝ }
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cone (Discrete.functor f)
m : s.pt ⟶ (Bicone.toCone b).pt
h : ∀ (j : Discrete J), m ≫ NatTrans.app (Bicone.toCone b).π j = NatTrans.app s.π j
⊢ m = (fun s => ∑ j : J, NatTrans.app s.π { as := j } ≫ Bicone.ι b j) s
[PROOFSTEP]
erw [← Category.comp_id m, ← total, comp_sum]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cone (Discrete.functor f)
m : s.pt ⟶ (Bicone.toCone b).pt
h : ∀ (j : Discrete J), m ≫ NatTrans.app (Bicone.toCone b).π j = NatTrans.app s.π j
⊢ ∑ j : J, m ≫ Bicone.π b j ≫ Bicone.ι b j = (fun s => ∑ j : J, NatTrans.app s.π { as := j } ≫ Bicone.ι b j) s
[PROOFSTEP]
apply Finset.sum_congr rfl
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cone (Discrete.functor f)
m : s.pt ⟶ (Bicone.toCone b).pt
h : ∀ (j : Discrete J), m ≫ NatTrans.app (Bicone.toCone b).π j = NatTrans.app s.π j
⊢ ∀ (x : J), x ∈ Finset.univ → m ≫ Bicone.π b x ≫ Bicone.ι b x = NatTrans.app s.π { as := x } ≫ Bicone.ι b x
[PROOFSTEP]
intro j _
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cone (Discrete.functor f)
m : s.pt ⟶ (Bicone.toCone b).pt
h : ∀ (j : Discrete J), m ≫ NatTrans.app (Bicone.toCone b).π j = NatTrans.app s.π j
j : J
a✝ : j ∈ Finset.univ
⊢ m ≫ Bicone.π b j ≫ Bicone.ι b j = NatTrans.app s.π { as := j } ≫ Bicone.ι b j
[PROOFSTEP]
have reassoced : m ≫ Bicone.π b j ≫ Bicone.ι b j = s.π.app ⟨j⟩ ≫ Bicone.ι b j := by
  erw [← Category.assoc, eq_whisker (h ⟨j⟩)]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cone (Discrete.functor f)
m : s.pt ⟶ (Bicone.toCone b).pt
h : ∀ (j : Discrete J), m ≫ NatTrans.app (Bicone.toCone b).π j = NatTrans.app s.π j
j : J
a✝ : j ∈ Finset.univ
⊢ m ≫ Bicone.π b j ≫ Bicone.ι b j = NatTrans.app s.π { as := j } ≫ Bicone.ι b j
[PROOFSTEP]
erw [← Category.assoc, eq_whisker (h ⟨j⟩)]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cone (Discrete.functor f)
m : s.pt ⟶ (Bicone.toCone b).pt
h : ∀ (j : Discrete J), m ≫ NatTrans.app (Bicone.toCone b).π j = NatTrans.app s.π j
j : J
a✝ : j ∈ Finset.univ
reassoced : m ≫ Bicone.π b j ≫ Bicone.ι b j = NatTrans.app s.π { as := j } ≫ Bicone.ι b j
⊢ m ≫ Bicone.π b j ≫ Bicone.ι b j = NatTrans.app s.π { as := j } ≫ Bicone.ι b j
[PROOFSTEP]
rw [reassoced]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cocone (Discrete.functor f)
j : Discrete J
⊢ NatTrans.app (Bicone.toCocone b).ι j ≫ (fun s => ∑ j : J, Bicone.π b j ≫ NatTrans.app s.ι { as := j }) s =
    NatTrans.app s.ι j
[PROOFSTEP]
cases j
[GOAL]
case mk
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cocone (Discrete.functor f)
as✝ : J
⊢ NatTrans.app (Bicone.toCocone b).ι { as := as✝ } ≫ (fun s => ∑ j : J, Bicone.π b j ≫ NatTrans.app s.ι { as := j }) s =
    NatTrans.app s.ι { as := as✝ }
[PROOFSTEP]
simp only [comp_sum, ← Category.assoc, Bicone.toCocone_ι_app, b.ι_π, dite_comp]
[GOAL]
case mk
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cocone (Discrete.functor f)
as✝ : J
⊢ (∑ x : J,
      if h : as✝ = x then eqToHom (_ : f as✝ = f x) ≫ NatTrans.app s.ι { as := x }
      else 0 ≫ NatTrans.app s.ι { as := x }) =
    NatTrans.app s.ι { as := as✝ }
[PROOFSTEP]
dsimp
[GOAL]
case mk
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cocone (Discrete.functor f)
as✝ : J
⊢ (∑ x : J,
      if h : as✝ = x then eqToHom (_ : f as✝ = f x) ≫ NatTrans.app s.ι { as := x }
      else 0 ≫ NatTrans.app s.ι { as := x }) =
    NatTrans.app s.ι { as := as✝ }
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cocone (Discrete.functor f)
m : (Bicone.toCocone b).pt ⟶ s.pt
h : ∀ (j : Discrete J), NatTrans.app (Bicone.toCocone b).ι j ≫ m = NatTrans.app s.ι j
⊢ m = (fun s => ∑ j : J, Bicone.π b j ≫ NatTrans.app s.ι { as := j }) s
[PROOFSTEP]
erw [← Category.id_comp m, ← total, sum_comp]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cocone (Discrete.functor f)
m : (Bicone.toCocone b).pt ⟶ s.pt
h : ∀ (j : Discrete J), NatTrans.app (Bicone.toCocone b).ι j ≫ m = NatTrans.app s.ι j
⊢ ∑ j : J, (Bicone.π b j ≫ Bicone.ι b j) ≫ m = (fun s => ∑ j : J, Bicone.π b j ≫ NatTrans.app s.ι { as := j }) s
[PROOFSTEP]
apply Finset.sum_congr rfl
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cocone (Discrete.functor f)
m : (Bicone.toCocone b).pt ⟶ s.pt
h : ∀ (j : Discrete J), NatTrans.app (Bicone.toCocone b).ι j ≫ m = NatTrans.app s.ι j
⊢ ∀ (x : J), x ∈ Finset.univ → (Bicone.π b x ≫ Bicone.ι b x) ≫ m = Bicone.π b x ≫ NatTrans.app s.ι { as := x }
[PROOFSTEP]
intro j _
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
total : ∑ j : J, Bicone.π b j ≫ Bicone.ι b j = 𝟙 b.pt
s : Cocone (Discrete.functor f)
m : (Bicone.toCocone b).pt ⟶ s.pt
h : ∀ (j : Discrete J), NatTrans.app (Bicone.toCocone b).ι j ≫ m = NatTrans.app s.ι j
j : J
a✝ : j ∈ Finset.univ
⊢ (Bicone.π b j ≫ Bicone.ι b j) ≫ m = Bicone.π b j ≫ NatTrans.app s.ι { as := j }
[PROOFSTEP]
erw [Category.assoc, h ⟨j⟩]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
i : Bicone.IsBilimit b
j : Discrete J
⊢ (∑ j : J, Bicone.π b j ≫ Bicone.ι b j) ≫ NatTrans.app (Bicone.toCone b).π j =
    𝟙 b.pt ≫ NatTrans.app (Bicone.toCone b).π j
[PROOFSTEP]
cases j
[GOAL]
case mk
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
b : Bicone f
i : Bicone.IsBilimit b
as✝ : J
⊢ (∑ j : J, Bicone.π b j ≫ Bicone.ι b j) ≫ NatTrans.app (Bicone.toCone b).π { as := as✝ } =
    𝟙 b.pt ≫ NatTrans.app (Bicone.toCone b).π { as := as✝ }
[PROOFSTEP]
simp [sum_comp, b.ι_π, comp_dite]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
t : Bicone f
ht : IsLimit (Bicone.toCone t)
j : Discrete J
⊢ (∑ j : J, Bicone.π t j ≫ Bicone.ι t j) ≫ NatTrans.app (Bicone.toCone t).π j =
    𝟙 t.pt ≫ NatTrans.app (Bicone.toCone t).π j
[PROOFSTEP]
cases j
[GOAL]
case mk
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
t : Bicone f
ht : IsLimit (Bicone.toCone t)
as✝ : J
⊢ (∑ j : J, Bicone.π t j ≫ Bicone.ι t j) ≫ NatTrans.app (Bicone.toCone t).π { as := as✝ } =
    𝟙 t.pt ≫ NatTrans.app (Bicone.toCone t).π { as := as✝ }
[PROOFSTEP]
simp [sum_comp, t.ι_π, dite_comp, comp_dite]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
t : Cone (Discrete.functor f)
ht : IsLimit t
⊢ ∀ (j : Discrete J),
    NatTrans.app t.π j = (Iso.refl t.pt).hom ≫ NatTrans.app (Bicone.toCone (Bicone.ofLimitCone ht)).π j
[PROOFSTEP]
rintro ⟨j⟩
[GOAL]
case mk
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
t : Cone (Discrete.functor f)
ht : IsLimit t
j : J
⊢ NatTrans.app t.π { as := j } =
    (Iso.refl t.pt).hom ≫ NatTrans.app (Bicone.toCone (Bicone.ofLimitCone ht)).π { as := j }
[PROOFSTEP]
aesop_cat
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J✝ : Type
inst✝² : Fintype J✝
J : Type
inst✝¹ : Finite J
f : J → C
inst✝ : HasProduct f
⊢ HasBiproduct f
[PROOFSTEP]
cases nonempty_fintype J
[GOAL]
case intro
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J✝ : Type
inst✝² : Fintype J✝
J : Type
inst✝¹ : Finite J
f : J → C
inst✝ : HasProduct f
val✝ : Fintype J
⊢ HasBiproduct f
[PROOFSTEP]
apply
  HasBiproduct.mk
    { bicone := _
      isBilimit := biconeIsBilimitOfLimitConeOfIsLimit (limit.isLimit _) }
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
t : Bicone f
ht : IsColimit (Bicone.toCocone t)
j : Discrete J
⊢ NatTrans.app (Bicone.toCocone t).ι j ≫ ∑ j : J, Bicone.π t j ≫ Bicone.ι t j =
    NatTrans.app (Bicone.toCocone t).ι j ≫ 𝟙 t.pt
[PROOFSTEP]
cases j
[GOAL]
case mk
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
t : Bicone f
ht : IsColimit (Bicone.toCocone t)
as✝ : J
⊢ NatTrans.app (Bicone.toCocone t).ι { as := as✝ } ≫ ∑ j : J, Bicone.π t j ≫ Bicone.ι t j =
    NatTrans.app (Bicone.toCocone t).ι { as := as✝ } ≫ 𝟙 t.pt
[PROOFSTEP]
simp_rw [Bicone.toCocone_ι_app, comp_sum, ← Category.assoc, t.ι_π, dite_comp]
[GOAL]
case mk
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
t : Bicone f
ht : IsColimit (Bicone.toCocone t)
as✝ : J
⊢ (∑ x : J, if h : as✝ = x then eqToHom (_ : f as✝ = f x) ≫ Bicone.ι t x else 0 ≫ Bicone.ι t x) =
    Bicone.ι t as✝ ≫ 𝟙 t.pt
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
t : Cocone (Discrete.functor f)
ht : IsColimit t
⊢ ∀ (j : Discrete J),
    NatTrans.app t.ι j ≫ (Iso.refl t.pt).hom = NatTrans.app (Bicone.toCocone (Bicone.ofColimitCocone ht)).ι j
[PROOFSTEP]
rintro ⟨j⟩
[GOAL]
case mk
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
f : J → C
t : Cocone (Discrete.functor f)
ht : IsColimit t
j : J
⊢ NatTrans.app t.ι { as := j } ≫ (Iso.refl t.pt).hom =
    NatTrans.app (Bicone.toCocone (Bicone.ofColimitCocone ht)).ι { as := j }
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J✝ : Type
inst✝² : Fintype J✝
J : Type
inst✝¹ : Finite J
f : J → C
inst✝ : HasCoproduct f
⊢ HasBiproduct f
[PROOFSTEP]
cases nonempty_fintype J
[GOAL]
case intro
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J✝ : Type
inst✝² : Fintype J✝
J : Type
inst✝¹ : Finite J
f : J → C
inst✝ : HasCoproduct f
val✝ : Fintype J
⊢ HasBiproduct f
[PROOFSTEP]
exact
  HasBiproduct.mk
    { bicone := _
      isBilimit := biconeIsBilimitOfColimitCoconeOfIsColimit (colimit.isColimit _) }
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
f : J → C
inst✝ : HasBiproduct f
T : C
g : (j : J) → T ⟶ f j
⊢ lift g = ∑ j : J, g j ≫ ι f j
[PROOFSTEP]
ext j
[GOAL]
case w
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
f : J → C
inst✝ : HasBiproduct f
T : C
g : (j : J) → T ⟶ f j
j : J
⊢ lift g ≫ π (fun b => f b) j = (∑ j : J, g j ≫ ι f j) ≫ π (fun b => f b) j
[PROOFSTEP]
simp only [sum_comp, biproduct.ι_π, comp_dite, biproduct.lift_π, Category.assoc, comp_zero, Finset.sum_dite_eq',
  Finset.mem_univ, eqToHom_refl, Category.comp_id, if_true]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
f : J → C
inst✝ : HasBiproduct f
T : C
g : (j : J) → f j ⟶ T
⊢ desc g = ∑ j : J, π f j ≫ g j
[PROOFSTEP]
ext j
[GOAL]
case w
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
f : J → C
inst✝ : HasBiproduct f
T : C
g : (j : J) → f j ⟶ T
j : J
⊢ ι (fun b => f b) j ≫ desc g = ι (fun b => f b) j ≫ ∑ j : J, π f j ≫ g j
[PROOFSTEP]
simp [comp_sum, biproduct.ι_π_assoc, dite_comp]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
f : J → C
inst✝ : HasBiproduct f
T U : C
g : (j : J) → T ⟶ f j
h : (j : J) → f j ⟶ U
⊢ lift g ≫ desc h = ∑ j : J, g j ≫ h j
[PROOFSTEP]
simp [biproduct.lift_eq, biproduct.desc_eq, comp_sum, sum_comp, biproduct.ι_π_assoc, comp_dite, dite_comp]
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
f✝ : J → C
inst✝¹ : HasBiproduct f✝
inst✝ : HasFiniteBiproducts C
f g : J → C
h : (j : J) → f j ⟶ g j
⊢ map h = ∑ j : J, π f j ≫ h j ≫ ι g j
[PROOFSTEP]
ext
[GOAL]
case w.w
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
f✝ : J → C
inst✝¹ : HasBiproduct f✝
inst✝ : HasFiniteBiproducts C
f g : J → C
h : (j : J) → f j ⟶ g j
j✝¹ j✝ : J
⊢ ι (fun b => f b) j✝ ≫ map h ≫ π (fun b => g b) j✝¹ =
    ι (fun b => f b) j✝ ≫ (∑ j : J, π f j ≫ h j ≫ ι g j) ≫ π (fun b => g b) j✝¹
[PROOFSTEP]
simp [biproduct.ι_π, biproduct.ι_π_assoc, comp_sum, sum_comp, comp_dite, dite_comp]
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
J : Type
inst✝³ : Fintype J
f✝ : J → C
inst✝² : HasBiproduct f✝
K : Type
inst✝¹ : Fintype K
inst✝ : HasFiniteBiproducts C
f : J → C
g : K → C
m : (j : J) → (k : K) → f j ⟶ g k
P : C
x : (k : K) → g k ⟶ P
⊢ matrix m ≫ desc x = desc fun j => ∑ k : K, m j k ≫ x k
[PROOFSTEP]
ext
[GOAL]
case w
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
J : Type
inst✝³ : Fintype J
f✝ : J → C
inst✝² : HasBiproduct f✝
K : Type
inst✝¹ : Fintype K
inst✝ : HasFiniteBiproducts C
f : J → C
g : K → C
m : (j : J) → (k : K) → f j ⟶ g k
P : C
x : (k : K) → g k ⟶ P
j✝ : J
⊢ ι (fun j => f j) j✝ ≫ matrix m ≫ desc x = ι (fun j => f j) j✝ ≫ desc fun j => ∑ k : K, m j k ≫ x k
[PROOFSTEP]
simp [lift_desc]
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
J : Type
inst✝³ : Fintype J
f✝ : J → C
inst✝² : HasBiproduct f✝
K : Type
inst✝¹ : Fintype K
inst✝ : HasFiniteBiproducts C
f : J → C
g : K → C
P : C
x : (j : J) → P ⟶ f j
m : (j : J) → (k : K) → f j ⟶ g k
⊢ lift x ≫ matrix m = lift fun k => ∑ j : J, x j ≫ m j k
[PROOFSTEP]
ext
[GOAL]
case w
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
J : Type
inst✝³ : Fintype J
f✝ : J → C
inst✝² : HasBiproduct f✝
K : Type
inst✝¹ : Fintype K
inst✝ : HasFiniteBiproducts C
f : J → C
g : K → C
P : C
x : (j : J) → P ⟶ f j
m : (j : J) → (k : K) → f j ⟶ g k
j✝ : K
⊢ (lift x ≫ matrix m) ≫ π (fun k => g k) j✝ = (lift fun k => ∑ j : J, x j ≫ m j k) ≫ π (fun k => g k) j✝
[PROOFSTEP]
simp [biproduct.lift_desc]
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
J : Type
inst✝³ : Fintype J
f✝ : J → C
inst✝² : HasBiproduct f✝
K : Type
inst✝¹ : Fintype K
inst✝ : HasFiniteBiproducts C
f : J → C
g h : K → C
m : (j : J) → (k : K) → f j ⟶ g k
n : (k : K) → g k ⟶ h k
⊢ matrix m ≫ map n = matrix fun j k => m j k ≫ n k
[PROOFSTEP]
ext
[GOAL]
case w.w
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
J : Type
inst✝³ : Fintype J
f✝ : J → C
inst✝² : HasBiproduct f✝
K : Type
inst✝¹ : Fintype K
inst✝ : HasFiniteBiproducts C
f : J → C
g h : K → C
m : (j : J) → (k : K) → f j ⟶ g k
n : (k : K) → g k ⟶ h k
j✝¹ : K
j✝ : J
⊢ ι (fun j => f j) j✝ ≫ (matrix m ≫ map n) ≫ π (fun b => h b) j✝¹ =
    ι (fun j => f j) j✝ ≫ (matrix fun j k => m j k ≫ n k) ≫ π (fun b => h b) j✝¹
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
J : Type
inst✝³ : Fintype J
f✝ : J → C
inst✝² : HasBiproduct f✝
K : Type
inst✝¹ : Fintype K
inst✝ : HasFiniteBiproducts C
f g : J → C
h : K → C
m : (k : J) → f k ⟶ g k
n : (j : J) → (k : K) → g j ⟶ h k
⊢ map m ≫ matrix n = matrix fun j k => m j ≫ n j k
[PROOFSTEP]
ext
[GOAL]
case w.w
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
J : Type
inst✝³ : Fintype J
f✝ : J → C
inst✝² : HasBiproduct f✝
K : Type
inst✝¹ : Fintype K
inst✝ : HasFiniteBiproducts C
f g : J → C
h : K → C
m : (k : J) → f k ⟶ g k
n : (j : J) → (k : K) → g j ⟶ h k
j✝¹ : K
j✝ : J
⊢ ι (fun b => f b) j✝ ≫ (map m ≫ matrix n) ≫ π (fun k => h k) j✝¹ =
    ι (fun b => f b) j✝ ≫ (matrix fun j k => m j ≫ n j k) ≫ π (fun k => h k) j✝¹
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
J : Type
inst✝⁵ : Fintype J
β γ : Type
inst✝⁴ : Fintype β
inst✝³ : DecidableEq β
inst✝² : DecidableEq γ
ε : β ≃ γ
f : γ → C
inst✝¹ : HasBiproduct f
inst✝ : HasBiproduct (f ∘ ↑ε)
⊢ ((desc fun b => ι f (↑ε b)) ≫ lift fun b => π f (↑ε b)) = 𝟙 (⨁ f ∘ ↑ε)
[PROOFSTEP]
ext b b'
[GOAL]
case w.w
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
J : Type
inst✝⁵ : Fintype J
β γ : Type
inst✝⁴ : Fintype β
inst✝³ : DecidableEq β
inst✝² : DecidableEq γ
ε : β ≃ γ
f : γ → C
inst✝¹ : HasBiproduct f
inst✝ : HasBiproduct (f ∘ ↑ε)
b b' : β
⊢ ι (f ∘ ↑ε) b' ≫ ((desc fun b => ι f (↑ε b)) ≫ lift fun b => π f (↑ε b)) ≫ π (f ∘ ↑ε) b =
    ι (f ∘ ↑ε) b' ≫ 𝟙 (⨁ f ∘ ↑ε) ≫ π (f ∘ ↑ε) b
[PROOFSTEP]
by_cases h : b' = b
[GOAL]
case pos
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
J : Type
inst✝⁵ : Fintype J
β γ : Type
inst✝⁴ : Fintype β
inst✝³ : DecidableEq β
inst✝² : DecidableEq γ
ε : β ≃ γ
f : γ → C
inst✝¹ : HasBiproduct f
inst✝ : HasBiproduct (f ∘ ↑ε)
b b' : β
h : b' = b
⊢ ι (f ∘ ↑ε) b' ≫ ((desc fun b => ι f (↑ε b)) ≫ lift fun b => π f (↑ε b)) ≫ π (f ∘ ↑ε) b =
    ι (f ∘ ↑ε) b' ≫ 𝟙 (⨁ f ∘ ↑ε) ≫ π (f ∘ ↑ε) b
[PROOFSTEP]
subst h
[GOAL]
case pos
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
J : Type
inst✝⁵ : Fintype J
β γ : Type
inst✝⁴ : Fintype β
inst✝³ : DecidableEq β
inst✝² : DecidableEq γ
ε : β ≃ γ
f : γ → C
inst✝¹ : HasBiproduct f
inst✝ : HasBiproduct (f ∘ ↑ε)
b' : β
⊢ ι (f ∘ ↑ε) b' ≫ ((desc fun b => ι f (↑ε b)) ≫ lift fun b => π f (↑ε b)) ≫ π (f ∘ ↑ε) b' =
    ι (f ∘ ↑ε) b' ≫ 𝟙 (⨁ f ∘ ↑ε) ≫ π (f ∘ ↑ε) b'
[PROOFSTEP]
simp
[GOAL]
case neg
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
J : Type
inst✝⁵ : Fintype J
β γ : Type
inst✝⁴ : Fintype β
inst✝³ : DecidableEq β
inst✝² : DecidableEq γ
ε : β ≃ γ
f : γ → C
inst✝¹ : HasBiproduct f
inst✝ : HasBiproduct (f ∘ ↑ε)
b b' : β
h : ¬b' = b
⊢ ι (f ∘ ↑ε) b' ≫ ((desc fun b => ι f (↑ε b)) ≫ lift fun b => π f (↑ε b)) ≫ π (f ∘ ↑ε) b =
    ι (f ∘ ↑ε) b' ≫ 𝟙 (⨁ f ∘ ↑ε) ≫ π (f ∘ ↑ε) b
[PROOFSTEP]
have : ε b' ≠ ε b := by simp [h]
[GOAL]
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
J : Type
inst✝⁵ : Fintype J
β γ : Type
inst✝⁴ : Fintype β
inst✝³ : DecidableEq β
inst✝² : DecidableEq γ
ε : β ≃ γ
f : γ → C
inst✝¹ : HasBiproduct f
inst✝ : HasBiproduct (f ∘ ↑ε)
b b' : β
h : ¬b' = b
⊢ ↑ε b' ≠ ↑ε b
[PROOFSTEP]
simp [h]
[GOAL]
case neg
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
J : Type
inst✝⁵ : Fintype J
β γ : Type
inst✝⁴ : Fintype β
inst✝³ : DecidableEq β
inst✝² : DecidableEq γ
ε : β ≃ γ
f : γ → C
inst✝¹ : HasBiproduct f
inst✝ : HasBiproduct (f ∘ ↑ε)
b b' : β
h : ¬b' = b
this : ↑ε b' ≠ ↑ε b
⊢ ι (f ∘ ↑ε) b' ≫ ((desc fun b => ι f (↑ε b)) ≫ lift fun b => π f (↑ε b)) ≫ π (f ∘ ↑ε) b =
    ι (f ∘ ↑ε) b' ≫ 𝟙 (⨁ f ∘ ↑ε) ≫ π (f ∘ ↑ε) b
[PROOFSTEP]
simp [biproduct.ι_π_ne _ h, biproduct.ι_π_ne _ this]
[GOAL]
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
J : Type
inst✝⁵ : Fintype J
β γ : Type
inst✝⁴ : Fintype β
inst✝³ : DecidableEq β
inst✝² : DecidableEq γ
ε : β ≃ γ
f : γ → C
inst✝¹ : HasBiproduct f
inst✝ : HasBiproduct (f ∘ ↑ε)
⊢ ((lift fun b => π f (↑ε b)) ≫ desc fun b => ι f (↑ε b)) = 𝟙 (⨁ f)
[PROOFSTEP]
ext g g'
[GOAL]
case w.w
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
J : Type
inst✝⁵ : Fintype J
β γ : Type
inst✝⁴ : Fintype β
inst✝³ : DecidableEq β
inst✝² : DecidableEq γ
ε : β ≃ γ
f : γ → C
inst✝¹ : HasBiproduct f
inst✝ : HasBiproduct (f ∘ ↑ε)
g g' : γ
⊢ ι f g' ≫ ((lift fun b => π f (↑ε b)) ≫ desc fun b => ι f (↑ε b)) ≫ π f g = ι f g' ≫ 𝟙 (⨁ f) ≫ π f g
[PROOFSTEP]
by_cases h : g' = g
[GOAL]
case pos
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
J : Type
inst✝⁵ : Fintype J
β γ : Type
inst✝⁴ : Fintype β
inst✝³ : DecidableEq β
inst✝² : DecidableEq γ
ε : β ≃ γ
f : γ → C
inst✝¹ : HasBiproduct f
inst✝ : HasBiproduct (f ∘ ↑ε)
g g' : γ
h : g' = g
⊢ ι f g' ≫ ((lift fun b => π f (↑ε b)) ≫ desc fun b => ι f (↑ε b)) ≫ π f g = ι f g' ≫ 𝟙 (⨁ f) ≫ π f g
[PROOFSTEP]
simp [Preadditive.sum_comp, Preadditive.comp_sum, biproduct.lift_desc, biproduct.ι_π, biproduct.ι_π_assoc, comp_dite,
  Equiv.apply_eq_iff_eq_symm_apply, Finset.sum_dite_eq' Finset.univ (ε.symm g') _, h]
[GOAL]
case neg
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
J : Type
inst✝⁵ : Fintype J
β γ : Type
inst✝⁴ : Fintype β
inst✝³ : DecidableEq β
inst✝² : DecidableEq γ
ε : β ≃ γ
f : γ → C
inst✝¹ : HasBiproduct f
inst✝ : HasBiproduct (f ∘ ↑ε)
g g' : γ
h : ¬g' = g
⊢ ι f g' ≫ ((lift fun b => π f (↑ε b)) ≫ desc fun b => ι f (↑ε b)) ≫ π f g = ι f g' ≫ 𝟙 (⨁ f) ≫ π f g
[PROOFSTEP]
simp [Preadditive.sum_comp, Preadditive.comp_sum, biproduct.lift_desc, biproduct.ι_π, biproduct.ι_π_assoc, comp_dite,
  Equiv.apply_eq_iff_eq_symm_apply, Finset.sum_dite_eq' Finset.univ (ε.symm g') _, h]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
b : BinaryBicone X Y
total : b.fst ≫ b.inl + b.snd ≫ b.inr = 𝟙 b.pt
s : Cone (pair X Y)
j : Discrete WalkingPair
⊢ (fun s => BinaryFan.fst s ≫ b.inl + BinaryFan.snd s ≫ b.inr) s ≫ NatTrans.app (BinaryBicone.toCone b).π j =
    NatTrans.app s.π j
[PROOFSTEP]
rcases j with ⟨⟨⟩⟩
[GOAL]
case mk.left
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
b : BinaryBicone X Y
total : b.fst ≫ b.inl + b.snd ≫ b.inr = 𝟙 b.pt
s : Cone (pair X Y)
⊢ (fun s => BinaryFan.fst s ≫ b.inl + BinaryFan.snd s ≫ b.inr) s ≫
      NatTrans.app (BinaryBicone.toCone b).π { as := WalkingPair.left } =
    NatTrans.app s.π { as := WalkingPair.left }
[PROOFSTEP]
simp
[GOAL]
case mk.right
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
b : BinaryBicone X Y
total : b.fst ≫ b.inl + b.snd ≫ b.inr = 𝟙 b.pt
s : Cone (pair X Y)
⊢ (fun s => BinaryFan.fst s ≫ b.inl + BinaryFan.snd s ≫ b.inr) s ≫
      NatTrans.app (BinaryBicone.toCone b).π { as := WalkingPair.right } =
    NatTrans.app s.π { as := WalkingPair.right }
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
b : BinaryBicone X Y
total : b.fst ≫ b.inl + b.snd ≫ b.inr = 𝟙 b.pt
s : Cone (pair X Y)
m : s.pt ⟶ (BinaryBicone.toCone b).pt
h : ∀ (j : Discrete WalkingPair), m ≫ NatTrans.app (BinaryBicone.toCone b).π j = NatTrans.app s.π j
⊢ m = (fun s => BinaryFan.fst s ≫ b.inl + BinaryFan.snd s ≫ b.inr) s
[PROOFSTEP]
have reassoced (j : WalkingPair) {W : C} (h' : _ ⟶ W) : m ≫ b.toCone.π.app ⟨j⟩ ≫ h' = s.π.app ⟨j⟩ ≫ h' := by
  rw [← Category.assoc, eq_whisker (h ⟨j⟩)]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
b : BinaryBicone X Y
total : b.fst ≫ b.inl + b.snd ≫ b.inr = 𝟙 b.pt
s : Cone (pair X Y)
m : s.pt ⟶ (BinaryBicone.toCone b).pt
h : ∀ (j : Discrete WalkingPair), m ≫ NatTrans.app (BinaryBicone.toCone b).π j = NatTrans.app s.π j
j : WalkingPair
W : C
h' : (pair X Y).obj { as := j } ⟶ W
⊢ m ≫ NatTrans.app (BinaryBicone.toCone b).π { as := j } ≫ h' = NatTrans.app s.π { as := j } ≫ h'
[PROOFSTEP]
rw [← Category.assoc, eq_whisker (h ⟨j⟩)]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
b : BinaryBicone X Y
total : b.fst ≫ b.inl + b.snd ≫ b.inr = 𝟙 b.pt
s : Cone (pair X Y)
m : s.pt ⟶ (BinaryBicone.toCone b).pt
h : ∀ (j : Discrete WalkingPair), m ≫ NatTrans.app (BinaryBicone.toCone b).π j = NatTrans.app s.π j
reassoced :
  ∀ (j : WalkingPair) {W : C} (h' : (pair X Y).obj { as := j } ⟶ W),
    m ≫ NatTrans.app (BinaryBicone.toCone b).π { as := j } ≫ h' = NatTrans.app s.π { as := j } ≫ h'
⊢ m = (fun s => BinaryFan.fst s ≫ b.inl + BinaryFan.snd s ≫ b.inr) s
[PROOFSTEP]
erw [← Category.comp_id m, ← total, comp_add, reassoced WalkingPair.left, reassoced WalkingPair.right]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
b : BinaryBicone X Y
total : b.fst ≫ b.inl + b.snd ≫ b.inr = 𝟙 b.pt
s : Cocone (pair X Y)
j : Discrete WalkingPair
⊢ NatTrans.app (BinaryBicone.toCocone b).ι j ≫ (fun s => b.fst ≫ BinaryCofan.inl s + b.snd ≫ BinaryCofan.inr s) s =
    NatTrans.app s.ι j
[PROOFSTEP]
rcases j with ⟨⟨⟩⟩
[GOAL]
case mk.left
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
b : BinaryBicone X Y
total : b.fst ≫ b.inl + b.snd ≫ b.inr = 𝟙 b.pt
s : Cocone (pair X Y)
⊢ NatTrans.app (BinaryBicone.toCocone b).ι { as := WalkingPair.left } ≫
      (fun s => b.fst ≫ BinaryCofan.inl s + b.snd ≫ BinaryCofan.inr s) s =
    NatTrans.app s.ι { as := WalkingPair.left }
[PROOFSTEP]
simp
[GOAL]
case mk.right
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
b : BinaryBicone X Y
total : b.fst ≫ b.inl + b.snd ≫ b.inr = 𝟙 b.pt
s : Cocone (pair X Y)
⊢ NatTrans.app (BinaryBicone.toCocone b).ι { as := WalkingPair.right } ≫
      (fun s => b.fst ≫ BinaryCofan.inl s + b.snd ≫ BinaryCofan.inr s) s =
    NatTrans.app s.ι { as := WalkingPair.right }
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
b : BinaryBicone X Y
total : b.fst ≫ b.inl + b.snd ≫ b.inr = 𝟙 b.pt
s : Cocone (pair X Y)
m : (BinaryBicone.toCocone b).pt ⟶ s.pt
h : ∀ (j : Discrete WalkingPair), NatTrans.app (BinaryBicone.toCocone b).ι j ≫ m = NatTrans.app s.ι j
⊢ m = (fun s => b.fst ≫ BinaryCofan.inl s + b.snd ≫ BinaryCofan.inr s) s
[PROOFSTEP]
erw [← Category.id_comp m, ← total, add_comp, Category.assoc, Category.assoc, h ⟨WalkingPair.left⟩,
  h ⟨WalkingPair.right⟩]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
b : BinaryBicone X Y
i : BinaryBicone.IsBilimit b
j : Discrete WalkingPair
⊢ (b.fst ≫ b.inl + b.snd ≫ b.inr) ≫ NatTrans.app (BinaryBicone.toCone b).π j =
    𝟙 b.pt ≫ NatTrans.app (BinaryBicone.toCone b).π j
[PROOFSTEP]
rcases j with ⟨⟨⟩⟩
[GOAL]
case mk.left
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
b : BinaryBicone X Y
i : BinaryBicone.IsBilimit b
⊢ (b.fst ≫ b.inl + b.snd ≫ b.inr) ≫ NatTrans.app (BinaryBicone.toCone b).π { as := WalkingPair.left } =
    𝟙 b.pt ≫ NatTrans.app (BinaryBicone.toCone b).π { as := WalkingPair.left }
[PROOFSTEP]
simp
[GOAL]
case mk.right
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
b : BinaryBicone X Y
i : BinaryBicone.IsBilimit b
⊢ (b.fst ≫ b.inl + b.snd ≫ b.inr) ≫ NatTrans.app (BinaryBicone.toCone b).π { as := WalkingPair.right } =
    𝟙 b.pt ≫ NatTrans.app (BinaryBicone.toCone b).π { as := WalkingPair.right }
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsLimit (BinaryBicone.toCone t)
⊢ t.inl = IsLimit.lift ht (BinaryFan.mk (𝟙 X) 0)
[PROOFSTEP]
apply ht.uniq (BinaryFan.mk (𝟙 X) 0)
[GOAL]
case x
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsLimit (BinaryBicone.toCone t)
⊢ ∀ (j : Discrete WalkingPair),
    t.inl ≫ NatTrans.app (BinaryBicone.toCone t).π j = NatTrans.app (BinaryFan.mk (𝟙 X) 0).π j
[PROOFSTEP]
rintro ⟨⟨⟩⟩
[GOAL]
case x.mk.left
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsLimit (BinaryBicone.toCone t)
⊢ t.inl ≫ NatTrans.app (BinaryBicone.toCone t).π { as := WalkingPair.left } =
    NatTrans.app (BinaryFan.mk (𝟙 X) 0).π { as := WalkingPair.left }
[PROOFSTEP]
dsimp
[GOAL]
case x.mk.right
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsLimit (BinaryBicone.toCone t)
⊢ t.inl ≫ NatTrans.app (BinaryBicone.toCone t).π { as := WalkingPair.right } =
    NatTrans.app (BinaryFan.mk (𝟙 X) 0).π { as := WalkingPair.right }
[PROOFSTEP]
dsimp
[GOAL]
case x.mk.left
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsLimit (BinaryBicone.toCone t)
⊢ t.inl ≫ t.fst = 𝟙 X
[PROOFSTEP]
simp
[GOAL]
case x.mk.right
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsLimit (BinaryBicone.toCone t)
⊢ t.inl ≫ t.snd = 0
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsLimit (BinaryBicone.toCone t)
⊢ t.inr = IsLimit.lift ht (BinaryFan.mk 0 (𝟙 Y))
[PROOFSTEP]
apply ht.uniq (BinaryFan.mk 0 (𝟙 Y))
[GOAL]
case x
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsLimit (BinaryBicone.toCone t)
⊢ ∀ (j : Discrete WalkingPair),
    t.inr ≫ NatTrans.app (BinaryBicone.toCone t).π j = NatTrans.app (BinaryFan.mk 0 (𝟙 Y)).π j
[PROOFSTEP]
rintro ⟨⟨⟩⟩
[GOAL]
case x.mk.left
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsLimit (BinaryBicone.toCone t)
⊢ t.inr ≫ NatTrans.app (BinaryBicone.toCone t).π { as := WalkingPair.left } =
    NatTrans.app (BinaryFan.mk 0 (𝟙 Y)).π { as := WalkingPair.left }
[PROOFSTEP]
dsimp
[GOAL]
case x.mk.right
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsLimit (BinaryBicone.toCone t)
⊢ t.inr ≫ NatTrans.app (BinaryBicone.toCone t).π { as := WalkingPair.right } =
    NatTrans.app (BinaryFan.mk 0 (𝟙 Y)).π { as := WalkingPair.right }
[PROOFSTEP]
dsimp
[GOAL]
case x.mk.left
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsLimit (BinaryBicone.toCone t)
⊢ t.inr ≫ t.fst = 0
[PROOFSTEP]
simp
[GOAL]
case x.mk.right
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsLimit (BinaryBicone.toCone t)
⊢ t.inr ≫ t.snd = 𝟙 Y
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsLimit (BinaryBicone.toCone t)
⊢ t.fst ≫ t.inl + t.snd ≫ t.inr = 𝟙 t.pt
[PROOFSTEP]
refine' BinaryFan.IsLimit.hom_ext ht _ _
[GOAL]
case refine'_1
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsLimit (BinaryBicone.toCone t)
⊢ (t.fst ≫ t.inl + t.snd ≫ t.inr) ≫ BinaryFan.fst (BinaryBicone.toCone t) =
    𝟙 t.pt ≫ BinaryFan.fst (BinaryBicone.toCone t)
[PROOFSTEP]
simp
[GOAL]
case refine'_2
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsLimit (BinaryBicone.toCone t)
⊢ (t.fst ≫ t.inl + t.snd ≫ t.inr) ≫ BinaryFan.snd (BinaryBicone.toCone t) =
    𝟙 t.pt ≫ BinaryFan.snd (BinaryBicone.toCone t)
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : Cone (pair X Y)
ht : IsLimit t
⊢ ((BinaryBicone.ofLimitCone ht).fst ≫ (BinaryBicone.ofLimitCone ht).inl +
        (BinaryBicone.ofLimitCone ht).snd ≫ (BinaryBicone.ofLimitCone ht).inr) ≫
      BinaryFan.fst t =
    𝟙 (BinaryBicone.ofLimitCone ht).pt ≫ BinaryFan.fst t
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : Cone (pair X Y)
ht : IsLimit t
⊢ ((BinaryBicone.ofLimitCone ht).fst ≫ (BinaryBicone.ofLimitCone ht).inl +
        (BinaryBicone.ofLimitCone ht).snd ≫ (BinaryBicone.ofLimitCone ht).inr) ≫
      BinaryFan.snd t =
    𝟙 (BinaryBicone.ofLimitCone ht).pt ≫ BinaryFan.snd t
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsColimit (BinaryBicone.toCocone t)
⊢ t.fst = IsColimit.desc ht (BinaryCofan.mk (𝟙 X) 0)
[PROOFSTEP]
apply ht.uniq (BinaryCofan.mk (𝟙 X) 0)
[GOAL]
case x
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsColimit (BinaryBicone.toCocone t)
⊢ ∀ (j : Discrete WalkingPair),
    NatTrans.app (BinaryBicone.toCocone t).ι j ≫ t.fst = NatTrans.app (BinaryCofan.mk (𝟙 X) 0).ι j
[PROOFSTEP]
rintro ⟨⟨⟩⟩
[GOAL]
case x.mk.left
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsColimit (BinaryBicone.toCocone t)
⊢ NatTrans.app (BinaryBicone.toCocone t).ι { as := WalkingPair.left } ≫ t.fst =
    NatTrans.app (BinaryCofan.mk (𝟙 X) 0).ι { as := WalkingPair.left }
[PROOFSTEP]
dsimp
[GOAL]
case x.mk.right
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsColimit (BinaryBicone.toCocone t)
⊢ NatTrans.app (BinaryBicone.toCocone t).ι { as := WalkingPair.right } ≫ t.fst =
    NatTrans.app (BinaryCofan.mk (𝟙 X) 0).ι { as := WalkingPair.right }
[PROOFSTEP]
dsimp
[GOAL]
case x.mk.left
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsColimit (BinaryBicone.toCocone t)
⊢ t.inl ≫ t.fst = 𝟙 X
[PROOFSTEP]
simp
[GOAL]
case x.mk.right
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsColimit (BinaryBicone.toCocone t)
⊢ t.inr ≫ t.fst = 0
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsColimit (BinaryBicone.toCocone t)
⊢ t.snd = IsColimit.desc ht (BinaryCofan.mk 0 (𝟙 Y))
[PROOFSTEP]
apply ht.uniq (BinaryCofan.mk 0 (𝟙 Y))
[GOAL]
case x
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsColimit (BinaryBicone.toCocone t)
⊢ ∀ (j : Discrete WalkingPair),
    NatTrans.app (BinaryBicone.toCocone t).ι j ≫ t.snd = NatTrans.app (BinaryCofan.mk 0 (𝟙 Y)).ι j
[PROOFSTEP]
rintro ⟨⟨⟩⟩
[GOAL]
case x.mk.left
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsColimit (BinaryBicone.toCocone t)
⊢ NatTrans.app (BinaryBicone.toCocone t).ι { as := WalkingPair.left } ≫ t.snd =
    NatTrans.app (BinaryCofan.mk 0 (𝟙 Y)).ι { as := WalkingPair.left }
[PROOFSTEP]
dsimp
[GOAL]
case x.mk.right
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsColimit (BinaryBicone.toCocone t)
⊢ NatTrans.app (BinaryBicone.toCocone t).ι { as := WalkingPair.right } ≫ t.snd =
    NatTrans.app (BinaryCofan.mk 0 (𝟙 Y)).ι { as := WalkingPair.right }
[PROOFSTEP]
dsimp
[GOAL]
case x.mk.left
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsColimit (BinaryBicone.toCocone t)
⊢ t.inl ≫ t.snd = 0
[PROOFSTEP]
simp
[GOAL]
case x.mk.right
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsColimit (BinaryBicone.toCocone t)
⊢ t.inr ≫ t.snd = 𝟙 Y
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsColimit (BinaryBicone.toCocone t)
⊢ t.fst ≫ t.inl + t.snd ≫ t.inr = 𝟙 t.pt
[PROOFSTEP]
refine' BinaryCofan.IsColimit.hom_ext ht _ _
[GOAL]
case refine'_1
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsColimit (BinaryBicone.toCocone t)
⊢ BinaryCofan.inl (BinaryBicone.toCocone t) ≫ (t.fst ≫ t.inl + t.snd ≫ t.inr) =
    BinaryCofan.inl (BinaryBicone.toCocone t) ≫ 𝟙 t.pt
[PROOFSTEP]
simp
[GOAL]
case refine'_2
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : BinaryBicone X Y
ht : IsColimit (BinaryBicone.toCocone t)
⊢ BinaryCofan.inr (BinaryBicone.toCocone t) ≫ (t.fst ≫ t.inl + t.snd ≫ t.inr) =
    BinaryCofan.inr (BinaryBicone.toCocone t) ≫ 𝟙 t.pt
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : Cocone (pair X Y)
ht : IsColimit t
j : Discrete WalkingPair
⊢ NatTrans.app t.ι j ≫ (Iso.refl t.pt).hom = NatTrans.app (BinaryBicone.toCocone (BinaryBicone.ofColimitCocone ht)).ι j
[PROOFSTEP]
rcases j with ⟨⟨⟩⟩
[GOAL]
case mk.left
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : Cocone (pair X Y)
ht : IsColimit t
⊢ NatTrans.app t.ι { as := WalkingPair.left } ≫ (Iso.refl t.pt).hom =
    NatTrans.app (BinaryBicone.toCocone (BinaryBicone.ofColimitCocone ht)).ι { as := WalkingPair.left }
[PROOFSTEP]
simp
[GOAL]
case mk.right
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
J : Type
inst✝ : Fintype J
X Y : C
t : Cocone (pair X Y)
ht : IsColimit t
⊢ NatTrans.app t.ι { as := WalkingPair.right } ≫ (Iso.refl t.pt).hom =
    NatTrans.app (BinaryBicone.toCocone (BinaryBicone.ofColimitCocone ht)).ι { as := WalkingPair.right }
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X Y : C
inst✝ : HasBinaryBiproduct X Y
⊢ fst ≫ inl + snd ≫ inr = 𝟙 (X ⊞ Y)
[PROOFSTEP]
ext
[GOAL]
case h₀.h₀
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X Y : C
inst✝ : HasBinaryBiproduct X Y
⊢ (inl ≫ (fst ≫ inl + snd ≫ inr)) ≫ fst = (inl ≫ 𝟙 (X ⊞ Y)) ≫ fst
[PROOFSTEP]
simp [add_comp]
[GOAL]
case h₀.h₁
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X Y : C
inst✝ : HasBinaryBiproduct X Y
⊢ (inl ≫ (fst ≫ inl + snd ≫ inr)) ≫ snd = (inl ≫ 𝟙 (X ⊞ Y)) ≫ snd
[PROOFSTEP]
simp [add_comp]
[GOAL]
case h₁.h₀
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X Y : C
inst✝ : HasBinaryBiproduct X Y
⊢ (inr ≫ (fst ≫ inl + snd ≫ inr)) ≫ fst = (inr ≫ 𝟙 (X ⊞ Y)) ≫ fst
[PROOFSTEP]
simp [add_comp]
[GOAL]
case h₁.h₁
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X Y : C
inst✝ : HasBinaryBiproduct X Y
⊢ (inr ≫ (fst ≫ inl + snd ≫ inr)) ≫ snd = (inr ≫ 𝟙 (X ⊞ Y)) ≫ snd
[PROOFSTEP]
simp [add_comp]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X Y : C
inst✝ : HasBinaryBiproduct X Y
T : C
f : T ⟶ X
g : T ⟶ Y
⊢ lift f g = f ≫ inl + g ≫ inr
[PROOFSTEP]
ext
[GOAL]
case h₀
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X Y : C
inst✝ : HasBinaryBiproduct X Y
T : C
f : T ⟶ X
g : T ⟶ Y
⊢ lift f g ≫ fst = (f ≫ inl + g ≫ inr) ≫ fst
[PROOFSTEP]
simp [add_comp]
[GOAL]
case h₁
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X Y : C
inst✝ : HasBinaryBiproduct X Y
T : C
f : T ⟶ X
g : T ⟶ Y
⊢ lift f g ≫ snd = (f ≫ inl + g ≫ inr) ≫ snd
[PROOFSTEP]
simp [add_comp]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X Y : C
inst✝ : HasBinaryBiproduct X Y
T : C
f : X ⟶ T
g : Y ⟶ T
⊢ desc f g = fst ≫ f + snd ≫ g
[PROOFSTEP]
ext
[GOAL]
case h₀
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X Y : C
inst✝ : HasBinaryBiproduct X Y
T : C
f : X ⟶ T
g : Y ⟶ T
⊢ inl ≫ desc f g = inl ≫ (fst ≫ f + snd ≫ g)
[PROOFSTEP]
simp [add_comp]
[GOAL]
case h₁
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X Y : C
inst✝ : HasBinaryBiproduct X Y
T : C
f : X ⟶ T
g : Y ⟶ T
⊢ inr ≫ desc f g = inr ≫ (fst ≫ f + snd ≫ g)
[PROOFSTEP]
simp [add_comp]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X Y : C
inst✝ : HasBinaryBiproduct X Y
T U : C
f : T ⟶ X
g : T ⟶ Y
h : X ⟶ U
i : Y ⟶ U
⊢ lift f g ≫ desc h i = f ≫ h + g ≫ i
[PROOFSTEP]
simp [biprod.lift_eq, biprod.desc_eq]
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
inst✝ : HasBinaryBiproducts C
W X Y Z : C
f : W ⟶ Y
g : X ⟶ Z
⊢ map f g = fst ≫ f ≫ inl + snd ≫ g ≫ inr
[PROOFSTEP]
ext
[GOAL]
case h₀.h₀
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
inst✝ : HasBinaryBiproducts C
W X Y Z : C
f : W ⟶ Y
g : X ⟶ Z
⊢ (inl ≫ map f g) ≫ fst = (inl ≫ (fst ≫ f ≫ inl + snd ≫ g ≫ inr)) ≫ fst
[PROOFSTEP]
simp
[GOAL]
case h₀.h₁
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
inst✝ : HasBinaryBiproducts C
W X Y Z : C
f : W ⟶ Y
g : X ⟶ Z
⊢ (inl ≫ map f g) ≫ snd = (inl ≫ (fst ≫ f ≫ inl + snd ≫ g ≫ inr)) ≫ snd
[PROOFSTEP]
simp
[GOAL]
case h₁.h₀
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
inst✝ : HasBinaryBiproducts C
W X Y Z : C
f : W ⟶ Y
g : X ⟶ Z
⊢ (inr ≫ map f g) ≫ fst = (inr ≫ (fst ≫ f ≫ inl + snd ≫ g ≫ inr)) ≫ fst
[PROOFSTEP]
simp
[GOAL]
case h₁.h₁
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
inst✝ : HasBinaryBiproducts C
W X Y Z : C
f : W ⟶ Y
g : X ⟶ Z
⊢ (inr ≫ map f g) ≫ snd = (inr ≫ (fst ≫ f ≫ inl + snd ≫ g ≫ inr)) ≫ snd
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
⊢ (𝟙 Y - (𝟙 Y - retraction f ≫ f)) ≫ Cofork.π c = 0
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
c' : CokernelCofork (𝟙 Y - (𝟙 Y - retraction f ≫ f)) :=
  CokernelCofork.ofπ (Cofork.π c) (_ : (𝟙 Y - (𝟙 Y - retraction f ≫ f)) ≫ Cofork.π c = 0)
⊢ 𝟙 Y - (𝟙 Y - retraction f ≫ f) = retraction f ≫ f
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
c' : CokernelCofork (𝟙 Y - (𝟙 Y - retraction f ≫ f)) :=
  CokernelCofork.ofπ (Cofork.π c) (_ : (𝟙 Y - (𝟙 Y - retraction f ≫ f)) ≫ Cofork.π c = 0)
i' : IsColimit c' := isCokernelEpiComp i (retraction f) (_ : 𝟙 Y - (𝟙 Y - retraction f ≫ f) = retraction f ≫ f)
i'' : IsColimit (coforkOfCokernelCofork c') := isColimitCoforkOfCokernelCofork i'
⊢ (𝟙 Y - retraction f ≫ f) ≫ (𝟙 Y - retraction f ≫ f) = 𝟙 Y - retraction f ≫ f
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
⊢ f ≫ retraction f = 𝟙 X
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
⊢ f ≫ Cofork.π c = 0
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
⊢ (let c' := CokernelCofork.ofπ (Cofork.π c) (_ : (𝟙 Y - (𝟙 Y - retraction f ≫ f)) ≫ Cofork.π c = 0);
      let i' := isCokernelEpiComp i (retraction f) (_ : 𝟙 Y - (𝟙 Y - retraction f ≫ f) = retraction f ≫ f);
      let i'' := isColimitCoforkOfCokernelCofork i';
      (splitEpiOfIdempotentOfIsColimitCofork C
          (_ : (𝟙 Y - retraction f ≫ f) ≫ (𝟙 Y - retraction f ≫ f) = 𝟙 Y - retraction f ≫ f) i'').section_) ≫
      retraction f =
    0
[PROOFSTEP]
dsimp only
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
⊢ (splitEpiOfIdempotentOfIsColimitCofork C
          (_ : (𝟙 Y - retraction f ≫ f) ≫ (𝟙 Y - retraction f ≫ f) = 𝟙 Y - retraction f ≫ f)
          (isColimitCoforkOfCokernelCofork
            (isCokernelEpiComp i (retraction f) (_ : 𝟙 Y - (𝟙 Y - retraction f ≫ f) = retraction f ≫ f)))).section_ ≫
      retraction f =
    0
[PROOFSTEP]
rw [splitEpiOfIdempotentOfIsColimitCofork_section_, isColimitCoforkOfCokernelCofork_desc, isCokernelEpiComp_desc]
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
⊢ IsColimit.desc i
        (Cofork.ofπ
          (Cofork.π
            (cokernelCoforkOfCofork
              (Cofork.ofπ (𝟙 Y - retraction f ≫ f)
                (_ : 𝟙 Y ≫ (𝟙 Y - retraction f ≫ f) = (𝟙 Y - retraction f ≫ f) ≫ (𝟙 Y - retraction f ≫ f)))))
          (_ :
            f ≫
                Cofork.π
                  (cokernelCoforkOfCofork
                    (Cofork.ofπ (𝟙 Y - retraction f ≫ f)
                      (_ : 𝟙 Y ≫ (𝟙 Y - retraction f ≫ f) = (𝟙 Y - retraction f ≫ f) ≫ (𝟙 Y - retraction f ≫ f)))) =
              0 ≫
                Cofork.π
                  (cokernelCoforkOfCofork
                    (Cofork.ofπ (𝟙 Y - retraction f ≫ f)
                      (_ : 𝟙 Y ≫ (𝟙 Y - retraction f ≫ f) = (𝟙 Y - retraction f ≫ f) ≫ (𝟙 Y - retraction f ≫ f)))))) ≫
      retraction f =
    0
[PROOFSTEP]
dsimp only [cokernelCoforkOfCofork_ofπ]
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
⊢ IsColimit.desc i
        (Cofork.ofπ
          (Cofork.π
            (CokernelCofork.ofπ (𝟙 Y - retraction f ≫ f)
              (_ : (𝟙 Y - (𝟙 Y - retraction f ≫ f)) ≫ (𝟙 Y - retraction f ≫ f) = 0)))
          (_ :
            f ≫
                Cofork.π
                  (CokernelCofork.ofπ (𝟙 Y - retraction f ≫ f)
                    (_ : (𝟙 Y - (𝟙 Y - retraction f ≫ f)) ≫ (𝟙 Y - retraction f ≫ f) = 0)) =
              0 ≫
                Cofork.π
                  (CokernelCofork.ofπ (𝟙 Y - retraction f ≫ f)
                    (_ : (𝟙 Y - (𝟙 Y - retraction f ≫ f)) ≫ (𝟙 Y - retraction f ≫ f) = 0)))) ≫
      retraction f =
    0
[PROOFSTEP]
letI := epi_of_isColimit_cofork i
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
this : Epi (Cofork.π c) := epi_of_isColimit_cofork i
⊢ IsColimit.desc i
        (Cofork.ofπ
          (Cofork.π
            (CokernelCofork.ofπ (𝟙 Y - retraction f ≫ f)
              (_ : (𝟙 Y - (𝟙 Y - retraction f ≫ f)) ≫ (𝟙 Y - retraction f ≫ f) = 0)))
          (_ :
            f ≫
                Cofork.π
                  (CokernelCofork.ofπ (𝟙 Y - retraction f ≫ f)
                    (_ : (𝟙 Y - (𝟙 Y - retraction f ≫ f)) ≫ (𝟙 Y - retraction f ≫ f) = 0)) =
              0 ≫
                Cofork.π
                  (CokernelCofork.ofπ (𝟙 Y - retraction f ≫ f)
                    (_ : (𝟙 Y - (𝟙 Y - retraction f ≫ f)) ≫ (𝟙 Y - retraction f ≫ f) = 0)))) ≫
      retraction f =
    0
[PROOFSTEP]
apply zero_of_epi_comp c.π
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
this : Epi (Cofork.π c) := epi_of_isColimit_cofork i
⊢ Cofork.π c ≫
      IsColimit.desc i
          (Cofork.ofπ
            (Cofork.π
              (CokernelCofork.ofπ (𝟙 Y - retraction f ≫ f)
                (_ : (𝟙 Y - (𝟙 Y - retraction f ≫ f)) ≫ (𝟙 Y - retraction f ≫ f) = 0)))
            (_ :
              f ≫
                  Cofork.π
                    (CokernelCofork.ofπ (𝟙 Y - retraction f ≫ f)
                      (_ : (𝟙 Y - (𝟙 Y - retraction f ≫ f)) ≫ (𝟙 Y - retraction f ≫ f) = 0)) =
                0 ≫
                  Cofork.π
                    (CokernelCofork.ofπ (𝟙 Y - retraction f ≫ f)
                      (_ : (𝟙 Y - (𝟙 Y - retraction f ≫ f)) ≫ (𝟙 Y - retraction f ≫ f) = 0)))) ≫
        retraction f =
    0
[PROOFSTEP]
simp only [sub_comp, comp_sub, Category.comp_id, Category.assoc, IsSplitMono.id, sub_self,
  Cofork.IsColimit.π_desc_assoc, CokernelCofork.π_ofπ, IsSplitMono.id_assoc]
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
this : Epi (Cofork.π c) := epi_of_isColimit_cofork i
⊢ 𝟙 Y ≫ retraction f - retraction f = 0
[PROOFSTEP]
apply sub_eq_zero_of_eq
[GOAL]
case a
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
this : Epi (Cofork.π c) := epi_of_isColimit_cofork i
⊢ 𝟙 Y ≫ retraction f = retraction f
[PROOFSTEP]
apply Category.id_comp
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
⊢ (let c' := CokernelCofork.ofπ (Cofork.π c) (_ : (𝟙 Y - (𝟙 Y - retraction f ≫ f)) ≫ Cofork.π c = 0);
      let i' := isCokernelEpiComp i (retraction f) (_ : 𝟙 Y - (𝟙 Y - retraction f ≫ f) = retraction f ≫ f);
      let i'' := isColimitCoforkOfCokernelCofork i';
      (splitEpiOfIdempotentOfIsColimitCofork C
          (_ : (𝟙 Y - retraction f ≫ f) ≫ (𝟙 Y - retraction f ≫ f) = 𝟙 Y - retraction f ≫ f) i'').section_) ≫
      Cofork.π c =
    𝟙 c.pt
[PROOFSTEP]
apply SplitEpi.id
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
⊢ (binaryBiconeOfIsSplitMonoOfCokernel i).fst ≫ (binaryBiconeOfIsSplitMonoOfCokernel i).inl +
      (binaryBiconeOfIsSplitMonoOfCokernel i).snd ≫ (binaryBiconeOfIsSplitMonoOfCokernel i).inr =
    𝟙 (binaryBiconeOfIsSplitMonoOfCokernel i).pt
[PROOFSTEP]
simp only [binaryBiconeOfIsSplitMonoOfCokernel_fst, binaryBiconeOfIsSplitMonoOfCokernel_inr,
  binaryBiconeOfIsSplitMonoOfCokernel_snd, splitEpiOfIdempotentOfIsColimitCofork_section_]
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
⊢ retraction f ≫ (binaryBiconeOfIsSplitMonoOfCokernel i).inl +
      Cofork.π c ≫
        IsColimit.desc
          (isColimitCoforkOfCokernelCofork
            (isCokernelEpiComp i (retraction f) (_ : 𝟙 Y - (𝟙 Y - retraction f ≫ f) = retraction f ≫ f)))
          (Cofork.ofπ (𝟙 Y - retraction f ≫ f)
            (_ : 𝟙 Y ≫ (𝟙 Y - retraction f ≫ f) = (𝟙 Y - retraction f ≫ f) ≫ (𝟙 Y - retraction f ≫ f))) =
    𝟙 (binaryBiconeOfIsSplitMonoOfCokernel i).pt
[PROOFSTEP]
dsimp only [binaryBiconeOfIsSplitMonoOfCokernel_pt]
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
⊢ retraction f ≫ (binaryBiconeOfIsSplitMonoOfCokernel i).inl +
      Cofork.π c ≫
        IsColimit.desc
          (isColimitCoforkOfCokernelCofork
            (isCokernelEpiComp i (retraction f) (_ : 𝟙 Y - (𝟙 Y - retraction f ≫ f) = retraction f ≫ f)))
          (Cofork.ofπ (𝟙 Y - retraction f ≫ f)
            (_ : 𝟙 Y ≫ (𝟙 Y - retraction f ≫ f) = (𝟙 Y - retraction f ≫ f) ≫ (𝟙 Y - retraction f ≫ f))) =
    𝟙 Y
[PROOFSTEP]
rw [isColimitCoforkOfCokernelCofork_desc, isCokernelEpiComp_desc]
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitMono f
c : CokernelCofork f
i : IsColimit c
⊢ retraction f ≫ (binaryBiconeOfIsSplitMonoOfCokernel i).inl +
      Cofork.π c ≫
        IsColimit.desc i
          (Cofork.ofπ
            (Cofork.π
              (cokernelCoforkOfCofork
                (Cofork.ofπ (𝟙 Y - retraction f ≫ f)
                  (_ : 𝟙 Y ≫ (𝟙 Y - retraction f ≫ f) = (𝟙 Y - retraction f ≫ f) ≫ (𝟙 Y - retraction f ≫ f)))))
            (_ :
              f ≫
                  Cofork.π
                    (cokernelCoforkOfCofork
                      (Cofork.ofπ (𝟙 Y - retraction f ≫ f)
                        (_ : 𝟙 Y ≫ (𝟙 Y - retraction f ≫ f) = (𝟙 Y - retraction f ≫ f) ≫ (𝟙 Y - retraction f ≫ f)))) =
                0 ≫
                  Cofork.π
                    (cokernelCoforkOfCofork
                      (Cofork.ofπ (𝟙 Y - retraction f ≫ f)
                        (_ : 𝟙 Y ≫ (𝟙 Y - retraction f ≫ f) = (𝟙 Y - retraction f ≫ f) ≫ (𝟙 Y - retraction f ≫ f)))))) =
    𝟙 Y
[PROOFSTEP]
simp only [binaryBiconeOfIsSplitMonoOfCokernel_inl, Cofork.IsColimit.π_desc, cokernelCoforkOfCofork_π, Cofork.π_ofπ,
  add_sub_cancel'_right]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (sndKernelFork b)
T✝ : C
f : T✝ ⟶ X
g : T✝ ⟶ Y
⊢ (fun {T} f g => f ≫ b.inl + g ≫ b.inr) f g ≫ BinaryFan.fst (toCone b) = f
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (sndKernelFork b)
T✝ : C
f : T✝ ⟶ X
g : T✝ ⟶ Y
⊢ (fun {T} f g => f ≫ b.inl + g ≫ b.inr) f g ≫ BinaryFan.snd (toCone b) = g
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (sndKernelFork b)
T : C
f : T ⟶ X
g : T ⟶ Y
m : T ⟶ (toCone b).pt
h₁ : m ≫ BinaryFan.fst (toCone b) = f
h₂ : m ≫ BinaryFan.snd (toCone b) = g
⊢ m = (fun {T} f g => f ≫ b.inl + g ≫ b.inr) f g
[PROOFSTEP]
dsimp at m 
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (sndKernelFork b)
T : C
f : T ⟶ X
g : T ⟶ Y
m : T ⟶ b.pt
h₁ : m ≫ BinaryFan.fst (toCone b) = f
h₂ : m ≫ BinaryFan.snd (toCone b) = g
⊢ m = (fun {T} f g => f ≫ b.inl + g ≫ b.inr) f g
[PROOFSTEP]
have h₁' : ((m : T ⟶ b.pt) - (f ≫ b.inl + g ≫ b.inr)) ≫ b.fst = 0 := by simpa using sub_eq_zero.2 h₁
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (sndKernelFork b)
T : C
f : T ⟶ X
g : T ⟶ Y
m : T ⟶ b.pt
h₁ : m ≫ BinaryFan.fst (toCone b) = f
h₂ : m ≫ BinaryFan.snd (toCone b) = g
⊢ (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.fst = 0
[PROOFSTEP]
simpa using sub_eq_zero.2 h₁
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (sndKernelFork b)
T : C
f : T ⟶ X
g : T ⟶ Y
m : T ⟶ b.pt
h₁ : m ≫ BinaryFan.fst (toCone b) = f
h₂ : m ≫ BinaryFan.snd (toCone b) = g
h₁' : (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.fst = 0
⊢ m = (fun {T} f g => f ≫ b.inl + g ≫ b.inr) f g
[PROOFSTEP]
have h₂' : (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.snd = 0 := by simpa using sub_eq_zero.2 h₂
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (sndKernelFork b)
T : C
f : T ⟶ X
g : T ⟶ Y
m : T ⟶ b.pt
h₁ : m ≫ BinaryFan.fst (toCone b) = f
h₂ : m ≫ BinaryFan.snd (toCone b) = g
h₁' : (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.fst = 0
⊢ (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.snd = 0
[PROOFSTEP]
simpa using sub_eq_zero.2 h₂
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (sndKernelFork b)
T : C
f : T ⟶ X
g : T ⟶ Y
m : T ⟶ b.pt
h₁ : m ≫ BinaryFan.fst (toCone b) = f
h₂ : m ≫ BinaryFan.snd (toCone b) = g
h₁' : (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.fst = 0
h₂' : (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.snd = 0
⊢ m = (fun {T} f g => f ≫ b.inl + g ≫ b.inr) f g
[PROOFSTEP]
obtain ⟨q : T ⟶ X, hq : q ≫ b.inl = m - (f ≫ b.inl + g ≫ b.inr)⟩ := KernelFork.IsLimit.lift' hb _ h₂'
[GOAL]
case mk
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (sndKernelFork b)
T : C
f : T ⟶ X
g : T ⟶ Y
m : T ⟶ b.pt
h₁ : m ≫ BinaryFan.fst (toCone b) = f
h₂ : m ≫ BinaryFan.snd (toCone b) = g
h₁' : (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.fst = 0
h₂' : (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.snd = 0
q : T ⟶ X
hq : q ≫ b.inl = m - (f ≫ b.inl + g ≫ b.inr)
⊢ m = (fun {T} f g => f ≫ b.inl + g ≫ b.inr) f g
[PROOFSTEP]
rw [← sub_eq_zero, ← hq, ← Category.comp_id q, ← b.inl_fst, ← Category.assoc, hq, h₁', zero_comp]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (fstKernelFork b)
T✝ : C
f : T✝ ⟶ X
g : T✝ ⟶ Y
⊢ (fun {T} f g => f ≫ b.inl + g ≫ b.inr) f g ≫ BinaryFan.fst (toCone b) = f
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (fstKernelFork b)
T✝ : C
f : T✝ ⟶ X
g : T✝ ⟶ Y
⊢ (fun {T} f g => f ≫ b.inl + g ≫ b.inr) f g ≫ BinaryFan.snd (toCone b) = g
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (fstKernelFork b)
T : C
f : T ⟶ X
g : T ⟶ Y
m : T ⟶ (toCone b).pt
h₁ : m ≫ BinaryFan.fst (toCone b) = f
h₂ : m ≫ BinaryFan.snd (toCone b) = g
⊢ m = (fun {T} f g => f ≫ b.inl + g ≫ b.inr) f g
[PROOFSTEP]
dsimp at m 
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (fstKernelFork b)
T : C
f : T ⟶ X
g : T ⟶ Y
m : T ⟶ b.pt
h₁ : m ≫ BinaryFan.fst (toCone b) = f
h₂ : m ≫ BinaryFan.snd (toCone b) = g
⊢ m = (fun {T} f g => f ≫ b.inl + g ≫ b.inr) f g
[PROOFSTEP]
have h₁' : (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.fst = 0 := by simpa using sub_eq_zero.2 h₁
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (fstKernelFork b)
T : C
f : T ⟶ X
g : T ⟶ Y
m : T ⟶ b.pt
h₁ : m ≫ BinaryFan.fst (toCone b) = f
h₂ : m ≫ BinaryFan.snd (toCone b) = g
⊢ (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.fst = 0
[PROOFSTEP]
simpa using sub_eq_zero.2 h₁
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (fstKernelFork b)
T : C
f : T ⟶ X
g : T ⟶ Y
m : T ⟶ b.pt
h₁ : m ≫ BinaryFan.fst (toCone b) = f
h₂ : m ≫ BinaryFan.snd (toCone b) = g
h₁' : (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.fst = 0
⊢ m = (fun {T} f g => f ≫ b.inl + g ≫ b.inr) f g
[PROOFSTEP]
have h₂' : (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.snd = 0 := by simpa using sub_eq_zero.2 h₂
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (fstKernelFork b)
T : C
f : T ⟶ X
g : T ⟶ Y
m : T ⟶ b.pt
h₁ : m ≫ BinaryFan.fst (toCone b) = f
h₂ : m ≫ BinaryFan.snd (toCone b) = g
h₁' : (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.fst = 0
⊢ (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.snd = 0
[PROOFSTEP]
simpa using sub_eq_zero.2 h₂
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (fstKernelFork b)
T : C
f : T ⟶ X
g : T ⟶ Y
m : T ⟶ b.pt
h₁ : m ≫ BinaryFan.fst (toCone b) = f
h₂ : m ≫ BinaryFan.snd (toCone b) = g
h₁' : (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.fst = 0
h₂' : (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.snd = 0
⊢ m = (fun {T} f g => f ≫ b.inl + g ≫ b.inr) f g
[PROOFSTEP]
obtain ⟨q : T ⟶ Y, hq : q ≫ b.inr = m - (f ≫ b.inl + g ≫ b.inr)⟩ := KernelFork.IsLimit.lift' hb _ h₁'
[GOAL]
case mk
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsLimit (fstKernelFork b)
T : C
f : T ⟶ X
g : T ⟶ Y
m : T ⟶ b.pt
h₁ : m ≫ BinaryFan.fst (toCone b) = f
h₂ : m ≫ BinaryFan.snd (toCone b) = g
h₁' : (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.fst = 0
h₂' : (m - (f ≫ b.inl + g ≫ b.inr)) ≫ b.snd = 0
q : T ⟶ Y
hq : q ≫ b.inr = m - (f ≫ b.inl + g ≫ b.inr)
⊢ m = (fun {T} f g => f ≫ b.inl + g ≫ b.inr) f g
[PROOFSTEP]
rw [← sub_eq_zero, ← hq, ← Category.comp_id q, ← b.inr_snd, ← Category.assoc, hq, h₂', zero_comp]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inrCokernelCofork b)
T✝ : C
f : X ⟶ T✝
g : Y ⟶ T✝
⊢ BinaryCofan.inl (toCocone b) ≫ (fun {T} f g => b.fst ≫ f + b.snd ≫ g) f g = f
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inrCokernelCofork b)
T✝ : C
f : X ⟶ T✝
g : Y ⟶ T✝
⊢ BinaryCofan.inr (toCocone b) ≫ (fun {T} f g => b.fst ≫ f + b.snd ≫ g) f g = g
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inrCokernelCofork b)
T : C
f : X ⟶ T
g : Y ⟶ T
m : (toCocone b).pt ⟶ T
h₁ : BinaryCofan.inl (toCocone b) ≫ m = f
h₂ : BinaryCofan.inr (toCocone b) ≫ m = g
⊢ m = (fun {T} f g => b.fst ≫ f + b.snd ≫ g) f g
[PROOFSTEP]
dsimp at m 
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inrCokernelCofork b)
T : C
f : X ⟶ T
g : Y ⟶ T
m : b.pt ⟶ T
h₁ : BinaryCofan.inl (toCocone b) ≫ m = f
h₂ : BinaryCofan.inr (toCocone b) ≫ m = g
⊢ m = (fun {T} f g => b.fst ≫ f + b.snd ≫ g) f g
[PROOFSTEP]
have h₁' : b.inl ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0 := by simpa using sub_eq_zero.2 h₁
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inrCokernelCofork b)
T : C
f : X ⟶ T
g : Y ⟶ T
m : b.pt ⟶ T
h₁ : BinaryCofan.inl (toCocone b) ≫ m = f
h₂ : BinaryCofan.inr (toCocone b) ≫ m = g
⊢ b.inl ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
[PROOFSTEP]
simpa using sub_eq_zero.2 h₁
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inrCokernelCofork b)
T : C
f : X ⟶ T
g : Y ⟶ T
m : b.pt ⟶ T
h₁ : BinaryCofan.inl (toCocone b) ≫ m = f
h₂ : BinaryCofan.inr (toCocone b) ≫ m = g
h₁' : b.inl ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
⊢ m = (fun {T} f g => b.fst ≫ f + b.snd ≫ g) f g
[PROOFSTEP]
have h₂' : b.inr ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0 := by simpa using sub_eq_zero.2 h₂
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inrCokernelCofork b)
T : C
f : X ⟶ T
g : Y ⟶ T
m : b.pt ⟶ T
h₁ : BinaryCofan.inl (toCocone b) ≫ m = f
h₂ : BinaryCofan.inr (toCocone b) ≫ m = g
h₁' : b.inl ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
⊢ b.inr ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
[PROOFSTEP]
simpa using sub_eq_zero.2 h₂
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inrCokernelCofork b)
T : C
f : X ⟶ T
g : Y ⟶ T
m : b.pt ⟶ T
h₁ : BinaryCofan.inl (toCocone b) ≫ m = f
h₂ : BinaryCofan.inr (toCocone b) ≫ m = g
h₁' : b.inl ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
h₂' : b.inr ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
⊢ m = (fun {T} f g => b.fst ≫ f + b.snd ≫ g) f g
[PROOFSTEP]
obtain ⟨q : X ⟶ T, hq : b.fst ≫ q = m - (b.fst ≫ f + b.snd ≫ g)⟩ := CokernelCofork.IsColimit.desc' hb _ h₂'
[GOAL]
case mk
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inrCokernelCofork b)
T : C
f : X ⟶ T
g : Y ⟶ T
m : b.pt ⟶ T
h₁ : BinaryCofan.inl (toCocone b) ≫ m = f
h₂ : BinaryCofan.inr (toCocone b) ≫ m = g
h₁' : b.inl ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
h₂' : b.inr ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
q : X ⟶ T
hq : b.fst ≫ q = m - (b.fst ≫ f + b.snd ≫ g)
⊢ m = (fun {T} f g => b.fst ≫ f + b.snd ≫ g) f g
[PROOFSTEP]
rw [← sub_eq_zero, ← hq, ← Category.id_comp q, ← b.inl_fst, Category.assoc, hq, h₁', comp_zero]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inlCokernelCofork b)
T✝ : C
f : X ⟶ T✝
g : Y ⟶ T✝
⊢ BinaryCofan.inl (toCocone b) ≫ (fun {T} f g => b.fst ≫ f + b.snd ≫ g) f g = f
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inlCokernelCofork b)
T✝ : C
f : X ⟶ T✝
g : Y ⟶ T✝
⊢ BinaryCofan.inr (toCocone b) ≫ (fun {T} f g => b.fst ≫ f + b.snd ≫ g) f g = g
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inlCokernelCofork b)
T : C
f : X ⟶ T
g : Y ⟶ T
m : (toCocone b).pt ⟶ T
h₁ : BinaryCofan.inl (toCocone b) ≫ m = f
h₂ : BinaryCofan.inr (toCocone b) ≫ m = g
⊢ m = (fun {T} f g => b.fst ≫ f + b.snd ≫ g) f g
[PROOFSTEP]
dsimp at m 
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inlCokernelCofork b)
T : C
f : X ⟶ T
g : Y ⟶ T
m : b.pt ⟶ T
h₁ : BinaryCofan.inl (toCocone b) ≫ m = f
h₂ : BinaryCofan.inr (toCocone b) ≫ m = g
⊢ m = (fun {T} f g => b.fst ≫ f + b.snd ≫ g) f g
[PROOFSTEP]
have h₁' : b.inl ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0 := by simpa using sub_eq_zero.2 h₁
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inlCokernelCofork b)
T : C
f : X ⟶ T
g : Y ⟶ T
m : b.pt ⟶ T
h₁ : BinaryCofan.inl (toCocone b) ≫ m = f
h₂ : BinaryCofan.inr (toCocone b) ≫ m = g
⊢ b.inl ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
[PROOFSTEP]
simpa using sub_eq_zero.2 h₁
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inlCokernelCofork b)
T : C
f : X ⟶ T
g : Y ⟶ T
m : b.pt ⟶ T
h₁ : BinaryCofan.inl (toCocone b) ≫ m = f
h₂ : BinaryCofan.inr (toCocone b) ≫ m = g
h₁' : b.inl ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
⊢ m = (fun {T} f g => b.fst ≫ f + b.snd ≫ g) f g
[PROOFSTEP]
have h₂' : b.inr ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0 := by simpa using sub_eq_zero.2 h₂
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inlCokernelCofork b)
T : C
f : X ⟶ T
g : Y ⟶ T
m : b.pt ⟶ T
h₁ : BinaryCofan.inl (toCocone b) ≫ m = f
h₂ : BinaryCofan.inr (toCocone b) ≫ m = g
h₁' : b.inl ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
⊢ b.inr ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
[PROOFSTEP]
simpa using sub_eq_zero.2 h₂
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inlCokernelCofork b)
T : C
f : X ⟶ T
g : Y ⟶ T
m : b.pt ⟶ T
h₁ : BinaryCofan.inl (toCocone b) ≫ m = f
h₂ : BinaryCofan.inr (toCocone b) ≫ m = g
h₁' : b.inl ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
h₂' : b.inr ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
⊢ m = (fun {T} f g => b.fst ≫ f + b.snd ≫ g) f g
[PROOFSTEP]
obtain ⟨q : Y ⟶ T, hq : b.snd ≫ q = m - (b.fst ≫ f + b.snd ≫ g)⟩ := CokernelCofork.IsColimit.desc' hb _ h₁'
[GOAL]
case mk
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X✝ Y✝ : C
inst✝ : HasBinaryBiproduct X✝ Y✝
X Y : C
b : BinaryBicone X Y
hb : IsColimit (inlCokernelCofork b)
T : C
f : X ⟶ T
g : Y ⟶ T
m : b.pt ⟶ T
h₁ : BinaryCofan.inl (toCocone b) ≫ m = f
h₂ : BinaryCofan.inr (toCocone b) ≫ m = g
h₁' : b.inl ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
h₂' : b.inr ≫ (m - (b.fst ≫ f + b.snd ≫ g)) = 0
q : Y ⟶ T
hq : b.snd ≫ q = m - (b.fst ≫ f + b.snd ≫ g)
⊢ m = (fun {T} f g => b.fst ≫ f + b.snd ≫ g) f g
[PROOFSTEP]
rw [← sub_eq_zero, ← hq, ← Category.id_comp q, ← b.inr_snd, Category.assoc, hq, h₂', comp_zero]
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitEpi f
c : KernelFork f
i : IsLimit c
⊢ Fork.ι c ≫ (𝟙 X - (𝟙 X - f ≫ section_ f)) = 0
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitEpi f
c : KernelFork f
i : IsLimit c
c' : KernelFork (𝟙 X - (𝟙 X - f ≫ section_ f)) :=
  KernelFork.ofι (Fork.ι c) (_ : Fork.ι c ≫ (𝟙 X - (𝟙 X - f ≫ section_ f)) = 0)
⊢ 𝟙 X - (𝟙 X - f ≫ section_ f) = f ≫ section_ f
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitEpi f
c : KernelFork f
i : IsLimit c
c' : KernelFork (𝟙 X - (𝟙 X - f ≫ section_ f)) :=
  KernelFork.ofι (Fork.ι c) (_ : Fork.ι c ≫ (𝟙 X - (𝟙 X - f ≫ section_ f)) = 0)
i' : IsLimit c' := isKernelCompMono i (section_ f) (_ : 𝟙 X - (𝟙 X - f ≫ section_ f) = f ≫ section_ f)
i'' : IsLimit (forkOfKernelFork c') := isLimitForkOfKernelFork i'
⊢ (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f) = 𝟙 X - f ≫ section_ f
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitEpi f
c : KernelFork f
i : IsLimit c
⊢ (Fork.ι c ≫
      let c' := KernelFork.ofι (Fork.ι c) (_ : Fork.ι c ≫ (𝟙 X - (𝟙 X - f ≫ section_ f)) = 0);
      let i' := isKernelCompMono i (section_ f) (_ : 𝟙 X - (𝟙 X - f ≫ section_ f) = f ≫ section_ f);
      let i'' := isLimitForkOfKernelFork i';
      (splitMonoOfIdempotentOfIsLimitFork C (_ : (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f) = 𝟙 X - f ≫ section_ f)
          i'').retraction) =
    𝟙 c.pt
[PROOFSTEP]
apply SplitMono.id
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitEpi f
c : KernelFork f
i : IsLimit c
⊢ Fork.ι c ≫ f = 0
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitEpi f
c : KernelFork f
i : IsLimit c
⊢ (section_ f ≫
      let c' := KernelFork.ofι (Fork.ι c) (_ : Fork.ι c ≫ (𝟙 X - (𝟙 X - f ≫ section_ f)) = 0);
      let i' := isKernelCompMono i (section_ f) (_ : 𝟙 X - (𝟙 X - f ≫ section_ f) = f ≫ section_ f);
      let i'' := isLimitForkOfKernelFork i';
      (splitMonoOfIdempotentOfIsLimitFork C (_ : (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f) = 𝟙 X - f ≫ section_ f)
          i'').retraction) =
    0
[PROOFSTEP]
dsimp only
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitEpi f
c : KernelFork f
i : IsLimit c
⊢ section_ f ≫
      (splitMonoOfIdempotentOfIsLimitFork C (_ : (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f) = 𝟙 X - f ≫ section_ f)
          (isLimitForkOfKernelFork
            (isKernelCompMono i (section_ f) (_ : 𝟙 X - (𝟙 X - f ≫ section_ f) = f ≫ section_ f)))).retraction =
    0
[PROOFSTEP]
rw [splitMonoOfIdempotentOfIsLimitFork_retraction, isLimitForkOfKernelFork_lift, isKernelCompMono_lift]
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitEpi f
c : KernelFork f
i : IsLimit c
⊢ section_ f ≫
      IsLimit.lift i
        (Fork.ofι
          (Fork.ι
            (kernelForkOfFork
              (Fork.ofι (𝟙 X - f ≫ section_ f)
                (_ : (𝟙 X - f ≫ section_ f) ≫ 𝟙 X = (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f)))))
          (_ :
            Fork.ι
                  (kernelForkOfFork
                    (Fork.ofι (𝟙 X - f ≫ section_ f)
                      (_ : (𝟙 X - f ≫ section_ f) ≫ 𝟙 X = (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f)))) ≫
                f =
              Fork.ι
                  (kernelForkOfFork
                    (Fork.ofι (𝟙 X - f ≫ section_ f)
                      (_ : (𝟙 X - f ≫ section_ f) ≫ 𝟙 X = (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f)))) ≫
                0)) =
    0
[PROOFSTEP]
dsimp only [kernelForkOfFork_ι]
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitEpi f
c : KernelFork f
i : IsLimit c
⊢ section_ f ≫
      IsLimit.lift i
        (Fork.ofι
          (Fork.ι
            (Fork.ofι (𝟙 X - f ≫ section_ f)
              (_ : (𝟙 X - f ≫ section_ f) ≫ 𝟙 X = (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f))))
          (_ :
            Fork.ι
                  (Fork.ofι (𝟙 X - f ≫ section_ f)
                    (_ : (𝟙 X - f ≫ section_ f) ≫ 𝟙 X = (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f))) ≫
                f =
              Fork.ι
                  (Fork.ofι (𝟙 X - f ≫ section_ f)
                    (_ : (𝟙 X - f ≫ section_ f) ≫ 𝟙 X = (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f))) ≫
                0)) =
    0
[PROOFSTEP]
letI := mono_of_isLimit_fork i
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitEpi f
c : KernelFork f
i : IsLimit c
this : Mono (Fork.ι c) := mono_of_isLimit_fork i
⊢ section_ f ≫
      IsLimit.lift i
        (Fork.ofι
          (Fork.ι
            (Fork.ofι (𝟙 X - f ≫ section_ f)
              (_ : (𝟙 X - f ≫ section_ f) ≫ 𝟙 X = (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f))))
          (_ :
            Fork.ι
                  (Fork.ofι (𝟙 X - f ≫ section_ f)
                    (_ : (𝟙 X - f ≫ section_ f) ≫ 𝟙 X = (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f))) ≫
                f =
              Fork.ι
                  (Fork.ofι (𝟙 X - f ≫ section_ f)
                    (_ : (𝟙 X - f ≫ section_ f) ≫ 𝟙 X = (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f))) ≫
                0)) =
    0
[PROOFSTEP]
apply zero_of_comp_mono c.ι
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitEpi f
c : KernelFork f
i : IsLimit c
this : Mono (Fork.ι c) := mono_of_isLimit_fork i
⊢ (section_ f ≫
        IsLimit.lift i
          (Fork.ofι
            (Fork.ι
              (Fork.ofι (𝟙 X - f ≫ section_ f)
                (_ : (𝟙 X - f ≫ section_ f) ≫ 𝟙 X = (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f))))
            (_ :
              Fork.ι
                    (Fork.ofι (𝟙 X - f ≫ section_ f)
                      (_ : (𝟙 X - f ≫ section_ f) ≫ 𝟙 X = (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f))) ≫
                  f =
                Fork.ι
                    (Fork.ofι (𝟙 X - f ≫ section_ f)
                      (_ : (𝟙 X - f ≫ section_ f) ≫ 𝟙 X = (𝟙 X - f ≫ section_ f) ≫ (𝟙 X - f ≫ section_ f))) ≫
                  0))) ≫
      Fork.ι c =
    0
[PROOFSTEP]
simp only [comp_sub, Category.comp_id, Category.assoc, sub_self, Fork.IsLimit.lift_ι, Fork.ι_ofι, IsSplitEpi.id_assoc]
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitEpi f
c : KernelFork f
i : IsLimit c
⊢ section_ f ≫ f = 𝟙 Y
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
J : Type
inst✝² : Fintype J
X✝ Y✝ : C
inst✝¹ : HasBinaryBiproduct X✝ Y✝
X Y : C
f : X ⟶ Y
inst✝ : IsSplitEpi f
c : KernelFork f
i : IsLimit c
⊢ (Iso.refl c.pt).hom ≫ Fork.ι (BinaryBicone.sndKernelFork (binaryBiconeOfIsSplitEpiOfKernel i)) = Fork.ι c
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X Y : C
f g : X ⟶ Y
inst✝ : HasBinaryBiproduct X X
⊢ f + g = lift (𝟙 X) (𝟙 X) ≫ desc f g
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
J : Type
inst✝¹ : Fintype J
X Y : C
f g : X ⟶ Y
inst✝ : HasBinaryBiproduct Y Y
⊢ f + g = lift f g ≫ desc (𝟙 Y) (𝟙 Y)
[PROOFSTEP]
simp
[GOAL]
C✝ : Type u
inst✝⁴ : Category.{v, u} C✝
inst✝³ : Preadditive C✝
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
inst✝ : HasBinaryBiproducts C
a b : Preadditive C
⊢ a = b
[PROOFSTEP]
apply Preadditive.ext
[GOAL]
case homGroup
C✝ : Type u
inst✝⁴ : Category.{v, u} C✝
inst✝³ : Preadditive C✝
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
inst✝ : HasBinaryBiproducts C
a b : Preadditive C
⊢ homGroup = homGroup
[PROOFSTEP]
funext X Y
[GOAL]
case homGroup.h.h
C✝ : Type u
inst✝⁴ : Category.{v, u} C✝
inst✝³ : Preadditive C✝
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
inst✝ : HasBinaryBiproducts C
a b : Preadditive C
X Y : C
⊢ homGroup X Y = homGroup X Y
[PROOFSTEP]
apply AddCommGroup.ext
[GOAL]
case homGroup.h.h.h_mul
C✝ : Type u
inst✝⁴ : Category.{v, u} C✝
inst✝³ : Preadditive C✝
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
inst✝ : HasBinaryBiproducts C
a b : Preadditive C
X Y : C
⊢ Add.add = Add.add
[PROOFSTEP]
funext f g
[GOAL]
case homGroup.h.h.h_mul.h.h
C✝ : Type u
inst✝⁴ : Category.{v, u} C✝
inst✝³ : Preadditive C✝
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
inst✝ : HasBinaryBiproducts C
a b : Preadditive C
X Y : C
f g : X ⟶ Y
⊢ Add.add f g = Add.add f g
[PROOFSTEP]
have h₁ := @biprod.add_eq_lift_id_desc _ _ a _ _ f g (by convert (inferInstance : HasBinaryBiproduct X X))
[GOAL]
C✝ : Type u
inst✝⁴ : Category.{v, u} C✝
inst✝³ : Preadditive C✝
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
inst✝ : HasBinaryBiproducts C
a b : Preadditive C
X Y : C
f g : X ⟶ Y
⊢ HasBinaryBiproduct X X
[PROOFSTEP]
convert (inferInstance : HasBinaryBiproduct X X)
[GOAL]
case homGroup.h.h.h_mul.h.h
C✝ : Type u
inst✝⁴ : Category.{v, u} C✝
inst✝³ : Preadditive C✝
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
inst✝ : HasBinaryBiproducts C
a b : Preadditive C
X Y : C
f g : X ⟶ Y
h₁ : f + g = biprod.lift (𝟙 X) (𝟙 X) ≫ biprod.desc f g
⊢ Add.add f g = Add.add f g
[PROOFSTEP]
have h₂ := @biprod.add_eq_lift_id_desc _ _ b _ _ f g (by convert (inferInstance : HasBinaryBiproduct X X))
[GOAL]
C✝ : Type u
inst✝⁴ : Category.{v, u} C✝
inst✝³ : Preadditive C✝
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
inst✝ : HasBinaryBiproducts C
a b : Preadditive C
X Y : C
f g : X ⟶ Y
h₁ : f + g = biprod.lift (𝟙 X) (𝟙 X) ≫ biprod.desc f g
⊢ HasBinaryBiproduct X X
[PROOFSTEP]
convert (inferInstance : HasBinaryBiproduct X X)
[GOAL]
case homGroup.h.h.h_mul.h.h
C✝ : Type u
inst✝⁴ : Category.{v, u} C✝
inst✝³ : Preadditive C✝
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
inst✝ : HasBinaryBiproducts C
a b : Preadditive C
X Y : C
f g : X ⟶ Y
h₁ : f + g = biprod.lift (𝟙 X) (𝟙 X) ≫ biprod.desc f g
h₂ : f + g = biprod.lift (𝟙 X) (𝟙 X) ≫ biprod.desc f g
⊢ Add.add f g = Add.add f g
[PROOFSTEP]
refine' h₁.trans (Eq.trans _ h₂.symm)
[GOAL]
case homGroup.h.h.h_mul.h.h
C✝ : Type u
inst✝⁴ : Category.{v, u} C✝
inst✝³ : Preadditive C✝
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
inst✝ : HasBinaryBiproducts C
a b : Preadditive C
X Y : C
f g : X ⟶ Y
h₁ : f + g = biprod.lift (𝟙 X) (𝟙 X) ≫ biprod.desc f g
h₂ : f + g = biprod.lift (𝟙 X) (𝟙 X) ≫ biprod.desc f g
⊢ biprod.lift (𝟙 X) (𝟙 X) ≫ biprod.desc f g = biprod.lift (𝟙 X) (𝟙 X) ≫ biprod.desc f g
[PROOFSTEP]
congr!
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
inst✝ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
⊢ biprod.inl ≫ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ = f₁₁ ≫ biprod.inl + f₁₂ ≫ biprod.inr
[PROOFSTEP]
simp [Biprod.ofComponents]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
inst✝ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
⊢ biprod.inr ≫ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ = f₂₁ ≫ biprod.inl + f₂₂ ≫ biprod.inr
[PROOFSTEP]
simp [Biprod.ofComponents]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
inst✝ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
⊢ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ ≫ biprod.fst = biprod.fst ≫ f₁₁ + biprod.snd ≫ f₂₁
[PROOFSTEP]
simp [Biprod.ofComponents]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
inst✝ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
⊢ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ ≫ biprod.snd = biprod.fst ≫ f₁₂ + biprod.snd ≫ f₂₂
[PROOFSTEP]
simp [Biprod.ofComponents]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
inst✝ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
f : X₁ ⊞ X₂ ⟶ Y₁ ⊞ Y₂
⊢ ofComponents (biprod.inl ≫ f ≫ biprod.fst) (biprod.inl ≫ f ≫ biprod.snd) (biprod.inr ≫ f ≫ biprod.fst)
      (biprod.inr ≫ f ≫ biprod.snd) =
    f
[PROOFSTEP]
ext
[GOAL]
case h₀.h₀
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
inst✝ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
f : X₁ ⊞ X₂ ⟶ Y₁ ⊞ Y₂
⊢ (biprod.inl ≫
        ofComponents (biprod.inl ≫ f ≫ biprod.fst) (biprod.inl ≫ f ≫ biprod.snd) (biprod.inr ≫ f ≫ biprod.fst)
          (biprod.inr ≫ f ≫ biprod.snd)) ≫
      biprod.fst =
    (biprod.inl ≫ f) ≫ biprod.fst
[PROOFSTEP]
simp only [Category.comp_id, biprod.inr_fst, biprod.inr_snd, biprod.inl_snd, add_zero, zero_add,
  Biprod.inl_ofComponents, Biprod.inr_ofComponents, eq_self_iff_true, Category.assoc, comp_zero, biprod.inl_fst,
  Preadditive.add_comp]
[GOAL]
case h₀.h₁
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
inst✝ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
f : X₁ ⊞ X₂ ⟶ Y₁ ⊞ Y₂
⊢ (biprod.inl ≫
        ofComponents (biprod.inl ≫ f ≫ biprod.fst) (biprod.inl ≫ f ≫ biprod.snd) (biprod.inr ≫ f ≫ biprod.fst)
          (biprod.inr ≫ f ≫ biprod.snd)) ≫
      biprod.snd =
    (biprod.inl ≫ f) ≫ biprod.snd
[PROOFSTEP]
simp only [Category.comp_id, biprod.inr_fst, biprod.inr_snd, biprod.inl_snd, add_zero, zero_add,
  Biprod.inl_ofComponents, Biprod.inr_ofComponents, eq_self_iff_true, Category.assoc, comp_zero, biprod.inl_fst,
  Preadditive.add_comp]
[GOAL]
case h₁.h₀
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
inst✝ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
f : X₁ ⊞ X₂ ⟶ Y₁ ⊞ Y₂
⊢ (biprod.inr ≫
        ofComponents (biprod.inl ≫ f ≫ biprod.fst) (biprod.inl ≫ f ≫ biprod.snd) (biprod.inr ≫ f ≫ biprod.fst)
          (biprod.inr ≫ f ≫ biprod.snd)) ≫
      biprod.fst =
    (biprod.inr ≫ f) ≫ biprod.fst
[PROOFSTEP]
simp only [Category.comp_id, biprod.inr_fst, biprod.inr_snd, biprod.inl_snd, add_zero, zero_add,
  Biprod.inl_ofComponents, Biprod.inr_ofComponents, eq_self_iff_true, Category.assoc, comp_zero, biprod.inl_fst,
  Preadditive.add_comp]
[GOAL]
case h₁.h₁
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
inst✝ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
f : X₁ ⊞ X₂ ⟶ Y₁ ⊞ Y₂
⊢ (biprod.inr ≫
        ofComponents (biprod.inl ≫ f ≫ biprod.fst) (biprod.inl ≫ f ≫ biprod.snd) (biprod.inr ≫ f ≫ biprod.fst)
          (biprod.inr ≫ f ≫ biprod.snd)) ≫
      biprod.snd =
    (biprod.inr ≫ f) ≫ biprod.snd
[PROOFSTEP]
simp only [Category.comp_id, biprod.inr_fst, biprod.inr_snd, biprod.inl_snd, add_zero, zero_add,
  Biprod.inl_ofComponents, Biprod.inr_ofComponents, eq_self_iff_true, Category.assoc, comp_zero, biprod.inl_fst,
  Preadditive.add_comp]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
inst✝ : HasBinaryBiproducts C
X₁✝ X₂✝ Y₁✝ Y₂✝ : C
f₁₁✝ : X₁✝ ⟶ Y₁✝
f₁₂✝ : X₁✝ ⟶ Y₂✝
f₂₁✝ : X₂✝ ⟶ Y₁✝
f₂₂✝ : X₂✝ ⟶ Y₂✝
X₁ X₂ Y₁ Y₂ Z₁ Z₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
g₁₁ : Y₁ ⟶ Z₁
g₁₂ : Y₁ ⟶ Z₂
g₂₁ : Y₂ ⟶ Z₁
g₂₂ : Y₂ ⟶ Z₂
⊢ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ ≫ ofComponents g₁₁ g₁₂ g₂₁ g₂₂ =
    ofComponents (f₁₁ ≫ g₁₁ + f₁₂ ≫ g₂₁) (f₁₁ ≫ g₁₂ + f₁₂ ≫ g₂₂) (f₂₁ ≫ g₁₁ + f₂₂ ≫ g₂₁) (f₂₁ ≫ g₁₂ + f₂₂ ≫ g₂₂)
[PROOFSTEP]
dsimp [Biprod.ofComponents]
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
inst✝ : HasBinaryBiproducts C
X₁✝ X₂✝ Y₁✝ Y₂✝ : C
f₁₁✝ : X₁✝ ⟶ Y₁✝
f₁₂✝ : X₁✝ ⟶ Y₂✝
f₂₁✝ : X₂✝ ⟶ Y₁✝
f₂₂✝ : X₂✝ ⟶ Y₂✝
X₁ X₂ Y₁ Y₂ Z₁ Z₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
g₁₁ : Y₁ ⟶ Z₁
g₁₂ : Y₁ ⟶ Z₂
g₂₁ : Y₂ ⟶ Z₁
g₂₂ : Y₂ ⟶ Z₂
⊢ (biprod.fst ≫ f₁₁ ≫ biprod.inl + biprod.fst ≫ f₁₂ ≫ biprod.inr + biprod.snd ≫ f₂₁ ≫ biprod.inl +
        biprod.snd ≫ f₂₂ ≫ biprod.inr) ≫
      (biprod.fst ≫ g₁₁ ≫ biprod.inl + biprod.fst ≫ g₁₂ ≫ biprod.inr + biprod.snd ≫ g₂₁ ≫ biprod.inl +
        biprod.snd ≫ g₂₂ ≫ biprod.inr) =
    biprod.fst ≫ (f₁₁ ≫ g₁₁ + f₁₂ ≫ g₂₁) ≫ biprod.inl + biprod.fst ≫ (f₁₁ ≫ g₁₂ + f₁₂ ≫ g₂₂) ≫ biprod.inr +
        biprod.snd ≫ (f₂₁ ≫ g₁₁ + f₂₂ ≫ g₂₁) ≫ biprod.inl +
      biprod.snd ≫ (f₂₁ ≫ g₁₂ + f₂₂ ≫ g₂₂) ≫ biprod.inr
[PROOFSTEP]
ext
[GOAL]
case h₀.h₀
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
inst✝ : HasBinaryBiproducts C
X₁✝ X₂✝ Y₁✝ Y₂✝ : C
f₁₁✝ : X₁✝ ⟶ Y₁✝
f₁₂✝ : X₁✝ ⟶ Y₂✝
f₂₁✝ : X₂✝ ⟶ Y₁✝
f₂₂✝ : X₂✝ ⟶ Y₂✝
X₁ X₂ Y₁ Y₂ Z₁ Z₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
g₁₁ : Y₁ ⟶ Z₁
g₁₂ : Y₁ ⟶ Z₂
g₂₁ : Y₂ ⟶ Z₁
g₂₂ : Y₂ ⟶ Z₂
⊢ (biprod.inl ≫
        (biprod.fst ≫ f₁₁ ≫ biprod.inl + biprod.fst ≫ f₁₂ ≫ biprod.inr + biprod.snd ≫ f₂₁ ≫ biprod.inl +
            biprod.snd ≫ f₂₂ ≫ biprod.inr) ≫
          (biprod.fst ≫ g₁₁ ≫ biprod.inl + biprod.fst ≫ g₁₂ ≫ biprod.inr + biprod.snd ≫ g₂₁ ≫ biprod.inl +
            biprod.snd ≫ g₂₂ ≫ biprod.inr)) ≫
      biprod.fst =
    (biprod.inl ≫
        (biprod.fst ≫ (f₁₁ ≫ g₁₁ + f₁₂ ≫ g₂₁) ≫ biprod.inl + biprod.fst ≫ (f₁₁ ≫ g₁₂ + f₁₂ ≫ g₂₂) ≫ biprod.inr +
            biprod.snd ≫ (f₂₁ ≫ g₁₁ + f₂₂ ≫ g₂₁) ≫ biprod.inl +
          biprod.snd ≫ (f₂₁ ≫ g₁₂ + f₂₂ ≫ g₂₂) ≫ biprod.inr)) ≫
      biprod.fst
[PROOFSTEP]
simp only [add_comp, comp_add, add_comp_assoc, add_zero, zero_add, biprod.inl_fst, biprod.inl_snd, biprod.inr_fst,
  biprod.inr_snd, biprod.inl_fst_assoc, biprod.inl_snd_assoc, biprod.inr_fst_assoc, biprod.inr_snd_assoc, comp_zero,
  zero_comp, Category.assoc]
[GOAL]
case h₀.h₁
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
inst✝ : HasBinaryBiproducts C
X₁✝ X₂✝ Y₁✝ Y₂✝ : C
f₁₁✝ : X₁✝ ⟶ Y₁✝
f₁₂✝ : X₁✝ ⟶ Y₂✝
f₂₁✝ : X₂✝ ⟶ Y₁✝
f₂₂✝ : X₂✝ ⟶ Y₂✝
X₁ X₂ Y₁ Y₂ Z₁ Z₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
g₁₁ : Y₁ ⟶ Z₁
g₁₂ : Y₁ ⟶ Z₂
g₂₁ : Y₂ ⟶ Z₁
g₂₂ : Y₂ ⟶ Z₂
⊢ (biprod.inl ≫
        (biprod.fst ≫ f₁₁ ≫ biprod.inl + biprod.fst ≫ f₁₂ ≫ biprod.inr + biprod.snd ≫ f₂₁ ≫ biprod.inl +
            biprod.snd ≫ f₂₂ ≫ biprod.inr) ≫
          (biprod.fst ≫ g₁₁ ≫ biprod.inl + biprod.fst ≫ g₁₂ ≫ biprod.inr + biprod.snd ≫ g₂₁ ≫ biprod.inl +
            biprod.snd ≫ g₂₂ ≫ biprod.inr)) ≫
      biprod.snd =
    (biprod.inl ≫
        (biprod.fst ≫ (f₁₁ ≫ g₁₁ + f₁₂ ≫ g₂₁) ≫ biprod.inl + biprod.fst ≫ (f₁₁ ≫ g₁₂ + f₁₂ ≫ g₂₂) ≫ biprod.inr +
            biprod.snd ≫ (f₂₁ ≫ g₁₁ + f₂₂ ≫ g₂₁) ≫ biprod.inl +
          biprod.snd ≫ (f₂₁ ≫ g₁₂ + f₂₂ ≫ g₂₂) ≫ biprod.inr)) ≫
      biprod.snd
[PROOFSTEP]
simp only [add_comp, comp_add, add_comp_assoc, add_zero, zero_add, biprod.inl_fst, biprod.inl_snd, biprod.inr_fst,
  biprod.inr_snd, biprod.inl_fst_assoc, biprod.inl_snd_assoc, biprod.inr_fst_assoc, biprod.inr_snd_assoc, comp_zero,
  zero_comp, Category.assoc]
[GOAL]
case h₁.h₀
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
inst✝ : HasBinaryBiproducts C
X₁✝ X₂✝ Y₁✝ Y₂✝ : C
f₁₁✝ : X₁✝ ⟶ Y₁✝
f₁₂✝ : X₁✝ ⟶ Y₂✝
f₂₁✝ : X₂✝ ⟶ Y₁✝
f₂₂✝ : X₂✝ ⟶ Y₂✝
X₁ X₂ Y₁ Y₂ Z₁ Z₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
g₁₁ : Y₁ ⟶ Z₁
g₁₂ : Y₁ ⟶ Z₂
g₂₁ : Y₂ ⟶ Z₁
g₂₂ : Y₂ ⟶ Z₂
⊢ (biprod.inr ≫
        (biprod.fst ≫ f₁₁ ≫ biprod.inl + biprod.fst ≫ f₁₂ ≫ biprod.inr + biprod.snd ≫ f₂₁ ≫ biprod.inl +
            biprod.snd ≫ f₂₂ ≫ biprod.inr) ≫
          (biprod.fst ≫ g₁₁ ≫ biprod.inl + biprod.fst ≫ g₁₂ ≫ biprod.inr + biprod.snd ≫ g₂₁ ≫ biprod.inl +
            biprod.snd ≫ g₂₂ ≫ biprod.inr)) ≫
      biprod.fst =
    (biprod.inr ≫
        (biprod.fst ≫ (f₁₁ ≫ g₁₁ + f₁₂ ≫ g₂₁) ≫ biprod.inl + biprod.fst ≫ (f₁₁ ≫ g₁₂ + f₁₂ ≫ g₂₂) ≫ biprod.inr +
            biprod.snd ≫ (f₂₁ ≫ g₁₁ + f₂₂ ≫ g₂₁) ≫ biprod.inl +
          biprod.snd ≫ (f₂₁ ≫ g₁₂ + f₂₂ ≫ g₂₂) ≫ biprod.inr)) ≫
      biprod.fst
[PROOFSTEP]
simp only [add_comp, comp_add, add_comp_assoc, add_zero, zero_add, biprod.inl_fst, biprod.inl_snd, biprod.inr_fst,
  biprod.inr_snd, biprod.inl_fst_assoc, biprod.inl_snd_assoc, biprod.inr_fst_assoc, biprod.inr_snd_assoc, comp_zero,
  zero_comp, Category.assoc]
[GOAL]
case h₁.h₁
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Preadditive C
inst✝ : HasBinaryBiproducts C
X₁✝ X₂✝ Y₁✝ Y₂✝ : C
f₁₁✝ : X₁✝ ⟶ Y₁✝
f₁₂✝ : X₁✝ ⟶ Y₂✝
f₂₁✝ : X₂✝ ⟶ Y₁✝
f₂₂✝ : X₂✝ ⟶ Y₂✝
X₁ X₂ Y₁ Y₂ Z₁ Z₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
g₁₁ : Y₁ ⟶ Z₁
g₁₂ : Y₁ ⟶ Z₂
g₂₁ : Y₂ ⟶ Z₁
g₂₂ : Y₂ ⟶ Z₂
⊢ (biprod.inr ≫
        (biprod.fst ≫ f₁₁ ≫ biprod.inl + biprod.fst ≫ f₁₂ ≫ biprod.inr + biprod.snd ≫ f₂₁ ≫ biprod.inl +
            biprod.snd ≫ f₂₂ ≫ biprod.inr) ≫
          (biprod.fst ≫ g₁₁ ≫ biprod.inl + biprod.fst ≫ g₁₂ ≫ biprod.inr + biprod.snd ≫ g₂₁ ≫ biprod.inl +
            biprod.snd ≫ g₂₂ ≫ biprod.inr)) ≫
      biprod.snd =
    (biprod.inr ≫
        (biprod.fst ≫ (f₁₁ ≫ g₁₁ + f₁₂ ≫ g₂₁) ≫ biprod.inl + biprod.fst ≫ (f₁₁ ≫ g₁₂ + f₁₂ ≫ g₂₂) ≫ biprod.inr +
            biprod.snd ≫ (f₂₁ ≫ g₁₁ + f₂₂ ≫ g₂₁) ≫ biprod.inl +
          biprod.snd ≫ (f₂₁ ≫ g₁₂ + f₂₂ ≫ g₂₂) ≫ biprod.inr)) ≫
      biprod.snd
[PROOFSTEP]
simp only [add_comp, comp_add, add_comp_assoc, add_zero, zero_add, biprod.inl_fst, biprod.inl_snd, biprod.inr_fst,
  biprod.inr_snd, biprod.inl_fst_assoc, biprod.inl_snd_assoc, biprod.inr_fst_assoc, biprod.inr_snd_assoc, comp_zero,
  zero_comp, Category.assoc]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
inst✝ : IsIso f₁₁
⊢ (unipotentLower (-f₂₁ ≫ inv f₁₁)).hom ≫ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ ≫ (unipotentUpper (-inv f₁₁ ≫ f₁₂)).hom =
    biprod.map f₁₁ (f₂₂ - f₂₁ ≫ inv f₁₁ ≫ f₁₂)
[PROOFSTEP]
ext
[GOAL]
case h₀.h₀
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
inst✝ : IsIso f₁₁
⊢ (biprod.inl ≫
        (unipotentLower (-f₂₁ ≫ inv f₁₁)).hom ≫ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ ≫ (unipotentUpper (-inv f₁₁ ≫ f₁₂)).hom) ≫
      biprod.fst =
    (biprod.inl ≫ biprod.map f₁₁ (f₂₂ - f₂₁ ≫ inv f₁₁ ≫ f₁₂)) ≫ biprod.fst
[PROOFSTEP]
simp
[GOAL]
case h₀.h₁
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
inst✝ : IsIso f₁₁
⊢ (biprod.inl ≫
        (unipotentLower (-f₂₁ ≫ inv f₁₁)).hom ≫ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ ≫ (unipotentUpper (-inv f₁₁ ≫ f₁₂)).hom) ≫
      biprod.snd =
    (biprod.inl ≫ biprod.map f₁₁ (f₂₂ - f₂₁ ≫ inv f₁₁ ≫ f₁₂)) ≫ biprod.snd
[PROOFSTEP]
simp
[GOAL]
case h₁.h₀
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
inst✝ : IsIso f₁₁
⊢ (biprod.inr ≫
        (unipotentLower (-f₂₁ ≫ inv f₁₁)).hom ≫ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ ≫ (unipotentUpper (-inv f₁₁ ≫ f₁₂)).hom) ≫
      biprod.fst =
    (biprod.inr ≫ biprod.map f₁₁ (f₂₂ - f₂₁ ≫ inv f₁₁ ≫ f₁₂)) ≫ biprod.fst
[PROOFSTEP]
simp
[GOAL]
case h₁.h₁
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
inst✝ : IsIso f₁₁
⊢ (biprod.inr ≫
        (unipotentLower (-f₂₁ ≫ inv f₁₁)).hom ≫ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ ≫ (unipotentUpper (-inv f₁₁ ≫ f₁₂)).hom) ≫
      biprod.snd =
    (biprod.inr ≫ biprod.map f₁₁ (f₂₂ - f₂₁ ≫ inv f₁₁ ≫ f₁₂)) ≫ biprod.snd
[PROOFSTEP]
simp
[GOAL]
case h₁.h₁
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
inst✝ : IsIso f₁₁
⊢ -f₂₁ ≫ inv f₁₁ ≫ f₁₂ + f₂₂ = f₂₂ - f₂₁ ≫ inv f₁₁ ≫ f₁₂
[PROOFSTEP]
abel
[GOAL]
case h₁.h₁
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
inst✝ : IsIso f₁₁
⊢ -f₂₁ ≫ inv f₁₁ ≫ f₁₂ + f₂₂ = f₂₂ - f₂₁ ≫ inv f₁₁ ≫ f₁₂
[PROOFSTEP]
abel
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
f : X₁ ⊞ X₂ ⟶ Y₁ ⊞ Y₂
inst✝ : IsIso (biprod.inl ≫ f ≫ biprod.fst)
⊢ (L : X₁ ⊞ X₂ ≅ X₁ ⊞ X₂) ×'
    (R : Y₁ ⊞ Y₂ ≅ Y₁ ⊞ Y₂) ×' (g₂₂ : X₂ ⟶ Y₂) ×' L.hom ≫ f ≫ R.hom = biprod.map (biprod.inl ≫ f ≫ biprod.fst) g₂₂
[PROOFSTEP]
let this :=
  Biprod.gaussian' (biprod.inl ≫ f ≫ biprod.fst) (biprod.inl ≫ f ≫ biprod.snd) (biprod.inr ≫ f ≫ biprod.fst)
    (biprod.inr ≫ f ≫ biprod.snd)
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
f : X₁ ⊞ X₂ ⟶ Y₁ ⊞ Y₂
inst✝ : IsIso (biprod.inl ≫ f ≫ biprod.fst)
this : (L : X₁ ⊞ X₂ ≅ X₁ ⊞ X₂) ×'
  (R : Y₁ ⊞ Y₂ ≅ Y₁ ⊞ Y₂) ×'
    (g₂₂ : X₂ ⟶ Y₂) ×'
      L.hom ≫
          ofComponents (biprod.inl ≫ f ≫ biprod.fst) (biprod.inl ≫ f ≫ biprod.snd) (biprod.inr ≫ f ≫ biprod.fst)
              (biprod.inr ≫ f ≫ biprod.snd) ≫
            R.hom =
        biprod.map (biprod.inl ≫ f ≫ biprod.fst) g₂₂ :=
  gaussian' (biprod.inl ≫ f ≫ biprod.fst) (biprod.inl ≫ f ≫ biprod.snd) (biprod.inr ≫ f ≫ biprod.fst)
    (biprod.inr ≫ f ≫ biprod.snd)
⊢ (L : X₁ ⊞ X₂ ≅ X₁ ⊞ X₂) ×'
    (R : Y₁ ⊞ Y₂ ≅ Y₁ ⊞ Y₂) ×' (g₂₂ : X₂ ⟶ Y₂) ×' L.hom ≫ f ≫ R.hom = biprod.map (biprod.inl ≫ f ≫ biprod.fst) g₂₂
[PROOFSTEP]
rwa [Biprod.ofComponents_eq] at this 
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
inst✝² : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
inst✝¹ : IsIso f₁₁
inst✝ : IsIso (ofComponents f₁₁ f₁₂ f₂₁ f₂₂)
⊢ X₂ ≅ Y₂
[PROOFSTEP]
obtain ⟨L, R, g, w⟩ := Biprod.gaussian' f₁₁ f₁₂ f₂₁ f₂₂
[GOAL]
case mk.mk.mk
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
inst✝² : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
inst✝¹ : IsIso f₁₁
inst✝ : IsIso (ofComponents f₁₁ f₁₂ f₂₁ f₂₂)
L : X₁ ⊞ X₂ ≅ X₁ ⊞ X₂
R : Y₁ ⊞ Y₂ ≅ Y₁ ⊞ Y₂
g : X₂ ⟶ Y₂
w : L.hom ≫ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ ≫ R.hom = biprod.map f₁₁ g
⊢ X₂ ≅ Y₂
[PROOFSTEP]
letI : IsIso (biprod.map f₁₁ g) := by
  rw [← w]
  infer_instance
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
inst✝² : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
inst✝¹ : IsIso f₁₁
inst✝ : IsIso (ofComponents f₁₁ f₁₂ f₂₁ f₂₂)
L : X₁ ⊞ X₂ ≅ X₁ ⊞ X₂
R : Y₁ ⊞ Y₂ ≅ Y₁ ⊞ Y₂
g : X₂ ⟶ Y₂
w : L.hom ≫ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ ≫ R.hom = biprod.map f₁₁ g
⊢ IsIso (biprod.map f₁₁ g)
[PROOFSTEP]
rw [← w]
[GOAL]
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
inst✝² : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
inst✝¹ : IsIso f₁₁
inst✝ : IsIso (ofComponents f₁₁ f₁₂ f₂₁ f₂₂)
L : X₁ ⊞ X₂ ≅ X₁ ⊞ X₂
R : Y₁ ⊞ Y₂ ≅ Y₁ ⊞ Y₂
g : X₂ ⟶ Y₂
w : L.hom ≫ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ ≫ R.hom = biprod.map f₁₁ g
⊢ IsIso (L.hom ≫ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ ≫ R.hom)
[PROOFSTEP]
infer_instance
[GOAL]
case mk.mk.mk
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
inst✝² : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
inst✝¹ : IsIso f₁₁
inst✝ : IsIso (ofComponents f₁₁ f₁₂ f₂₁ f₂₂)
L : X₁ ⊞ X₂ ≅ X₁ ⊞ X₂
R : Y₁ ⊞ Y₂ ≅ Y₁ ⊞ Y₂
g : X₂ ⟶ Y₂
w : L.hom ≫ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ ≫ R.hom = biprod.map f₁₁ g
this : IsIso (biprod.map f₁₁ g) := Eq.mpr (id (Eq.symm w ▸ Eq.refl (IsIso (biprod.map f₁₁ g)))) inferInstance
⊢ X₂ ≅ Y₂
[PROOFSTEP]
letI : IsIso g := isIso_right_of_isIso_biprod_map f₁₁ g
[GOAL]
case mk.mk.mk
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : Preadditive C
inst✝² : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
inst✝¹ : IsIso f₁₁
inst✝ : IsIso (ofComponents f₁₁ f₁₂ f₂₁ f₂₂)
L : X₁ ⊞ X₂ ≅ X₁ ⊞ X₂
R : Y₁ ⊞ Y₂ ≅ Y₁ ⊞ Y₂
g : X₂ ⟶ Y₂
w : L.hom ≫ ofComponents f₁₁ f₁₂ f₂₁ f₂₂ ≫ R.hom = biprod.map f₁₁ g
this✝ : IsIso (biprod.map f₁₁ g) := Eq.mpr (id (Eq.symm w ▸ Eq.refl (IsIso (biprod.map f₁₁ g)))) inferInstance
this : IsIso g := isIso_right_of_isIso_biprod_map f₁₁ g
⊢ X₂ ≅ Y₂
[PROOFSTEP]
exact asIso g
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
f : X₁ ⊞ X₂ ≅ Y₁ ⊞ Y₂
inst✝ : IsIso (biprod.inl ≫ f.hom ≫ biprod.fst)
⊢ IsIso
    (ofComponents (biprod.inl ≫ f.hom ≫ biprod.fst) (biprod.inl ≫ f.hom ≫ biprod.snd) (biprod.inr ≫ f.hom ≫ biprod.fst)
      (biprod.inr ≫ f.hom ≫ biprod.snd))
[PROOFSTEP]
simp only [Biprod.ofComponents_eq]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
f : X₁ ⊞ X₂ ≅ Y₁ ⊞ Y₂
inst✝ : IsIso (biprod.inl ≫ f.hom ≫ biprod.fst)
⊢ IsIso f.hom
[PROOFSTEP]
infer_instance
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
⊢ 𝟙 W = 0 ∨ biprod.inl ≫ f ≫ biprod.fst ≠ 0 ∨ biprod.inl ≫ f ≫ biprod.snd ≠ 0
[PROOFSTEP]
by_contra' h
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
h : 𝟙 W ≠ 0 ∧ biprod.inl ≫ f ≫ biprod.fst = 0 ∧ biprod.inl ≫ f ≫ biprod.snd = 0
⊢ False
[PROOFSTEP]
rcases h with ⟨nz, a₁, a₂⟩
[GOAL]
case intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
⊢ False
[PROOFSTEP]
set x := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
[GOAL]
case intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
⊢ False
[PROOFSTEP]
have h₁ : x = 𝟙 W := by simp
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
⊢ x = 𝟙 W
[PROOFSTEP]
simp
[GOAL]
case intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
⊢ False
[PROOFSTEP]
have h₀ : x = 0 := by
  dsimp
  rw [← Category.id_comp (inv f), Category.assoc, ← biprod.total]
  conv_lhs =>
    slice 2 3
    rw [comp_add]
  simp only [Category.assoc]
  rw [comp_add_assoc, add_comp]
  conv_lhs =>
    congr
    next => skip
    slice 1 3
    rw [a₂]
  simp only [zero_comp, add_zero]
  conv_lhs =>
    slice 1 3
    rw [a₁]
  simp only [zero_comp]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
⊢ x = 0
[PROOFSTEP]
dsimp
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
⊢ biprod.inl ≫ f ≫ inv f ≫ biprod.fst = 0
[PROOFSTEP]
rw [← Category.id_comp (inv f), Category.assoc, ← biprod.total]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
⊢ biprod.inl ≫ f ≫ (biprod.fst ≫ biprod.inl + biprod.snd ≫ biprod.inr) ≫ inv f ≫ biprod.fst = 0
[PROOFSTEP]
conv_lhs =>
  slice 2 3
  rw [comp_add]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| biprod.inl ≫ f ≫ (biprod.fst ≫ biprod.inl + biprod.snd ≫ biprod.inr) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
  slice 2 3
  rw [comp_add]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| biprod.inl ≫ f ≫ (biprod.fst ≫ biprod.inl + biprod.snd ≫ biprod.inr) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
  slice 2 3
  rw [comp_add]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| biprod.inl ≫ f ≫ (biprod.fst ≫ biprod.inl + biprod.snd ≫ biprod.inr) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
slice 2 3
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| biprod.inl ≫ f ≫ (biprod.fst ≫ biprod.inl + biprod.snd ≫ biprod.inr) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
slice 2 3
[GOAL]
case a.a.a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| f ≫ (biprod.fst ≫ biprod.inl + biprod.snd ≫ biprod.inr)
case a.a.a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| inv f
case a.a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| biprod.fst
case a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| biprod.inl
[PROOFSTEP]
rw [comp_add]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
⊢ biprod.inl ≫ ((f ≫ biprod.fst ≫ biprod.inl + f ≫ biprod.snd ≫ biprod.inr) ≫ inv f) ≫ biprod.fst = 0
[PROOFSTEP]
simp only [Category.assoc]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
⊢ biprod.inl ≫ (f ≫ biprod.fst ≫ biprod.inl + f ≫ biprod.snd ≫ biprod.inr) ≫ inv f ≫ biprod.fst = 0
[PROOFSTEP]
rw [comp_add_assoc, add_comp]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
⊢ (biprod.inl ≫ f ≫ biprod.fst ≫ biprod.inl) ≫ inv f ≫ biprod.fst +
      (biprod.inl ≫ f ≫ biprod.snd ≫ biprod.inr) ≫ inv f ≫ biprod.fst =
    0
[PROOFSTEP]
conv_lhs =>
  congr
  next => skip
  slice 1 3
  rw [a₂]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| (biprod.inl ≫ f ≫ biprod.fst ≫ biprod.inl) ≫ inv f ≫ biprod.fst +
    (biprod.inl ≫ f ≫ biprod.snd ≫ biprod.inr) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
  congr
  next => skip
  slice 1 3
  rw [a₂]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| (biprod.inl ≫ f ≫ biprod.fst ≫ biprod.inl) ≫ inv f ≫ biprod.fst +
    (biprod.inl ≫ f ≫ biprod.snd ≫ biprod.inr) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
  congr
  next => skip
  slice 1 3
  rw [a₂]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| (biprod.inl ≫ f ≫ biprod.fst ≫ biprod.inl) ≫ inv f ≫ biprod.fst +
    (biprod.inl ≫ f ≫ biprod.snd ≫ biprod.inr) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
congr
[GOAL]
case a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| (biprod.inl ≫ f ≫ biprod.fst ≫ biprod.inl) ≫ inv f ≫ biprod.fst
case a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| (biprod.inl ≫ f ≫ biprod.snd ≫ biprod.inr) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
next => skip
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| (biprod.inl ≫ f ≫ biprod.fst ≫ biprod.inl) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
skip
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| (biprod.inl ≫ f ≫ biprod.fst ≫ biprod.inl) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
skip
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| (biprod.inl ≫ f ≫ biprod.fst ≫ biprod.inl) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
skip
[GOAL]
case a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| (biprod.inl ≫ f ≫ biprod.snd ≫ biprod.inr) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
slice 1 3
[GOAL]
case a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| (biprod.inl ≫ f ≫ biprod.snd ≫ biprod.inr) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
slice 1 3
[GOAL]
case a.a.a.a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| biprod.inl ≫ f ≫ biprod.snd
case a.a.a.a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| biprod.inr
case a.a.a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| inv f
case a.a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| biprod.fst
[PROOFSTEP]
rw [a₂]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
⊢ (biprod.inl ≫ f ≫ biprod.fst ≫ biprod.inl) ≫ inv f ≫ biprod.fst + ((0 ≫ biprod.inr) ≫ inv f) ≫ biprod.fst = 0
[PROOFSTEP]
simp only [zero_comp, add_zero]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
⊢ (biprod.inl ≫ f ≫ biprod.fst ≫ biprod.inl) ≫ inv f ≫ biprod.fst = 0
[PROOFSTEP]
conv_lhs =>
  slice 1 3
  rw [a₁]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| (biprod.inl ≫ f ≫ biprod.fst ≫ biprod.inl) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
  slice 1 3
  rw [a₁]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| (biprod.inl ≫ f ≫ biprod.fst ≫ biprod.inl) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
  slice 1 3
  rw [a₁]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| (biprod.inl ≫ f ≫ biprod.fst ≫ biprod.inl) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
slice 1 3
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| (biprod.inl ≫ f ≫ biprod.fst ≫ biprod.inl) ≫ inv f ≫ biprod.fst
[PROOFSTEP]
slice 1 3
[GOAL]
case a.a.a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| biprod.inl ≫ f ≫ biprod.fst
case a.a.a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| biprod.inl
case a.a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| inv f
case a
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
| biprod.fst
[PROOFSTEP]
rw [a₁]
[GOAL]
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
⊢ ((0 ≫ biprod.inl) ≫ inv f) ≫ biprod.fst = 0
[PROOFSTEP]
simp only [zero_comp]
[GOAL]
case intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
inst✝¹ : HasBinaryBiproducts C
X₁ X₂ Y₁ Y₂ : C
f₁₁ : X₁ ⟶ Y₁
f₁₂ : X₁ ⟶ Y₂
f₂₁ : X₂ ⟶ Y₁
f₂₂ : X₂ ⟶ Y₂
W X Y Z : C
f : W ⊞ X ⟶ Y ⊞ Z
inst✝ : IsIso f
nz : 𝟙 W ≠ 0
a₁ : biprod.inl ≫ f ≫ biprod.fst = 0
a₂ : biprod.inl ≫ f ≫ biprod.snd = 0
x : W ⟶ W := biprod.inl ≫ f ≫ inv f ≫ biprod.fst
h₁ : x = 𝟙 W
h₀ : x = 0
⊢ False
[PROOFSTEP]
exact nz (h₁.symm.trans h₀)
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
⊢ (∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0) → 𝟙 (S s) = 0
[PROOFSTEP]
cases nonempty_fintype τ
[GOAL]
case intro
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
⊢ (∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0) → 𝟙 (S s) = 0
[PROOFSTEP]
intro z
[GOAL]
case intro
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
⊢ 𝟙 (S s) = 0
[PROOFSTEP]
have reassoced {t : τ} {W : C} (h : _ ⟶ W) : biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h :=
  by
  simp only [← Category.assoc]
  apply eq_whisker
  simp only [Category.assoc]
  apply z
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
t : τ
W : C
h : T t ⟶ W
⊢ biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
[PROOFSTEP]
simp only [← Category.assoc]
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
t : τ
W : C
h : T t ⟶ W
⊢ ((biproduct.ι S s ≫ f) ≫ biproduct.π T t) ≫ h = 0 ≫ h
[PROOFSTEP]
apply eq_whisker
[GOAL]
case w
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
t : τ
W : C
h : T t ⟶ W
⊢ (biproduct.ι S s ≫ f) ≫ biproduct.π T t = 0
[PROOFSTEP]
simp only [Category.assoc]
[GOAL]
case w
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
t : τ
W : C
h : T t ⟶ W
⊢ biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
[PROOFSTEP]
apply z
[GOAL]
case intro
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
⊢ 𝟙 (S s) = 0
[PROOFSTEP]
set x := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
[GOAL]
case intro
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
⊢ 𝟙 (S s) = 0
[PROOFSTEP]
have h₁ : x = 𝟙 (S s) := by simp
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
⊢ x = 𝟙 (S s)
[PROOFSTEP]
simp
[GOAL]
case intro
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
⊢ 𝟙 (S s) = 0
[PROOFSTEP]
have h₀ : x = 0 := by
  dsimp
  rw [← Category.id_comp (inv f), Category.assoc, ← biproduct.total]
  simp only [comp_sum_assoc]
  conv_lhs =>
    congr
    congr
    next => skip
    intro j; simp only [reassoced]
  simp
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
⊢ x = 0
[PROOFSTEP]
dsimp
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
⊢ biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s = 0
[PROOFSTEP]
rw [← Category.id_comp (inv f), Category.assoc, ← biproduct.total]
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
⊢ biproduct.ι S s ≫ f ≫ (∑ j : τ, biproduct.π T j ≫ biproduct.ι T j) ≫ inv f ≫ biproduct.π S s = 0
[PROOFSTEP]
simp only [comp_sum_assoc]
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
⊢ (∑ j : τ, biproduct.ι S s ≫ f ≫ biproduct.π T j ≫ biproduct.ι T j) ≫ inv f ≫ biproduct.π S s = 0
[PROOFSTEP]
conv_lhs =>
  congr
  congr
  next => skip
  intro j; simp only [reassoced]
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
| (∑ j : τ, biproduct.ι S s ≫ f ≫ biproduct.π T j ≫ biproduct.ι T j) ≫ inv f ≫ biproduct.π S s
[PROOFSTEP]
  congr
  congr
  next => skip
  intro j; simp only [reassoced]
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
| (∑ j : τ, biproduct.ι S s ≫ f ≫ biproduct.π T j ≫ biproduct.ι T j) ≫ inv f ≫ biproduct.π S s
[PROOFSTEP]
  congr
  congr
  next => skip
  intro j; simp only [reassoced]
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
| (∑ j : τ, biproduct.ι S s ≫ f ≫ biproduct.π T j ≫ biproduct.ι T j) ≫ inv f ≫ biproduct.π S s
[PROOFSTEP]
congr
[GOAL]
case a
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
| ∑ j : τ, biproduct.ι S s ≫ f ≫ biproduct.π T j ≫ biproduct.ι T j
case a
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
| inv f ≫ biproduct.π S s
[PROOFSTEP]
congr
[GOAL]
case a.s
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
| Finset.univ
case a.f
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
| fun j => biproduct.ι S s ≫ f ≫ biproduct.π T j ≫ biproduct.ι T j
case a
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
| inv f ≫ biproduct.π S s
[PROOFSTEP]
next => skip
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
| Finset.univ
[PROOFSTEP]
skip
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
| Finset.univ
[PROOFSTEP]
skip
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
| Finset.univ
[PROOFSTEP]
skip
[GOAL]
case a.f
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
| fun j => biproduct.ι S s ≫ f ≫ biproduct.π T j ≫ biproduct.ι T j
case a
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
| inv f ≫ biproduct.π S s
[PROOFSTEP]
intro j
[GOAL]
case a.f.h
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
j : τ
| biproduct.ι S s ≫ f ≫ biproduct.π T j ≫ biproduct.ι T j
case a
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
| inv f ≫ biproduct.π S s
[PROOFSTEP]
simp only [reassoced]
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
⊢ (∑ j : τ, 0 ≫ biproduct.ι T j) ≫ inv f ≫ biproduct.π S s = 0
[PROOFSTEP]
simp
[GOAL]
case intro
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Finite τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
val✝ : Fintype τ
z : ∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0
reassoced : ∀ {t : τ} {W : C} (h : T t ⟶ W), biproduct.ι S s ≫ f ≫ biproduct.π T t ≫ h = 0 ≫ h
x : S s ⟶ S s := biproduct.ι S s ≫ f ≫ inv f ≫ biproduct.π S s
h₁ : x = 𝟙 (S s)
h₀ : x = 0
⊢ 𝟙 (S s) = 0
[PROOFSTEP]
exact h₁.symm.trans h₀
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Fintype τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
nz : 𝟙 (S s) ≠ 0
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
⊢ Trunc ((t : τ) ×' biproduct.ι S s ≫ f ≫ biproduct.π T t ≠ 0)
[PROOFSTEP]
classical
apply truncSigmaOfExists
have t := Biproduct.column_nonzero_of_iso'.{v} s f
by_contra h
simp only [not_exists_not] at h 
exact nz (t h)
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Fintype τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
nz : 𝟙 (S s) ≠ 0
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
⊢ Trunc ((t : τ) ×' biproduct.ι S s ≫ f ≫ biproduct.π T t ≠ 0)
[PROOFSTEP]
apply truncSigmaOfExists
[GOAL]
case h
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Fintype τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
nz : 𝟙 (S s) ≠ 0
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
⊢ ∃ a, biproduct.ι S s ≫ f ≫ biproduct.π T a ≠ 0
[PROOFSTEP]
have t := Biproduct.column_nonzero_of_iso'.{v} s f
[GOAL]
case h
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Fintype τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
nz : 𝟙 (S s) ≠ 0
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
t : (∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0) → 𝟙 (S s) = 0
⊢ ∃ a, biproduct.ι S s ≫ f ≫ biproduct.π T a ≠ 0
[PROOFSTEP]
by_contra h
[GOAL]
case h
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Fintype τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
nz : 𝟙 (S s) ≠ 0
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
t : (∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0) → 𝟙 (S s) = 0
h : ¬∃ a, biproduct.ι S s ≫ f ≫ biproduct.π T a ≠ 0
⊢ False
[PROOFSTEP]
simp only [not_exists_not] at h 
[GOAL]
case h
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
σ τ : Type
inst✝³ : Fintype τ
S : σ → C
inst✝² : HasBiproduct S
T : τ → C
inst✝¹ : HasBiproduct T
s : σ
nz : 𝟙 (S s) ≠ 0
f : ⨁ S ⟶ ⨁ T
inst✝ : IsIso f
t : (∀ (t : τ), biproduct.ι S s ≫ f ≫ biproduct.π T t = 0) → 𝟙 (S s) = 0
h : ∀ (x : τ), biproduct.ι S s ≫ f ≫ biproduct.π T x = 0
⊢ False
[PROOFSTEP]
exact nz (t h)
[GOAL]
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : Preadditive C
D : Type u'
inst✝⁴ : Category.{v', u'} D
inst✝³ : Preadditive D
F : C ⥤ D
inst✝² : PreservesZeroMorphisms F
J : Type
inst✝¹ : Fintype J
f : J → C
inst✝ : PreservesBiproduct f F
c✝ : Cone (Discrete.functor f)
hc : IsLimit c✝
⊢ ∀ (j : Discrete J),
    NatTrans.app
        ((Cones.postcompose (Discrete.compNatIsoDiscrete f F).inv).obj
            (Bicone.toCone (mapBicone F (Bicone.ofLimitCone hc)))).π
        j =
      (Iso.refl
            ((Cones.postcompose (Discrete.compNatIsoDiscrete f F).inv).obj
                (Bicone.toCone (mapBicone F (Bicone.ofLimitCone hc)))).pt).hom ≫
        NatTrans.app (F.mapCone c✝).π j
[PROOFSTEP]
rintro ⟨⟩
[GOAL]
case mk
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : Preadditive C
D : Type u'
inst✝⁴ : Category.{v', u'} D
inst✝³ : Preadditive D
F : C ⥤ D
inst✝² : PreservesZeroMorphisms F
J : Type
inst✝¹ : Fintype J
f : J → C
inst✝ : PreservesBiproduct f F
c✝ : Cone (Discrete.functor f)
hc : IsLimit c✝
as✝ : J
⊢ NatTrans.app
      ((Cones.postcompose (Discrete.compNatIsoDiscrete f F).inv).obj
          (Bicone.toCone (mapBicone F (Bicone.ofLimitCone hc)))).π
      { as := as✝ } =
    (Iso.refl
          ((Cones.postcompose (Discrete.compNatIsoDiscrete f F).inv).obj
              (Bicone.toCone (mapBicone F (Bicone.ofLimitCone hc)))).pt).hom ≫
      NatTrans.app (F.mapCone c✝).π { as := as✝ }
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : Preadditive C
D : Type u'
inst✝⁴ : Category.{v', u'} D
inst✝³ : Preadditive D
F : C ⥤ D
inst✝² : PreservesZeroMorphisms F
J : Type
inst✝¹ : Fintype J
f : J → C
inst✝ : PreservesLimit (Discrete.functor f) F
b : Bicone f
hb : Bicone.IsBilimit b
⊢ ∀ (j : Discrete J),
    NatTrans.app ((Cones.postcompose (Discrete.compNatIsoDiscrete f F).hom).obj (F.mapCone (Bicone.toCone b))).π j =
      (Iso.refl ((Cones.postcompose (Discrete.compNatIsoDiscrete f F).hom).obj (F.mapCone (Bicone.toCone b))).pt).hom ≫
        NatTrans.app (Bicone.toCone (mapBicone F b)).π j
[PROOFSTEP]
rintro ⟨⟩
[GOAL]
case mk
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : Preadditive C
D : Type u'
inst✝⁴ : Category.{v', u'} D
inst✝³ : Preadditive D
F : C ⥤ D
inst✝² : PreservesZeroMorphisms F
J : Type
inst✝¹ : Fintype J
f : J → C
inst✝ : PreservesLimit (Discrete.functor f) F
b : Bicone f
hb : Bicone.IsBilimit b
as✝ : J
⊢ NatTrans.app ((Cones.postcompose (Discrete.compNatIsoDiscrete f F).hom).obj (F.mapCone (Bicone.toCone b))).π
      { as := as✝ } =
    (Iso.refl ((Cones.postcompose (Discrete.compNatIsoDiscrete f F).hom).obj (F.mapCone (Bicone.toCone b))).pt).hom ≫
      NatTrans.app (Bicone.toCone (mapBicone F b)).π { as := as✝ }
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Mono (biproductComparison F f)
⊢ PreservesBiproduct f F
[PROOFSTEP]
haveI : HasProduct fun b => F.obj (f b) := by
  change HasProduct (F.obj ∘ f)
  infer_instance
[GOAL]
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Mono (biproductComparison F f)
⊢ HasProduct fun b => F.obj (f b)
[PROOFSTEP]
change HasProduct (F.obj ∘ f)
[GOAL]
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Mono (biproductComparison F f)
⊢ HasProduct (F.obj ∘ f)
[PROOFSTEP]
infer_instance
[GOAL]
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Mono (biproductComparison F f)
this : HasProduct fun b => F.obj (f b)
⊢ PreservesBiproduct f F
[PROOFSTEP]
have that :
  piComparison F f = (F.mapIso (biproduct.isoProduct f)).inv ≫ biproductComparison F f ≫ (biproduct.isoProduct _).hom :=
  by
  ext j
  convert piComparison_comp_π F f j; simp [← Functor.map_comp]
[GOAL]
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Mono (biproductComparison F f)
this : HasProduct fun b => F.obj (f b)
⊢ piComparison F f =
    (F.mapIso (biproduct.isoProduct f)).inv ≫ biproductComparison F f ≫ (biproduct.isoProduct (F.obj ∘ f)).hom
[PROOFSTEP]
ext j
[GOAL]
case h
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Mono (biproductComparison F f)
this : HasProduct fun b => F.obj (f b)
j : J
⊢ piComparison F f ≫ Pi.π (fun b => F.obj (f b)) j =
    ((F.mapIso (biproduct.isoProduct f)).inv ≫ biproductComparison F f ≫ (biproduct.isoProduct (F.obj ∘ f)).hom) ≫
      Pi.π (fun b => F.obj (f b)) j
[PROOFSTEP]
convert piComparison_comp_π F f j
[GOAL]
case h.e'_3
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Mono (biproductComparison F f)
this : HasProduct fun b => F.obj (f b)
j : J
⊢ ((F.mapIso (biproduct.isoProduct f)).inv ≫ biproductComparison F f ≫ (biproduct.isoProduct (F.obj ∘ f)).hom) ≫
      Pi.π (fun b => F.obj (f b)) j =
    F.map (Pi.π f j)
[PROOFSTEP]
simp [← Functor.map_comp]
[GOAL]
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Mono (biproductComparison F f)
this : HasProduct fun b => F.obj (f b)
that :
  piComparison F f =
    (F.mapIso (biproduct.isoProduct f)).inv ≫ biproductComparison F f ≫ (biproduct.isoProduct (F.obj ∘ f)).hom
⊢ PreservesBiproduct f F
[PROOFSTEP]
haveI : IsIso (biproductComparison F f) := isIso_of_mono_of_isSplitEpi _
[GOAL]
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Mono (biproductComparison F f)
this✝ : HasProduct fun b => F.obj (f b)
that :
  piComparison F f =
    (F.mapIso (biproduct.isoProduct f)).inv ≫ biproductComparison F f ≫ (biproduct.isoProduct (F.obj ∘ f)).hom
this : IsIso (biproductComparison F f)
⊢ PreservesBiproduct f F
[PROOFSTEP]
haveI : IsIso (piComparison F f) := by
  rw [that]
  infer_instance
[GOAL]
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Mono (biproductComparison F f)
this✝ : HasProduct fun b => F.obj (f b)
that :
  piComparison F f =
    (F.mapIso (biproduct.isoProduct f)).inv ≫ biproductComparison F f ≫ (biproduct.isoProduct (F.obj ∘ f)).hom
this : IsIso (biproductComparison F f)
⊢ IsIso (piComparison F f)
[PROOFSTEP]
rw [that]
[GOAL]
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Mono (biproductComparison F f)
this✝ : HasProduct fun b => F.obj (f b)
that :
  piComparison F f =
    (F.mapIso (biproduct.isoProduct f)).inv ≫ biproductComparison F f ≫ (biproduct.isoProduct (F.obj ∘ f)).hom
this : IsIso (biproductComparison F f)
⊢ IsIso ((F.mapIso (biproduct.isoProduct f)).inv ≫ biproductComparison F f ≫ (biproduct.isoProduct (F.obj ∘ f)).hom)
[PROOFSTEP]
infer_instance
[GOAL]
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Mono (biproductComparison F f)
this✝¹ : HasProduct fun b => F.obj (f b)
that :
  piComparison F f =
    (F.mapIso (biproduct.isoProduct f)).inv ≫ biproductComparison F f ≫ (biproduct.isoProduct (F.obj ∘ f)).hom
this✝ : IsIso (biproductComparison F f)
this : IsIso (piComparison F f)
⊢ PreservesBiproduct f F
[PROOFSTEP]
haveI := PreservesProduct.ofIsoComparison F f
[GOAL]
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Mono (biproductComparison F f)
this✝² : HasProduct fun b => F.obj (f b)
that :
  piComparison F f =
    (F.mapIso (biproduct.isoProduct f)).inv ≫ biproductComparison F f ≫ (biproduct.isoProduct (F.obj ∘ f)).hom
this✝¹ : IsIso (biproductComparison F f)
this✝ : IsIso (piComparison F f)
this : PreservesLimit (Discrete.functor f) F
⊢ PreservesBiproduct f F
[PROOFSTEP]
apply preservesBiproductOfPreservesProduct
[GOAL]
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Epi (biproductComparison' F f)
⊢ PreservesBiproduct f F
[PROOFSTEP]
haveI : Epi (splitEpiBiproductComparison F f).section_ := by simpa
[GOAL]
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Epi (biproductComparison' F f)
⊢ Epi (splitEpiBiproductComparison F f).section_
[PROOFSTEP]
simpa
[GOAL]
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Epi (biproductComparison' F f)
this : Epi (splitEpiBiproductComparison F f).section_
⊢ PreservesBiproduct f F
[PROOFSTEP]
haveI : IsIso (biproductComparison F f) := IsIso.of_epi_section' (splitEpiBiproductComparison F f)
[GOAL]
C : Type u
inst✝⁸ : Category.{v, u} C
inst✝⁷ : Preadditive C
D : Type u'
inst✝⁶ : Category.{v', u'} D
inst✝⁵ : Preadditive D
F : C ⥤ D
inst✝⁴ : PreservesZeroMorphisms F
J : Type
inst✝³ : Fintype J
f : J → C
inst✝² : HasBiproduct f
inst✝¹ : HasBiproduct (F.obj ∘ f)
inst✝ : Epi (biproductComparison' F f)
this✝ : Epi (splitEpiBiproductComparison F f).section_
this : IsIso (biproductComparison F f)
⊢ PreservesBiproduct f F
[PROOFSTEP]
apply preservesBiproductOfMonoBiproductComparison
[GOAL]
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : Preadditive C
D : Type u'
inst✝⁴ : Category.{v', u'} D
inst✝³ : Preadditive D
F : C ⥤ D
inst✝² : PreservesZeroMorphisms F
J : Type
inst✝¹ : Fintype J
f : J → C
inst✝ : PreservesBiproduct f F
c : Cocone (Discrete.functor f)
hc : IsColimit c
⊢ ∀ (j : Discrete J),
    NatTrans.app
          ((Cocones.precompose (Discrete.compNatIsoDiscrete f F).hom).obj
              (Bicone.toCocone (mapBicone F (Bicone.ofColimitCocone hc)))).ι
          j ≫
        (Iso.refl
            ((Cocones.precompose (Discrete.compNatIsoDiscrete f F).hom).obj
                (Bicone.toCocone (mapBicone F (Bicone.ofColimitCocone hc)))).pt).hom =
      NatTrans.app (F.mapCocone c).ι j
[PROOFSTEP]
rintro ⟨⟩
[GOAL]
case mk
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : Preadditive C
D : Type u'
inst✝⁴ : Category.{v', u'} D
inst✝³ : Preadditive D
F : C ⥤ D
inst✝² : PreservesZeroMorphisms F
J : Type
inst✝¹ : Fintype J
f : J → C
inst✝ : PreservesBiproduct f F
c : Cocone (Discrete.functor f)
hc : IsColimit c
as✝ : J
⊢ NatTrans.app
        ((Cocones.precompose (Discrete.compNatIsoDiscrete f F).hom).obj
            (Bicone.toCocone (mapBicone F (Bicone.ofColimitCocone hc)))).ι
        { as := as✝ } ≫
      (Iso.refl
          ((Cocones.precompose (Discrete.compNatIsoDiscrete f F).hom).obj
              (Bicone.toCocone (mapBicone F (Bicone.ofColimitCocone hc)))).pt).hom =
    NatTrans.app (F.mapCocone c).ι { as := as✝ }
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : Preadditive C
D : Type u'
inst✝⁴ : Category.{v', u'} D
inst✝³ : Preadditive D
F : C ⥤ D
inst✝² : PreservesZeroMorphisms F
J : Type
inst✝¹ : Fintype J
f : J → C
inst✝ : PreservesColimit (Discrete.functor f) F
b : Bicone f
hb : Bicone.IsBilimit b
⊢ ∀ (j : Discrete J),
    NatTrans.app ((Cocones.precompose (Discrete.compNatIsoDiscrete f F).inv).obj (F.mapCocone (Bicone.toCocone b))).ι
          j ≫
        (Iso.refl
            ((Cocones.precompose (Discrete.compNatIsoDiscrete f F).inv).obj (F.mapCocone (Bicone.toCocone b))).pt).hom =
      NatTrans.app (Bicone.toCocone (mapBicone F b)).ι j
[PROOFSTEP]
rintro ⟨⟩
[GOAL]
case mk
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : Preadditive C
D : Type u'
inst✝⁴ : Category.{v', u'} D
inst✝³ : Preadditive D
F : C ⥤ D
inst✝² : PreservesZeroMorphisms F
J : Type
inst✝¹ : Fintype J
f : J → C
inst✝ : PreservesColimit (Discrete.functor f) F
b : Bicone f
hb : Bicone.IsBilimit b
as✝ : J
⊢ NatTrans.app ((Cocones.precompose (Discrete.compNatIsoDiscrete f F).inv).obj (F.mapCocone (Bicone.toCocone b))).ι
        { as := as✝ } ≫
      (Iso.refl
          ((Cocones.precompose (Discrete.compNatIsoDiscrete f F).inv).obj (F.mapCocone (Bicone.toCocone b))).pt).hom =
    NatTrans.app (Bicone.toCocone (mapBicone F b)).ι { as := as✝ }
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesBinaryBiproduct X Y F
c : Cone (pair X Y)
hc : IsLimit c
⊢ ((Cones.postcompose (diagramIsoPair (pair X Y ⋙ F)).inv).obj
        (BinaryBicone.toCone (mapBinaryBicone F (BinaryBicone.ofLimitCone hc)))).pt ≅
    (F.mapCone c).pt
[PROOFSTEP]
dsimp
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesBinaryBiproduct X Y F
c : Cone (pair X Y)
hc : IsLimit c
⊢ F.obj c.pt ≅ F.obj c.pt
[PROOFSTEP]
rfl
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesBinaryBiproduct X Y F
c : Cone (pair X Y)
hc : IsLimit c
j : Discrete WalkingPair
⊢ NatTrans.app
      ((Cones.postcompose (diagramIsoPair (pair X Y ⋙ F)).inv).obj
          (BinaryBicone.toCone (mapBinaryBicone F (BinaryBicone.ofLimitCone hc)))).π
      j =
    (id (Iso.refl (F.obj c.pt))).hom ≫ NatTrans.app (F.mapCone c).π j
[PROOFSTEP]
rcases j with ⟨⟨⟩⟩
[GOAL]
case mk.left
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesBinaryBiproduct X Y F
c : Cone (pair X Y)
hc : IsLimit c
⊢ NatTrans.app
      ((Cones.postcompose (diagramIsoPair (pair X Y ⋙ F)).inv).obj
          (BinaryBicone.toCone (mapBinaryBicone F (BinaryBicone.ofLimitCone hc)))).π
      { as := WalkingPair.left } =
    (id (Iso.refl (F.obj c.pt))).hom ≫ NatTrans.app (F.mapCone c).π { as := WalkingPair.left }
[PROOFSTEP]
simp
[GOAL]
case mk.right
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesBinaryBiproduct X Y F
c : Cone (pair X Y)
hc : IsLimit c
⊢ NatTrans.app
      ((Cones.postcompose (diagramIsoPair (pair X Y ⋙ F)).inv).obj
          (BinaryBicone.toCone (mapBinaryBicone F (BinaryBicone.ofLimitCone hc)))).π
      { as := WalkingPair.right } =
    (id (Iso.refl (F.obj c.pt))).hom ≫ NatTrans.app (F.mapCone c).π { as := WalkingPair.right }
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesLimit (pair X Y) F
b : BinaryBicone X Y
hb : BinaryBicone.IsBilimit b
⊢ ((Cones.postcompose (diagramIsoPair (pair X Y ⋙ F)).hom).obj (F.mapCone (BinaryBicone.toCone b))).pt ≅
    (BinaryBicone.toCone (mapBinaryBicone F b)).pt
[PROOFSTEP]
dsimp
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesLimit (pair X Y) F
b : BinaryBicone X Y
hb : BinaryBicone.IsBilimit b
⊢ F.obj b.pt ≅ F.obj b.pt
[PROOFSTEP]
rfl
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesLimit (pair X Y) F
b : BinaryBicone X Y
hb : BinaryBicone.IsBilimit b
j : Discrete WalkingPair
⊢ NatTrans.app ((Cones.postcompose (diagramIsoPair (pair X Y ⋙ F)).hom).obj (F.mapCone (BinaryBicone.toCone b))).π j =
    (id (Iso.refl (F.obj b.pt))).hom ≫ NatTrans.app (BinaryBicone.toCone (mapBinaryBicone F b)).π j
[PROOFSTEP]
rcases j with ⟨⟨⟩⟩
[GOAL]
case mk.left
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesLimit (pair X Y) F
b : BinaryBicone X Y
hb : BinaryBicone.IsBilimit b
⊢ NatTrans.app ((Cones.postcompose (diagramIsoPair (pair X Y ⋙ F)).hom).obj (F.mapCone (BinaryBicone.toCone b))).π
      { as := WalkingPair.left } =
    (id (Iso.refl (F.obj b.pt))).hom ≫
      NatTrans.app (BinaryBicone.toCone (mapBinaryBicone F b)).π { as := WalkingPair.left }
[PROOFSTEP]
simp
[GOAL]
case mk.right
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesLimit (pair X Y) F
b : BinaryBicone X Y
hb : BinaryBicone.IsBilimit b
⊢ NatTrans.app ((Cones.postcompose (diagramIsoPair (pair X Y ⋙ F)).hom).obj (F.mapCone (BinaryBicone.toCone b))).π
      { as := WalkingPair.right } =
    (id (Iso.refl (F.obj b.pt))).hom ≫
      NatTrans.app (BinaryBicone.toCone (mapBinaryBicone F b)).π { as := WalkingPair.right }
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
D : Type u'
inst✝⁵ : Category.{v', u'} D
inst✝⁴ : Preadditive D
F : C ⥤ D
inst✝³ : PreservesZeroMorphisms F
X Y : C
inst✝² : HasBinaryBiproduct X Y
inst✝¹ : HasBinaryBiproduct (F.obj X) (F.obj Y)
inst✝ : Mono (biprodComparison F X Y)
⊢ PreservesBinaryBiproduct X Y F
[PROOFSTEP]
have that :
  prodComparison F X Y = (F.mapIso (biprod.isoProd X Y)).inv ≫ biprodComparison F X Y ≫ (biprod.isoProd _ _).hom := by
  ext <;> simp [← Functor.map_comp]
[GOAL]
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
D : Type u'
inst✝⁵ : Category.{v', u'} D
inst✝⁴ : Preadditive D
F : C ⥤ D
inst✝³ : PreservesZeroMorphisms F
X Y : C
inst✝² : HasBinaryBiproduct X Y
inst✝¹ : HasBinaryBiproduct (F.obj X) (F.obj Y)
inst✝ : Mono (biprodComparison F X Y)
⊢ prodComparison F X Y =
    (F.mapIso (biprod.isoProd X Y)).inv ≫ biprodComparison F X Y ≫ (biprod.isoProd (F.obj X) (F.obj Y)).hom
[PROOFSTEP]
ext
[GOAL]
case h₁
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
D : Type u'
inst✝⁵ : Category.{v', u'} D
inst✝⁴ : Preadditive D
F : C ⥤ D
inst✝³ : PreservesZeroMorphisms F
X Y : C
inst✝² : HasBinaryBiproduct X Y
inst✝¹ : HasBinaryBiproduct (F.obj X) (F.obj Y)
inst✝ : Mono (biprodComparison F X Y)
⊢ prodComparison F X Y ≫ prod.fst =
    ((F.mapIso (biprod.isoProd X Y)).inv ≫ biprodComparison F X Y ≫ (biprod.isoProd (F.obj X) (F.obj Y)).hom) ≫ prod.fst
[PROOFSTEP]
simp [← Functor.map_comp]
[GOAL]
case h₂
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
D : Type u'
inst✝⁵ : Category.{v', u'} D
inst✝⁴ : Preadditive D
F : C ⥤ D
inst✝³ : PreservesZeroMorphisms F
X Y : C
inst✝² : HasBinaryBiproduct X Y
inst✝¹ : HasBinaryBiproduct (F.obj X) (F.obj Y)
inst✝ : Mono (biprodComparison F X Y)
⊢ prodComparison F X Y ≫ prod.snd =
    ((F.mapIso (biprod.isoProd X Y)).inv ≫ biprodComparison F X Y ≫ (biprod.isoProd (F.obj X) (F.obj Y)).hom) ≫ prod.snd
[PROOFSTEP]
simp [← Functor.map_comp]
[GOAL]
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
D : Type u'
inst✝⁵ : Category.{v', u'} D
inst✝⁴ : Preadditive D
F : C ⥤ D
inst✝³ : PreservesZeroMorphisms F
X Y : C
inst✝² : HasBinaryBiproduct X Y
inst✝¹ : HasBinaryBiproduct (F.obj X) (F.obj Y)
inst✝ : Mono (biprodComparison F X Y)
that :
  prodComparison F X Y =
    (F.mapIso (biprod.isoProd X Y)).inv ≫ biprodComparison F X Y ≫ (biprod.isoProd (F.obj X) (F.obj Y)).hom
⊢ PreservesBinaryBiproduct X Y F
[PROOFSTEP]
haveI : IsIso (biprodComparison F X Y) := isIso_of_mono_of_isSplitEpi _
[GOAL]
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
D : Type u'
inst✝⁵ : Category.{v', u'} D
inst✝⁴ : Preadditive D
F : C ⥤ D
inst✝³ : PreservesZeroMorphisms F
X Y : C
inst✝² : HasBinaryBiproduct X Y
inst✝¹ : HasBinaryBiproduct (F.obj X) (F.obj Y)
inst✝ : Mono (biprodComparison F X Y)
that :
  prodComparison F X Y =
    (F.mapIso (biprod.isoProd X Y)).inv ≫ biprodComparison F X Y ≫ (biprod.isoProd (F.obj X) (F.obj Y)).hom
this : IsIso (biprodComparison F X Y)
⊢ PreservesBinaryBiproduct X Y F
[PROOFSTEP]
haveI : IsIso (prodComparison F X Y) := by
  rw [that]
  infer_instance
[GOAL]
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
D : Type u'
inst✝⁵ : Category.{v', u'} D
inst✝⁴ : Preadditive D
F : C ⥤ D
inst✝³ : PreservesZeroMorphisms F
X Y : C
inst✝² : HasBinaryBiproduct X Y
inst✝¹ : HasBinaryBiproduct (F.obj X) (F.obj Y)
inst✝ : Mono (biprodComparison F X Y)
that :
  prodComparison F X Y =
    (F.mapIso (biprod.isoProd X Y)).inv ≫ biprodComparison F X Y ≫ (biprod.isoProd (F.obj X) (F.obj Y)).hom
this : IsIso (biprodComparison F X Y)
⊢ IsIso (prodComparison F X Y)
[PROOFSTEP]
rw [that]
[GOAL]
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
D : Type u'
inst✝⁵ : Category.{v', u'} D
inst✝⁴ : Preadditive D
F : C ⥤ D
inst✝³ : PreservesZeroMorphisms F
X Y : C
inst✝² : HasBinaryBiproduct X Y
inst✝¹ : HasBinaryBiproduct (F.obj X) (F.obj Y)
inst✝ : Mono (biprodComparison F X Y)
that :
  prodComparison F X Y =
    (F.mapIso (biprod.isoProd X Y)).inv ≫ biprodComparison F X Y ≫ (biprod.isoProd (F.obj X) (F.obj Y)).hom
this : IsIso (biprodComparison F X Y)
⊢ IsIso ((F.mapIso (biprod.isoProd X Y)).inv ≫ biprodComparison F X Y ≫ (biprod.isoProd (F.obj X) (F.obj Y)).hom)
[PROOFSTEP]
infer_instance
[GOAL]
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
D : Type u'
inst✝⁵ : Category.{v', u'} D
inst✝⁴ : Preadditive D
F : C ⥤ D
inst✝³ : PreservesZeroMorphisms F
X Y : C
inst✝² : HasBinaryBiproduct X Y
inst✝¹ : HasBinaryBiproduct (F.obj X) (F.obj Y)
inst✝ : Mono (biprodComparison F X Y)
that :
  prodComparison F X Y =
    (F.mapIso (biprod.isoProd X Y)).inv ≫ biprodComparison F X Y ≫ (biprod.isoProd (F.obj X) (F.obj Y)).hom
this✝ : IsIso (biprodComparison F X Y)
this : IsIso (prodComparison F X Y)
⊢ PreservesBinaryBiproduct X Y F
[PROOFSTEP]
haveI := PreservesLimitPair.ofIsoProdComparison F X Y
[GOAL]
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
D : Type u'
inst✝⁵ : Category.{v', u'} D
inst✝⁴ : Preadditive D
F : C ⥤ D
inst✝³ : PreservesZeroMorphisms F
X Y : C
inst✝² : HasBinaryBiproduct X Y
inst✝¹ : HasBinaryBiproduct (F.obj X) (F.obj Y)
inst✝ : Mono (biprodComparison F X Y)
that :
  prodComparison F X Y =
    (F.mapIso (biprod.isoProd X Y)).inv ≫ biprodComparison F X Y ≫ (biprod.isoProd (F.obj X) (F.obj Y)).hom
this✝¹ : IsIso (biprodComparison F X Y)
this✝ : IsIso (prodComparison F X Y)
this : PreservesLimit (pair X Y) F
⊢ PreservesBinaryBiproduct X Y F
[PROOFSTEP]
apply preservesBinaryBiproductOfPreservesBinaryProduct
[GOAL]
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
D : Type u'
inst✝⁵ : Category.{v', u'} D
inst✝⁴ : Preadditive D
F : C ⥤ D
inst✝³ : PreservesZeroMorphisms F
X Y : C
inst✝² : HasBinaryBiproduct X Y
inst✝¹ : HasBinaryBiproduct (F.obj X) (F.obj Y)
inst✝ : Epi (biprodComparison' F X Y)
⊢ PreservesBinaryBiproduct X Y F
[PROOFSTEP]
haveI : Epi (splitEpiBiprodComparison F X Y).section_ := by simpa
[GOAL]
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
D : Type u'
inst✝⁵ : Category.{v', u'} D
inst✝⁴ : Preadditive D
F : C ⥤ D
inst✝³ : PreservesZeroMorphisms F
X Y : C
inst✝² : HasBinaryBiproduct X Y
inst✝¹ : HasBinaryBiproduct (F.obj X) (F.obj Y)
inst✝ : Epi (biprodComparison' F X Y)
⊢ Epi (splitEpiBiprodComparison F X Y).section_
[PROOFSTEP]
simpa
[GOAL]
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
D : Type u'
inst✝⁵ : Category.{v', u'} D
inst✝⁴ : Preadditive D
F : C ⥤ D
inst✝³ : PreservesZeroMorphisms F
X Y : C
inst✝² : HasBinaryBiproduct X Y
inst✝¹ : HasBinaryBiproduct (F.obj X) (F.obj Y)
inst✝ : Epi (biprodComparison' F X Y)
this : Epi (splitEpiBiprodComparison F X Y).section_
⊢ PreservesBinaryBiproduct X Y F
[PROOFSTEP]
haveI : IsIso (biprodComparison F X Y) := IsIso.of_epi_section' (splitEpiBiprodComparison F X Y)
[GOAL]
C : Type u
inst✝⁷ : Category.{v, u} C
inst✝⁶ : Preadditive C
D : Type u'
inst✝⁵ : Category.{v', u'} D
inst✝⁴ : Preadditive D
F : C ⥤ D
inst✝³ : PreservesZeroMorphisms F
X Y : C
inst✝² : HasBinaryBiproduct X Y
inst✝¹ : HasBinaryBiproduct (F.obj X) (F.obj Y)
inst✝ : Epi (biprodComparison' F X Y)
this✝ : Epi (splitEpiBiprodComparison F X Y).section_
this : IsIso (biprodComparison F X Y)
⊢ PreservesBinaryBiproduct X Y F
[PROOFSTEP]
apply preservesBinaryBiproductOfMonoBiprodComparison
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesBinaryBiproduct X Y F
c : Cocone (pair X Y)
hc : IsColimit c
⊢ ((Cocones.precompose (diagramIsoPair (pair X Y ⋙ F)).hom).obj
        (BinaryBicone.toCocone (mapBinaryBicone F (BinaryBicone.ofColimitCocone hc)))).pt ≅
    (F.mapCocone c).pt
[PROOFSTEP]
dsimp
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesBinaryBiproduct X Y F
c : Cocone (pair X Y)
hc : IsColimit c
⊢ F.obj c.pt ≅ F.obj c.pt
[PROOFSTEP]
rfl
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesBinaryBiproduct X Y F
c : Cocone (pair X Y)
hc : IsColimit c
j : Discrete WalkingPair
⊢ NatTrans.app
        ((Cocones.precompose (diagramIsoPair (pair X Y ⋙ F)).hom).obj
            (BinaryBicone.toCocone (mapBinaryBicone F (BinaryBicone.ofColimitCocone hc)))).ι
        j ≫
      (id (Iso.refl (F.obj c.pt))).hom =
    NatTrans.app (F.mapCocone c).ι j
[PROOFSTEP]
rcases j with ⟨⟨⟩⟩
[GOAL]
case mk.left
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesBinaryBiproduct X Y F
c : Cocone (pair X Y)
hc : IsColimit c
⊢ NatTrans.app
        ((Cocones.precompose (diagramIsoPair (pair X Y ⋙ F)).hom).obj
            (BinaryBicone.toCocone (mapBinaryBicone F (BinaryBicone.ofColimitCocone hc)))).ι
        { as := WalkingPair.left } ≫
      (id (Iso.refl (F.obj c.pt))).hom =
    NatTrans.app (F.mapCocone c).ι { as := WalkingPair.left }
[PROOFSTEP]
simp
[GOAL]
case mk.right
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesBinaryBiproduct X Y F
c : Cocone (pair X Y)
hc : IsColimit c
⊢ NatTrans.app
        ((Cocones.precompose (diagramIsoPair (pair X Y ⋙ F)).hom).obj
            (BinaryBicone.toCocone (mapBinaryBicone F (BinaryBicone.ofColimitCocone hc)))).ι
        { as := WalkingPair.right } ≫
      (id (Iso.refl (F.obj c.pt))).hom =
    NatTrans.app (F.mapCocone c).ι { as := WalkingPair.right }
[PROOFSTEP]
simp
[GOAL]
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesColimit (pair X Y) F
b : BinaryBicone X Y
hb : BinaryBicone.IsBilimit b
j : Discrete WalkingPair
⊢ NatTrans.app ((Cocones.precompose (diagramIsoPair (pair X Y ⋙ F)).inv).obj (F.mapCocone (BinaryBicone.toCocone b))).ι
        j ≫
      (Iso.refl
          ((Cocones.precompose (diagramIsoPair (pair X Y ⋙ F)).inv).obj
              (F.mapCocone (BinaryBicone.toCocone b))).pt).hom =
    NatTrans.app (BinaryBicone.toCocone (mapBinaryBicone F b)).ι j
[PROOFSTEP]
rcases j with ⟨⟨⟩⟩
[GOAL]
case mk.left
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesColimit (pair X Y) F
b : BinaryBicone X Y
hb : BinaryBicone.IsBilimit b
⊢ NatTrans.app ((Cocones.precompose (diagramIsoPair (pair X Y ⋙ F)).inv).obj (F.mapCocone (BinaryBicone.toCocone b))).ι
        { as := WalkingPair.left } ≫
      (Iso.refl
          ((Cocones.precompose (diagramIsoPair (pair X Y ⋙ F)).inv).obj
              (F.mapCocone (BinaryBicone.toCocone b))).pt).hom =
    NatTrans.app (BinaryBicone.toCocone (mapBinaryBicone F b)).ι { as := WalkingPair.left }
[PROOFSTEP]
simp
[GOAL]
case mk.right
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : Preadditive C
D : Type u'
inst✝³ : Category.{v', u'} D
inst✝² : Preadditive D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
X Y : C
inst✝ : PreservesColimit (pair X Y) F
b : BinaryBicone X Y
hb : BinaryBicone.IsBilimit b
⊢ NatTrans.app ((Cocones.precompose (diagramIsoPair (pair X Y ⋙ F)).inv).obj (F.mapCocone (BinaryBicone.toCocone b))).ι
        { as := WalkingPair.right } ≫
      (Iso.refl
          ((Cocones.precompose (diagramIsoPair (pair X Y ⋙ F)).inv).obj
              (F.mapCocone (BinaryBicone.toCocone b))).pt).hom =
    NatTrans.app (BinaryBicone.toCocone (mapBinaryBicone F b)).ι { as := WalkingPair.right }
[PROOFSTEP]
simp
