[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ (kernel.ι g ≫ cokernel.π f) ≫ cokernel.desc f g w = 0
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ kernel.lift g f w ≫
      kernel.lift (cokernel.desc f g w) (kernel.ι g ≫ cokernel.π f)
        (_ : (kernel.ι g ≫ cokernel.π f) ≫ cokernel.desc f g w = 0) =
    0
[PROOFSTEP]
ext
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ (kernel.lift g f w ≫
        kernel.lift (cokernel.desc f g w) (kernel.ι g ≫ cokernel.π f)
          (_ : (kernel.ι g ≫ cokernel.π f) ≫ cokernel.desc f g w = 0)) ≫
      equalizer.ι (cokernel.desc f g w) 0 =
    0 ≫ equalizer.ι (cokernel.desc f g w) 0
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ Mono (homologyCToK f g w)
[PROOFSTEP]
apply Pseudoelement.mono_of_zero_of_map_zero
[GOAL]
case a
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ ∀ (a : Pseudoelement (homologyC f g w)), Pseudoelement.pseudoApply (homologyCToK f g w) a = 0 → a = 0
[PROOFSTEP]
intro a ha
[GOAL]
case a
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyC f g w)
ha : Pseudoelement.pseudoApply (homologyCToK f g w) a = 0
⊢ a = 0
[PROOFSTEP]
obtain ⟨a, rfl⟩ := Pseudoelement.pseudo_surjective_of_epi (cokernel.π (kernel.lift g f w)) a
[GOAL]
case a.intro
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (kernel g)
ha : Pseudoelement.pseudoApply (homologyCToK f g w) (Pseudoelement.pseudoApply (cokernel.π (kernel.lift g f w)) a) = 0
⊢ Pseudoelement.pseudoApply (cokernel.π (kernel.lift g f w)) a = 0
[PROOFSTEP]
apply_fun kernel.ι (cokernel.desc f g w) at ha 
[GOAL]
case a.intro
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (kernel g)
ha :
  Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w))
      (Pseudoelement.pseudoApply (homologyCToK f g w) (Pseudoelement.pseudoApply (cokernel.π (kernel.lift g f w)) a)) =
    Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) 0
⊢ Pseudoelement.pseudoApply (cokernel.π (kernel.lift g f w)) a = 0
[PROOFSTEP]
simp only [← Pseudoelement.comp_apply, cokernel.π_desc, kernel.lift_ι, Pseudoelement.apply_zero] at ha 
[GOAL]
case a.intro
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (kernel g)
ha : Pseudoelement.pseudoApply (kernel.ι g ≫ cokernel.π f) a = 0
⊢ Pseudoelement.pseudoApply (cokernel.π (kernel.lift g f w)) a = 0
[PROOFSTEP]
simp only [Pseudoelement.comp_apply] at ha 
[GOAL]
case a.intro
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (kernel g)
ha : Pseudoelement.pseudoApply (cokernel.π f) (Pseudoelement.pseudoApply (kernel.ι g) a) = 0
⊢ Pseudoelement.pseudoApply (cokernel.π (kernel.lift g f w)) a = 0
[PROOFSTEP]
obtain ⟨b, hb⟩ : ∃ b, f b = _ := (Pseudoelement.pseudo_exact_of_exact (exact_cokernel f)).2 _ ha
[GOAL]
case a.intro.intro
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (kernel g)
ha : Pseudoelement.pseudoApply (cokernel.π f) (Pseudoelement.pseudoApply (kernel.ι g) a) = 0
b : Pseudoelement X
hb : Pseudoelement.pseudoApply f b = Pseudoelement.pseudoApply (kernel.ι g) a
⊢ Pseudoelement.pseudoApply (cokernel.π (kernel.lift g f w)) a = 0
[PROOFSTEP]
rsuffices ⟨c, rfl⟩ : ∃ c, kernel.lift g f w c = a
[GOAL]
case a.intro.intro.intro
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
b c : Pseudoelement X
ha :
  Pseudoelement.pseudoApply (cokernel.π f)
      (Pseudoelement.pseudoApply (kernel.ι g) (Pseudoelement.pseudoApply (kernel.lift g f w) c)) =
    0
hb :
  Pseudoelement.pseudoApply f b =
    Pseudoelement.pseudoApply (kernel.ι g) (Pseudoelement.pseudoApply (kernel.lift g f w) c)
⊢ Pseudoelement.pseudoApply (cokernel.π (kernel.lift g f w)) (Pseudoelement.pseudoApply (kernel.lift g f w) c) = 0
[PROOFSTEP]
simp [← Pseudoelement.comp_apply]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (kernel g)
ha : Pseudoelement.pseudoApply (cokernel.π f) (Pseudoelement.pseudoApply (kernel.ι g) a) = 0
b : Pseudoelement X
hb : Pseudoelement.pseudoApply f b = Pseudoelement.pseudoApply (kernel.ι g) a
⊢ ∃ c, Pseudoelement.pseudoApply (kernel.lift g f w) c = a
[PROOFSTEP]
use b
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (kernel g)
ha : Pseudoelement.pseudoApply (cokernel.π f) (Pseudoelement.pseudoApply (kernel.ι g) a) = 0
b : Pseudoelement X
hb : Pseudoelement.pseudoApply f b = Pseudoelement.pseudoApply (kernel.ι g) a
⊢ Pseudoelement.pseudoApply (kernel.lift g f w) b = a
[PROOFSTEP]
apply_fun kernel.ι g
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (kernel g)
ha : Pseudoelement.pseudoApply (cokernel.π f) (Pseudoelement.pseudoApply (kernel.ι g) a) = 0
b : Pseudoelement X
hb : Pseudoelement.pseudoApply f b = Pseudoelement.pseudoApply (kernel.ι g) a
⊢ Pseudoelement.pseudoApply (kernel.ι g) (Pseudoelement.pseudoApply (kernel.lift g f w) b) =
    Pseudoelement.pseudoApply (kernel.ι g) a
case h.inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (kernel g)
ha : Pseudoelement.pseudoApply (cokernel.π f) (Pseudoelement.pseudoApply (kernel.ι g) a) = 0
b : Pseudoelement X
hb : Pseudoelement.pseudoApply f b = Pseudoelement.pseudoApply (kernel.ι g) a
⊢ Function.Injective (Pseudoelement.pseudoApply (kernel.ι g))
[PROOFSTEP]
swap
[GOAL]
case h.inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (kernel g)
ha : Pseudoelement.pseudoApply (cokernel.π f) (Pseudoelement.pseudoApply (kernel.ι g) a) = 0
b : Pseudoelement X
hb : Pseudoelement.pseudoApply f b = Pseudoelement.pseudoApply (kernel.ι g) a
⊢ Function.Injective (Pseudoelement.pseudoApply (kernel.ι g))
[PROOFSTEP]
apply Pseudoelement.pseudo_injective_of_mono
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (kernel g)
ha : Pseudoelement.pseudoApply (cokernel.π f) (Pseudoelement.pseudoApply (kernel.ι g) a) = 0
b : Pseudoelement X
hb : Pseudoelement.pseudoApply f b = Pseudoelement.pseudoApply (kernel.ι g) a
⊢ Pseudoelement.pseudoApply (kernel.ι g) (Pseudoelement.pseudoApply (kernel.lift g f w) b) =
    Pseudoelement.pseudoApply (kernel.ι g) a
[PROOFSTEP]
simpa [← Pseudoelement.comp_apply]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ Epi (homologyCToK f g w)
[PROOFSTEP]
apply Pseudoelement.epi_of_pseudo_surjective
[GOAL]
case a
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ Function.Surjective (Pseudoelement.pseudoApply (homologyCToK f g w))
[PROOFSTEP]
intro a
[GOAL]
case a
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
⊢ ∃ a_1, Pseudoelement.pseudoApply (homologyCToK f g w) a_1 = a
[PROOFSTEP]
let b := kernel.ι (cokernel.desc f g w) a
[GOAL]
case a
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
⊢ ∃ a_1, Pseudoelement.pseudoApply (homologyCToK f g w) a_1 = a
[PROOFSTEP]
obtain ⟨c, hc⟩ : ∃ c, cokernel.π f c = b
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
⊢ ∃ c, Pseudoelement.pseudoApply (cokernel.π f) c = b
case a.intro
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
c : Pseudoelement Y
hc : Pseudoelement.pseudoApply (cokernel.π f) c = b
⊢ ∃ a_1, Pseudoelement.pseudoApply (homologyCToK f g w) a_1 = a
[PROOFSTEP]
apply Pseudoelement.pseudo_surjective_of_epi (cokernel.π f)
[GOAL]
case a.intro
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
c : Pseudoelement Y
hc : Pseudoelement.pseudoApply (cokernel.π f) c = b
⊢ ∃ a_1, Pseudoelement.pseudoApply (homologyCToK f g w) a_1 = a
[PROOFSTEP]
have : g c = 0 :=
  by
  rw [show g = cokernel.π f ≫ cokernel.desc f g w by simp, Pseudoelement.comp_apply, hc]
  simp [← Pseudoelement.comp_apply]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
c : Pseudoelement Y
hc : Pseudoelement.pseudoApply (cokernel.π f) c = b
⊢ Pseudoelement.pseudoApply g c = 0
[PROOFSTEP]
rw [show g = cokernel.π f ≫ cokernel.desc f g w by simp, Pseudoelement.comp_apply, hc]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
c : Pseudoelement Y
hc : Pseudoelement.pseudoApply (cokernel.π f) c = b
⊢ g = cokernel.π f ≫ cokernel.desc f g w
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
c : Pseudoelement Y
hc : Pseudoelement.pseudoApply (cokernel.π f) c = b
⊢ Pseudoelement.pseudoApply (cokernel.desc f g w) b = 0
[PROOFSTEP]
simp [← Pseudoelement.comp_apply]
[GOAL]
case a.intro
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
c : Pseudoelement Y
hc : Pseudoelement.pseudoApply (cokernel.π f) c = b
this : Pseudoelement.pseudoApply g c = 0
⊢ ∃ a_1, Pseudoelement.pseudoApply (homologyCToK f g w) a_1 = a
[PROOFSTEP]
obtain ⟨d, hd⟩ : ∃ d, kernel.ι g d = c := by apply (Pseudoelement.pseudo_exact_of_exact exact_kernel_ι).2 _ this
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
c : Pseudoelement Y
hc : Pseudoelement.pseudoApply (cokernel.π f) c = b
this : Pseudoelement.pseudoApply g c = 0
⊢ ∃ d, Pseudoelement.pseudoApply (kernel.ι g) d = c
[PROOFSTEP]
apply (Pseudoelement.pseudo_exact_of_exact exact_kernel_ι).2 _ this
[GOAL]
case a.intro.intro
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
c : Pseudoelement Y
hc : Pseudoelement.pseudoApply (cokernel.π f) c = b
this : Pseudoelement.pseudoApply g c = 0
d : Pseudoelement (kernel g)
hd : Pseudoelement.pseudoApply (kernel.ι g) d = c
⊢ ∃ a_1, Pseudoelement.pseudoApply (homologyCToK f g w) a_1 = a
[PROOFSTEP]
use cokernel.π (kernel.lift g f w) d
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
c : Pseudoelement Y
hc : Pseudoelement.pseudoApply (cokernel.π f) c = b
this : Pseudoelement.pseudoApply g c = 0
d : Pseudoelement (kernel g)
hd : Pseudoelement.pseudoApply (kernel.ι g) d = c
⊢ Pseudoelement.pseudoApply (homologyCToK f g w) (Pseudoelement.pseudoApply (cokernel.π (kernel.lift g f w)) d) = a
[PROOFSTEP]
apply_fun kernel.ι (cokernel.desc f g w)
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
c : Pseudoelement Y
hc : Pseudoelement.pseudoApply (cokernel.π f) c = b
this : Pseudoelement.pseudoApply g c = 0
d : Pseudoelement (kernel g)
hd : Pseudoelement.pseudoApply (kernel.ι g) d = c
⊢ Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w))
      (Pseudoelement.pseudoApply (homologyCToK f g w) (Pseudoelement.pseudoApply (cokernel.π (kernel.lift g f w)) d)) =
    Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
case h.inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
c : Pseudoelement Y
hc : Pseudoelement.pseudoApply (cokernel.π f) c = b
this : Pseudoelement.pseudoApply g c = 0
d : Pseudoelement (kernel g)
hd : Pseudoelement.pseudoApply (kernel.ι g) d = c
⊢ Function.Injective (Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)))
[PROOFSTEP]
swap
[GOAL]
case h.inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
c : Pseudoelement Y
hc : Pseudoelement.pseudoApply (cokernel.π f) c = b
this : Pseudoelement.pseudoApply g c = 0
d : Pseudoelement (kernel g)
hd : Pseudoelement.pseudoApply (kernel.ι g) d = c
⊢ Function.Injective (Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)))
[PROOFSTEP]
apply Pseudoelement.pseudo_injective_of_mono
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
c : Pseudoelement Y
hc : Pseudoelement.pseudoApply (cokernel.π f) c = b
this : Pseudoelement.pseudoApply g c = 0
d : Pseudoelement (kernel g)
hd : Pseudoelement.pseudoApply (kernel.ι g) d = c
⊢ Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w))
      (Pseudoelement.pseudoApply (homologyCToK f g w) (Pseudoelement.pseudoApply (cokernel.π (kernel.lift g f w)) d)) =
    Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
[PROOFSTEP]
simp only [← Pseudoelement.comp_apply, cokernel.π_desc, kernel.lift_ι]
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
a : Pseudoelement (homologyK f g w)
b : Pseudoelement (cokernel f) := Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
c : Pseudoelement Y
hc : Pseudoelement.pseudoApply (cokernel.π f) c = b
this : Pseudoelement.pseudoApply g c = 0
d : Pseudoelement (kernel g)
hd : Pseudoelement.pseudoApply (kernel.ι g) d = c
⊢ Pseudoelement.pseudoApply (kernel.ι g ≫ cokernel.π f) d = Pseudoelement.pseudoApply (kernel.ι (cokernel.desc f g w)) a
[PROOFSTEP]
simp only [Pseudoelement.comp_apply, hd, hc]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
e : kernel g ⟶ W
he : kernel.lift g f w ≫ e = 0
⊢ π' f g w ≫ desc' f g w e he = e
[PROOFSTEP]
dsimp [π', desc']
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
e : kernel g ⟶ W
he : kernel.lift g f w ≫ e = 0
⊢ (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫
      (homologyIsoCokernelLift f g w).hom ≫ cokernel.desc (kernel.lift g f w) e he =
    e
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
e : W ⟶ cokernel f
he : e ≫ cokernel.desc f g w = 0
⊢ lift f g w e he ≫ ι f g w = e
[PROOFSTEP]
dsimp [ι, lift]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
e : W ⟶ cokernel f
he : e ≫ cokernel.desc f g w = 0
⊢ (kernel.lift (cokernel.desc f g w) e he ≫ (homologyIsoKernelDesc f g w).inv) ≫
      (homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w) =
    e
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ kernel.lift g f w ≫ π' f g w = 0
[PROOFSTEP]
dsimp [π']
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ kernel.lift g f w ≫ cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv = 0
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ ι f g w ≫ cokernel.desc f g w = 0
[PROOFSTEP]
dsimp [ι]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ ((homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w)) ≫ cokernel.desc f g w = 0
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : homology f g w ⟶ W
h : π' f g w ≫ a = π' f g w ≫ b
⊢ a = b
[PROOFSTEP]
dsimp [π'] at h 
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : homology f g w ⟶ W
h :
  (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫ a =
    (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫ b
⊢ a = b
[PROOFSTEP]
apply_fun fun e => (homologyIsoCokernelLift f g w).inv ≫ e
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : homology f g w ⟶ W
h :
  (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫ a =
    (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫ b
⊢ (fun e => (homologyIsoCokernelLift f g w).inv ≫ e) a = (fun e => (homologyIsoCokernelLift f g w).inv ≫ e) b
case inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : homology f g w ⟶ W
h :
  (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫ a =
    (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫ b
⊢ Function.Injective fun e => (homologyIsoCokernelLift f g w).inv ≫ e
[PROOFSTEP]
swap
[GOAL]
case inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : homology f g w ⟶ W
h :
  (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫ a =
    (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫ b
⊢ Function.Injective fun e => (homologyIsoCokernelLift f g w).inv ≫ e
[PROOFSTEP]
intro i j hh
[GOAL]
case inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : homology f g w ⟶ W
h :
  (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫ a =
    (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫ b
i j : homology f g w ⟶ W
hh : (fun e => (homologyIsoCokernelLift f g w).inv ≫ e) i = (fun e => (homologyIsoCokernelLift f g w).inv ≫ e) j
⊢ i = j
[PROOFSTEP]
apply_fun fun e => (homologyIsoCokernelLift f g w).hom ≫ e at hh 
[GOAL]
case inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : homology f g w ⟶ W
h :
  (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫ a =
    (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫ b
i j : homology f g w ⟶ W
hh :
  (homologyIsoCokernelLift f g w).hom ≫ (fun e => (homologyIsoCokernelLift f g w).inv ≫ e) i =
    (homologyIsoCokernelLift f g w).hom ≫ (fun e => (homologyIsoCokernelLift f g w).inv ≫ e) j
⊢ i = j
[PROOFSTEP]
simpa using hh
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : homology f g w ⟶ W
h :
  (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫ a =
    (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫ b
⊢ (fun e => (homologyIsoCokernelLift f g w).inv ≫ e) a = (fun e => (homologyIsoCokernelLift f g w).inv ≫ e) b
[PROOFSTEP]
simp only [Category.assoc] at h 
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : homology f g w ⟶ W
h :
  cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv ≫ a =
    cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv ≫ b
⊢ (fun e => (homologyIsoCokernelLift f g w).inv ≫ e) a = (fun e => (homologyIsoCokernelLift f g w).inv ≫ e) b
[PROOFSTEP]
exact coequalizer.hom_ext h
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : W ⟶ homology f g w
h : a ≫ ι f g w = b ≫ ι f g w
⊢ a = b
[PROOFSTEP]
dsimp [ι] at h 
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : W ⟶ homology f g w
h :
  a ≫ (homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w) =
    b ≫ (homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w)
⊢ a = b
[PROOFSTEP]
apply_fun fun e => e ≫ (homologyIsoKernelDesc f g w).hom
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : W ⟶ homology f g w
h :
  a ≫ (homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w) =
    b ≫ (homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w)
⊢ (fun e => e ≫ (homologyIsoKernelDesc f g w).hom) a = (fun e => e ≫ (homologyIsoKernelDesc f g w).hom) b
case inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : W ⟶ homology f g w
h :
  a ≫ (homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w) =
    b ≫ (homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w)
⊢ Function.Injective fun e => e ≫ (homologyIsoKernelDesc f g w).hom
[PROOFSTEP]
swap
[GOAL]
case inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : W ⟶ homology f g w
h :
  a ≫ (homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w) =
    b ≫ (homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w)
⊢ Function.Injective fun e => e ≫ (homologyIsoKernelDesc f g w).hom
[PROOFSTEP]
intro i j hh
[GOAL]
case inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : W ⟶ homology f g w
h :
  a ≫ (homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w) =
    b ≫ (homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w)
i j : W ⟶ homology f g w
hh : (fun e => e ≫ (homologyIsoKernelDesc f g w).hom) i = (fun e => e ≫ (homologyIsoKernelDesc f g w).hom) j
⊢ i = j
[PROOFSTEP]
apply_fun fun e => e ≫ (homologyIsoKernelDesc f g w).inv at hh 
[GOAL]
case inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : W ⟶ homology f g w
h :
  a ≫ (homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w) =
    b ≫ (homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w)
i j : W ⟶ homology f g w
hh :
  (fun e => e ≫ (homologyIsoKernelDesc f g w).hom) i ≫ (homologyIsoKernelDesc f g w).inv =
    (fun e => e ≫ (homologyIsoKernelDesc f g w).hom) j ≫ (homologyIsoKernelDesc f g w).inv
⊢ i = j
[PROOFSTEP]
simpa using hh
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : W ⟶ homology f g w
h :
  a ≫ (homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w) =
    b ≫ (homologyIsoKernelDesc f g w).hom ≫ kernel.ι (cokernel.desc f g w)
⊢ (fun e => e ≫ (homologyIsoKernelDesc f g w).hom) a = (fun e => e ≫ (homologyIsoKernelDesc f g w).hom) b
[PROOFSTEP]
simp only [← Category.assoc] at h 
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
W : A
a b : W ⟶ homology f g w
h :
  (a ≫ (homologyIsoKernelDesc f g w).hom) ≫ kernel.ι (cokernel.desc f g w) =
    (b ≫ (homologyIsoKernelDesc f g w).hom) ≫ kernel.ι (cokernel.desc f g w)
⊢ (fun e => e ≫ (homologyIsoKernelDesc f g w).hom) a = (fun e => e ≫ (homologyIsoKernelDesc f g w).hom) b
[PROOFSTEP]
exact equalizer.hom_ext h
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ π' f g w ≫ ι f g w = kernel.ι g ≫ cokernel.π f
[PROOFSTEP]
dsimp [π', ι, homologyIsoKernelDesc]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ (cokernel.π (kernel.lift g f w) ≫ (homologyIsoCokernelLift f g w).inv) ≫
      ((homologyIsoCokernelLift f g w).hom ≫ Abelian.homologyCToK f g w) ≫ kernel.ι (cokernel.desc f g w) =
    kernel.ι g ≫ cokernel.π f
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ (kernelSubobjectIso g).hom ≫ π' f g w = π f g w
[PROOFSTEP]
dsimp [π', homologyIsoCokernelLift]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ (kernelSubobjectIso g).hom ≫
      cokernel.π (kernel.lift g f w) ≫
        ((cokernelIsoOfEq (_ : factorThruImage f ≫ imageToKernel' f g w = kernel.lift g f w)).inv ≫
            cokernel.desc (factorThruImage f ≫ imageToKernel' f g w) (cokernel.π (imageToKernel' f g w))
              (_ : (factorThruImage f ≫ imageToKernel' f g w) ≫ cokernel.π (imageToKernel' f g w) = 0)) ≫
          (homologyIsoCokernelImageToKernel' f g w).inv =
    π f g w
[PROOFSTEP]
simp only [← Category.assoc]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ ((((kernelSubobjectIso g).hom ≫ cokernel.π (kernel.lift g f w)) ≫
          (cokernelIsoOfEq (_ : factorThruImage f ≫ imageToKernel' f g w = kernel.lift g f w)).inv) ≫
        cokernel.desc (factorThruImage f ≫ imageToKernel' f g w) (cokernel.π (imageToKernel' f g w))
          (_ : (factorThruImage f ≫ imageToKernel' f g w) ≫ cokernel.π (imageToKernel' f g w) = 0)) ≫
      (homologyIsoCokernelImageToKernel' f g w).inv =
    π f g w
[PROOFSTEP]
rw [Iso.comp_inv_eq]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ (((kernelSubobjectIso g).hom ≫ cokernel.π (kernel.lift g f w)) ≫
        (cokernelIsoOfEq (_ : factorThruImage f ≫ imageToKernel' f g w = kernel.lift g f w)).inv) ≫
      cokernel.desc (factorThruImage f ≫ imageToKernel' f g w) (cokernel.π (imageToKernel' f g w))
        (_ : (factorThruImage f ≫ imageToKernel' f g w) ≫ cokernel.π (imageToKernel' f g w) = 0) =
    π f g w ≫ (homologyIsoCokernelImageToKernel' f g w).hom
[PROOFSTEP]
dsimp [π, homologyIsoCokernelImageToKernel']
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
⊢ (((kernelSubobjectIso g).hom ≫ cokernel.π (kernel.lift g f w)) ≫
        (cokernelIsoOfEq (_ : factorThruImage f ≫ imageToKernel' f g w = kernel.lift g f w)).inv) ≫
      cokernel.desc (factorThruImage f ≫ imageToKernel' f g w) (cokernel.π (imageToKernel' f g w))
        (_ : (factorThruImage f ≫ imageToKernel' f g w) ≫ cokernel.π (imageToKernel' f g w) = 0) =
    cokernel.π (imageToKernel f g w) ≫
      cokernel.map (imageToKernel f g w) (imageToKernel' f g w) (imageSubobjectIso f).hom (kernelSubobjectIso g).hom
        (_ : imageToKernel f g w ≫ (kernelSubobjectIso g).hom = (imageSubobjectIso f).hom ≫ imageToKernel' f g w)
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ g ≫ β.right = α.right ≫ g'
[PROOFSTEP]
simp [h, β.w.symm]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ π' f g w ≫ map w w' α β h = kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫ π' f' g' w'
[PROOFSTEP]
apply_fun fun e => (kernelSubobjectIso _).hom ≫ e
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ (fun e => (kernelSubobjectIso g).hom ≫ e) (π' f g w ≫ map w w' α β h) =
    (fun e => (kernelSubobjectIso g).hom ≫ e)
      (kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫ π' f' g' w')
case inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ Function.Injective fun e => (kernelSubobjectIso g).hom ≫ e
[PROOFSTEP]
swap
[GOAL]
case inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ Function.Injective fun e => (kernelSubobjectIso g).hom ≫ e
[PROOFSTEP]
intro i j hh
[GOAL]
case inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
i j : kernel g ⟶ homology f' g' w'
hh : (fun e => (kernelSubobjectIso g).hom ≫ e) i = (fun e => (kernelSubobjectIso g).hom ≫ e) j
⊢ i = j
[PROOFSTEP]
apply_fun fun e => (kernelSubobjectIso _).inv ≫ e at hh 
[GOAL]
case inj
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
i j : kernel g ⟶ homology f' g' w'
hh :
  (kernelSubobjectIso g).inv ≫ (fun e => (kernelSubobjectIso g).hom ≫ e) i =
    (kernelSubobjectIso g).inv ≫ (fun e => (kernelSubobjectIso g).hom ≫ e) j
⊢ i = j
[PROOFSTEP]
simpa using hh
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ (fun e => (kernelSubobjectIso g).hom ≫ e) (π' f g w ≫ map w w' α β h) =
    (fun e => (kernelSubobjectIso g).hom ≫ e)
      (kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫ π' f' g' w')
[PROOFSTEP]
dsimp [map]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ (kernelSubobjectIso g).hom ≫
      π' f g w ≫
        cokernel.desc (imageToKernel f g w) (kernelSubobjectMap β ≫ cokernel.π (imageToKernel f' g' w'))
          (_ : imageToKernel f g w ≫ kernelSubobjectMap β ≫ cokernel.π (imageToKernel f' g' w') = 0) =
    (kernelSubobjectIso g).hom ≫ kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫ π' f' g' w'
[PROOFSTEP]
simp only [π'_eq_π_assoc]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ π f g w ≫
      cokernel.desc (imageToKernel f g w) (kernelSubobjectMap β ≫ cokernel.π (imageToKernel f' g' w'))
        (_ : imageToKernel f g w ≫ kernelSubobjectMap β ≫ cokernel.π (imageToKernel f' g' w') = 0) =
    (kernelSubobjectIso g).hom ≫ kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫ π' f' g' w'
[PROOFSTEP]
dsimp [π]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ cokernel.π (imageToKernel f g w) ≫
      cokernel.desc (imageToKernel f g w) (kernelSubobjectMap β ≫ cokernel.π (imageToKernel f' g' w'))
        (_ : imageToKernel f g w ≫ kernelSubobjectMap β ≫ cokernel.π (imageToKernel f' g' w') = 0) =
    (kernelSubobjectIso g).hom ≫ kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫ π' f' g' w'
[PROOFSTEP]
simp only [cokernel.π_desc]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ kernelSubobjectMap β ≫ cokernel.π (imageToKernel f' g' w') =
    (kernelSubobjectIso g).hom ≫ kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫ π' f' g' w'
[PROOFSTEP]
rw [← Iso.inv_comp_eq, ← Category.assoc]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ ((kernelSubobjectIso g).inv ≫ kernelSubobjectMap β) ≫ cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫ π' f' g' w'
[PROOFSTEP]
have :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map _ _ β.left β.right β.w.symm ≫ (kernelSubobjectIso _).inv :=
  by
  rw [Iso.inv_comp_eq, ← Category.assoc, Iso.eq_comp_inv]
  ext
  dsimp
  simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right
        (_ : (Arrow.mk g).hom ≫ (𝟭 A).map β.right = (𝟭 A).map β.left ≫ (Arrow.mk g').hom) ≫
      (kernelSubobjectIso (Arrow.mk g').hom).inv
[PROOFSTEP]
rw [Iso.inv_comp_eq, ← Category.assoc, Iso.eq_comp_inv]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ kernelSubobjectMap β ≫ (kernelSubobjectIso (Arrow.mk g').hom).hom =
    (kernelSubobjectIso g).hom ≫
      kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right
        (_ : (Arrow.mk g).hom ≫ (𝟭 A).map β.right = (𝟭 A).map β.left ≫ (Arrow.mk g').hom)
[PROOFSTEP]
ext
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ (kernelSubobjectMap β ≫ (kernelSubobjectIso (Arrow.mk g').hom).hom) ≫ equalizer.ι (Arrow.mk g').hom 0 =
    ((kernelSubobjectIso g).hom ≫
        kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right
          (_ : (Arrow.mk g).hom ≫ (𝟭 A).map β.right = (𝟭 A).map β.left ≫ (Arrow.mk g').hom)) ≫
      equalizer.ι (Arrow.mk g').hom 0
[PROOFSTEP]
dsimp
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ (kernelSubobjectMap β ≫ (kernelSubobjectIso g').hom) ≫ kernel.ι g' =
    ((kernelSubobjectIso g).hom ≫ kernel.map g g' β.left β.right (_ : g ≫ β.right = β.left ≫ g')) ≫ kernel.ι g'
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right
        (_ : (Arrow.mk g).hom ≫ (𝟭 A).map β.right = (𝟭 A).map β.left ≫ (Arrow.mk g').hom) ≫
      (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ ((kernelSubobjectIso g).inv ≫ kernelSubobjectMap β) ≫ cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫ π' f' g' w'
[PROOFSTEP]
rw [this]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right
        (_ : (Arrow.mk g).hom ≫ (𝟭 A).map β.right = (𝟭 A).map β.left ≫ (Arrow.mk g').hom) ≫
      (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ (kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right
          (_ : (Arrow.mk g).hom ≫ (𝟭 A).map β.right = (𝟭 A).map β.left ≫ (Arrow.mk g').hom) ≫
        (kernelSubobjectIso (Arrow.mk g').hom).inv) ≫
      cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫ π' f' g' w'
[PROOFSTEP]
simp only [Category.assoc]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right
        (_ : (Arrow.mk g).hom ≫ (𝟭 A).map β.right = (𝟭 A).map β.left ≫ (Arrow.mk g').hom) ≫
      (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right
        (_ : (Arrow.mk g).hom ≫ (𝟭 A).map β.right = (𝟭 A).map β.left ≫ (Arrow.mk g').hom) ≫
      (kernelSubobjectIso (Arrow.mk g').hom).inv ≫ cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫ π' f' g' w'
[PROOFSTEP]
dsimp [π', homologyIsoCokernelLift]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right
        (_ : (Arrow.mk g).hom ≫ (𝟭 A).map β.right = (𝟭 A).map β.left ≫ (Arrow.mk g').hom) ≫
      (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ kernel.map g g' β.left β.right (_ : g ≫ β.right = β.left ≫ g') ≫
      (kernelSubobjectIso g').inv ≫ cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫
      cokernel.π (kernel.lift g' f' w') ≫
        ((cokernelIsoOfEq (_ : factorThruImage f' ≫ imageToKernel' f' g' w' = kernel.lift g' f' w')).inv ≫
            cokernel.desc (factorThruImage f' ≫ imageToKernel' f' g' w') (cokernel.π (imageToKernel' f' g' w'))
              (_ : (factorThruImage f' ≫ imageToKernel' f' g' w') ≫ cokernel.π (imageToKernel' f' g' w') = 0)) ≫
          (homologyIsoCokernelImageToKernel' f' g' w').inv
[PROOFSTEP]
simp only [cokernelIsoOfEq_inv_comp_desc, cokernel.π_desc_assoc]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right
        (_ : (Arrow.mk g).hom ≫ (𝟭 A).map β.right = (𝟭 A).map β.left ≫ (Arrow.mk g').hom) ≫
      (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ kernel.map g g' β.left β.right (_ : g ≫ β.right = β.left ≫ g') ≫
      (kernelSubobjectIso g').inv ≫ cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫
      cokernel.π (imageToKernel' f' g' w') ≫ (homologyIsoCokernelImageToKernel' f' g' w').inv
[PROOFSTEP]
congr 1
[GOAL]
case e_a
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right
        (_ : (Arrow.mk g).hom ≫ (𝟭 A).map β.right = (𝟭 A).map β.left ≫ (Arrow.mk g').hom) ≫
      (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ kernel.map g g' β.left β.right (_ : g ≫ β.right = β.left ≫ g') =
    kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g')
[PROOFSTEP]
congr
[GOAL]
case e_a.e_p
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right
        (_ : (Arrow.mk g).hom ≫ (𝟭 A).map β.right = (𝟭 A).map β.left ≫ (Arrow.mk g').hom) ≫
      (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ β.left = α.right
[PROOFSTEP]
exact h.symm
[GOAL]
case e_a
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right
        (_ : (Arrow.mk g).hom ≫ (𝟭 A).map β.right = (𝟭 A).map β.left ≫ (Arrow.mk g').hom) ≫
      (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ (kernelSubobjectIso g').inv ≫ cokernel.π (imageToKernel f' g' w') =
    cokernel.π (imageToKernel' f' g' w') ≫ (homologyIsoCokernelImageToKernel' f' g' w').inv
[PROOFSTEP]
rw [Iso.inv_comp_eq, ← Category.assoc, Iso.eq_comp_inv]
[GOAL]
case e_a
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right
        (_ : (Arrow.mk g).hom ≫ (𝟭 A).map β.right = (𝟭 A).map β.left ≫ (Arrow.mk g').hom) ≫
      (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ cokernel.π (imageToKernel f' g' w') ≫ (homologyIsoCokernelImageToKernel' f' g' w').hom =
    (kernelSubobjectIso g').hom ≫ cokernel.π (imageToKernel' f' g' w')
[PROOFSTEP]
dsimp [homologyIsoCokernelImageToKernel']
[GOAL]
case e_a
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right
        (_ : (Arrow.mk g).hom ≫ (𝟭 A).map β.right = (𝟭 A).map β.left ≫ (Arrow.mk g').hom) ≫
      (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ cokernel.π (imageToKernel f' g' w') ≫
      cokernel.map (imageToKernel f' g' w') (imageToKernel' f' g' w') (imageSubobjectIso f').hom
        (kernelSubobjectIso g').hom
        (_ :
          imageToKernel f' g' w' ≫ (kernelSubobjectIso g').hom = (imageSubobjectIso f').hom ≫ imageToKernel' f' g' w') =
    (kernelSubobjectIso g').hom ≫ cokernel.π (imageToKernel' f' g' w')
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ kernel.lift g f w ≫
      lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
    0
[PROOFSTEP]
ext
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ (kernel.lift g f w ≫
        lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
          (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0)) ≫
      ι f' g' w' =
    0 ≫ ι f' g' w'
[PROOFSTEP]
simp only [← h, Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ f ≫ α.right ≫ cokernel.π f' = 0
[PROOFSTEP]
erw [← reassoc_of% α.w]
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ α.left ≫ (Arrow.mk f').hom ≫ cokernel.π f' = 0
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ map w w' α β h =
    desc' f g w
      (lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
      (_ :
        kernel.lift g f w ≫
            lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
              (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
          0)
[PROOFSTEP]
apply homology.hom_from_ext
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ π' f g w ≫ map w w' α β h =
    π' f g w ≫
      desc' f g w
        (lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
          (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
        (_ :
          kernel.lift g f w ≫
              lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
                (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
            0)
[PROOFSTEP]
simp only [π'_map, π'_desc']
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫ π' f' g' w' =
    lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
      (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0)
[PROOFSTEP]
dsimp [π', lift]
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫
      cokernel.π (kernel.lift g' f' w') ≫ (homologyIsoCokernelLift f' g' w').inv =
    kernel.lift (cokernel.desc f' g' w') (kernel.ι g ≫ β.left ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) ≫
      (homologyIsoKernelDesc f' g' w').inv
[PROOFSTEP]
rw [Iso.eq_comp_inv]
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ (kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫
        cokernel.π (kernel.lift g' f' w') ≫ (homologyIsoCokernelLift f' g' w').inv) ≫
      (homologyIsoKernelDesc f' g' w').hom =
    kernel.lift (cokernel.desc f' g' w') (kernel.ι g ≫ β.left ≫ cokernel.π f')
      (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0)
[PROOFSTEP]
dsimp [homologyIsoKernelDesc]
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ (kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫
        cokernel.π (kernel.lift g' f' w') ≫ (homologyIsoCokernelLift f' g' w').inv) ≫
      (homologyIsoCokernelLift f' g' w').hom ≫ Abelian.homologyCToK f' g' w' =
    kernel.lift (cokernel.desc f' g' w') (kernel.ι g ≫ β.left ≫ cokernel.π f')
      (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0)
[PROOFSTEP]
ext
[GOAL]
case h.h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ ((kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫
          cokernel.π (kernel.lift g' f' w') ≫ (homologyIsoCokernelLift f' g' w').inv) ≫
        (homologyIsoCokernelLift f' g' w').hom ≫ Abelian.homologyCToK f' g' w') ≫
      equalizer.ι (cokernel.desc f' g' w') 0 =
    kernel.lift (cokernel.desc f' g' w') (kernel.ι g ≫ β.left ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) ≫
      equalizer.ι (cokernel.desc f' g' w') 0
[PROOFSTEP]
simp [h]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0
[PROOFSTEP]
simp only [kernel.lift_ι_assoc, ← h]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ f ≫ α.right ≫ cokernel.π f' = 0
[PROOFSTEP]
erw [← reassoc_of% α.w]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ α.left ≫ (Arrow.mk f').hom ≫ cokernel.π f' = 0
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f') (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0) ≫
      cokernel.desc f' g' w' =
    0
[PROOFSTEP]
apply homology.hom_from_ext
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ π' f g w ≫
      desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
          (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0) ≫
        cokernel.desc f' g' w' =
    π' f g w ≫ 0
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ map w w' α β h =
    lift f' g' w'
      (desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
        (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0))
      (_ :
        desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
              (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0) ≫
            cokernel.desc f' g' w' =
          0)
[PROOFSTEP]
rw [map_eq_desc'_lift_left]
  -- Porting note: once was known as ext
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ desc' f g w
      (lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
      (_ :
        kernel.lift g f w ≫
            lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
              (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
          0) =
    lift f' g' w'
      (desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
        (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0))
      (_ :
        desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
              (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0) ≫
            cokernel.desc f' g' w' =
          0)
[PROOFSTEP]
apply homology.hom_to_ext
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ desc' f g w
        (lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
          (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
        (_ :
          kernel.lift g f w ≫
              lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
                (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
            0) ≫
      ι f' g' w' =
    lift f' g' w'
        (desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
          (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0))
        (_ :
          desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
                (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0) ≫
              cokernel.desc f' g' w' =
            0) ≫
      ι f' g' w'
[PROOFSTEP]
apply homology.hom_from_ext
[GOAL]
case h.h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ π' f g w ≫
      desc' f g w
          (lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
            (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
          (_ :
            kernel.lift g f w ≫
                lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
                  (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
              0) ≫
        ι f' g' w' =
    π' f g w ≫
      lift f' g' w'
          (desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
            (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0))
          (_ :
            desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
                  (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0) ≫
                cokernel.desc f' g' w' =
              0) ≫
        ι f' g' w'
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0
[PROOFSTEP]
simp [h]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ kernel.lift g f w ≫
      lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
    0
[PROOFSTEP]
ext
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ (kernel.lift g f w ≫
        lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
          (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0)) ≫
      ι f' g' w' =
    0 ≫ ι f' g' w'
[PROOFSTEP]
simp only [Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ f ≫ α.right ≫ cokernel.π f' = 0
[PROOFSTEP]
erw [← reassoc_of% α.w]
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ α.left ≫ (Arrow.mk f').hom ≫ cokernel.π f' = 0
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ map w w' α β h =
    desc' f g w
      (lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
      (_ :
        kernel.lift g f w ≫
            lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
              (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
          0)
[PROOFSTEP]
rw [map_eq_desc'_lift_left]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ desc' f g w
      (lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
      (_ :
        kernel.lift g f w ≫
            lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
              (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
          0) =
    desc' f g w
      (lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
      (_ :
        kernel.lift g f w ≫
            lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
              (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
          0)
[PROOFSTEP]
ext
[GOAL]
case h.h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ (π' f g w ≫
        desc' f g w
          (lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
            (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
          (_ :
            kernel.lift g f w ≫
                lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
                  (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
              0)) ≫
      ι f' g' w' =
    (π' f g w ≫
        desc' f g w
          (lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
            (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
          (_ :
            kernel.lift g f w ≫
                lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
                  (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
              0)) ≫
      ι f' g' w'
[PROOFSTEP]
simp [h]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ kernel.lift g f w ≫ kernel.ι g ≫ α.right ≫ cokernel.π f' = 0
[PROOFSTEP]
simp only [kernel.lift_ι_assoc]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ f ≫ α.right ≫ cokernel.π f' = 0
[PROOFSTEP]
erw [← reassoc_of% α.w]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ α.left ≫ (Arrow.mk f').hom ≫ cokernel.π f' = 0
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ desc' f g w (kernel.ι g ≫ α.right ≫ cokernel.π f')
        (_ : kernel.lift g f w ≫ kernel.ι g ≫ α.right ≫ cokernel.π f' = 0) ≫
      cokernel.desc f' g' w' =
    0
[PROOFSTEP]
apply homology.hom_from_ext
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ π' f g w ≫
      desc' f g w (kernel.ι g ≫ α.right ≫ cokernel.π f')
          (_ : kernel.lift g f w ≫ kernel.ι g ≫ α.right ≫ cokernel.π f' = 0) ≫
        cokernel.desc f' g' w' =
    π' f g w ≫ 0
[PROOFSTEP]
simp [h]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ map w w' α β h =
    lift f' g' w'
      (desc' f g w (kernel.ι g ≫ α.right ≫ cokernel.π f')
        (_ : kernel.lift g f w ≫ kernel.ι g ≫ α.right ≫ cokernel.π f' = 0))
      (_ :
        desc' f g w (kernel.ι g ≫ α.right ≫ cokernel.π f')
              (_ : kernel.lift g f w ≫ kernel.ι g ≫ α.right ≫ cokernel.π f' = 0) ≫
            cokernel.desc f' g' w' =
          0)
[PROOFSTEP]
rw [map_eq_desc'_lift_right]
  -- Porting note: once was known as ext
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ desc' f g w
      (lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
      (_ :
        kernel.lift g f w ≫
            lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
              (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
          0) =
    lift f' g' w'
      (desc' f g w (kernel.ι g ≫ α.right ≫ cokernel.π f')
        (_ : kernel.lift g f w ≫ kernel.ι g ≫ α.right ≫ cokernel.π f' = 0))
      (_ :
        desc' f g w (kernel.ι g ≫ α.right ≫ cokernel.π f')
              (_ : kernel.lift g f w ≫ kernel.ι g ≫ α.right ≫ cokernel.π f' = 0) ≫
            cokernel.desc f' g' w' =
          0)
[PROOFSTEP]
apply homology.hom_to_ext
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ desc' f g w
        (lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
          (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
        (_ :
          kernel.lift g f w ≫
              lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
                (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
            0) ≫
      ι f' g' w' =
    lift f' g' w'
        (desc' f g w (kernel.ι g ≫ α.right ≫ cokernel.π f')
          (_ : kernel.lift g f w ≫ kernel.ι g ≫ α.right ≫ cokernel.π f' = 0))
        (_ :
          desc' f g w (kernel.ι g ≫ α.right ≫ cokernel.π f')
                (_ : kernel.lift g f w ≫ kernel.ι g ≫ α.right ≫ cokernel.π f' = 0) ≫
              cokernel.desc f' g' w' =
            0) ≫
      ι f' g' w'
[PROOFSTEP]
apply homology.hom_from_ext
[GOAL]
case h.h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ π' f g w ≫
      desc' f g w
          (lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
            (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
          (_ :
            kernel.lift g f w ≫
                lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
                  (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
              0) ≫
        ι f' g' w' =
    π' f g w ≫
      lift f' g' w'
          (desc' f g w (kernel.ι g ≫ α.right ≫ cokernel.π f')
            (_ : kernel.lift g f w ≫ kernel.ι g ≫ α.right ≫ cokernel.π f' = 0))
          (_ :
            desc' f g w (kernel.ι g ≫ α.right ≫ cokernel.π f')
                  (_ : kernel.lift g f w ≫ kernel.ι g ≫ α.right ≫ cokernel.π f' = 0) ≫
                cokernel.desc f' g' w' =
              0) ≫
        ι f' g' w'
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ f ≫ β.left = α.left ≫ f'
[PROOFSTEP]
simp [h, β.w.symm]
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ map w w' α β h ≫ ι f' g' w' = ι f g w ≫ cokernel.map f f' α.left β.left (_ : f ≫ β.left = α.left ≫ f')
[PROOFSTEP]
rw [map_eq_lift_desc'_left, lift_ι]
  -- Porting note: once was known as ext
[GOAL]
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f') (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0) =
    ι f g w ≫ cokernel.map f f' α.left β.left (_ : f ≫ β.left = α.left ≫ f')
[PROOFSTEP]
apply homology.hom_from_ext
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ π' f g w ≫
      desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
        (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0) =
    π' f g w ≫ ι f g w ≫ cokernel.map f f' α.left β.left (_ : f ≫ β.left = α.left ≫ f')
[PROOFSTEP]
simp only [← Category.assoc]
[GOAL]
case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ π' f g w ≫
      desc' f g w ((kernel.ι g ≫ β.left) ≫ cokernel.π f')
        (_ : kernel.lift g f w ≫ (kernel.ι g ≫ β.left) ≫ cokernel.π f' = 0) =
    (π' f g w ≫ ι f g w) ≫ cokernel.map f f' α.left β.left (_ : f ≫ β.left = α.left ≫ f')
[PROOFSTEP]
rw [π'_ι, π'_desc', Category.assoc, Category.assoc, cokernel.π_desc]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.196788, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
C : HomologicalComplex A c
j : ι
⊢ F.map
        (imageToKernel (HomologicalComplex.dTo C j) (HomologicalComplex.dFrom C j)
          (_ : HomologicalComplex.dTo C j ≫ HomologicalComplex.dFrom C j = 0)) ≫
      (F.mapIso (kernelSubobjectIso (HomologicalComplex.dFrom C j)) ≪≫
          PreservesKernel.iso F (HomologicalComplex.dFrom C j) ≪≫
            (kernelSubobjectIso (F.map (HomologicalComplex.dFrom C j))).symm).hom =
    (F.mapIso (imageSubobjectIso (HomologicalComplex.dTo C j)) ≪≫
          (PreservesImage.iso F (HomologicalComplex.dTo C j)).symm ≪≫
            (imageSubobjectIso (F.map (HomologicalComplex.dTo C j))).symm).hom ≫
      imageToKernel (HomologicalComplex.dTo ((mapHomologicalComplex F c).obj C) j)
        (HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj C) j)
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F c).obj C) j ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj C) j =
            0)
[PROOFSTEP]
dsimp
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.196788, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
C : HomologicalComplex A c
j : ι
⊢ F.map
        (imageToKernel (HomologicalComplex.dTo C j) (HomologicalComplex.dFrom C j)
          (_ : HomologicalComplex.dTo C j ≫ HomologicalComplex.dFrom C j = 0)) ≫
      F.map (kernelSubobjectIso (HomologicalComplex.dFrom C j)).hom ≫
        (PreservesKernel.iso F (HomologicalComplex.dFrom C j)).hom ≫
          (kernelSubobjectIso (F.map (HomologicalComplex.dFrom C j))).inv =
    (F.map (imageSubobjectIso (HomologicalComplex.dTo C j)).hom ≫
        IsImage.lift
            (StrongEpiMonoFactorisation.toMonoIsImage
              (StrongEpiMonoFactorisation.mk
                (MonoFactorisation.mk (F.obj (image (HomologicalComplex.dTo C j)))
                  (F.map (image.ι (HomologicalComplex.dTo C j)))
                  (F.map (factorThruImage (HomologicalComplex.dTo C j))))))
            (Image.monoFactorisation (F.map (HomologicalComplex.dTo C j))) ≫
          (imageSubobjectIso (F.map (HomologicalComplex.dTo C j))).inv) ≫
      imageToKernel (F.map (HomologicalComplex.d C (ComplexShape.prev c j) j))
        (F.map (HomologicalComplex.d C j (ComplexShape.next c j)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F c).obj C) j ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj C) j =
            0)
[PROOFSTEP]
ext
[GOAL]
case h
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.196788, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
C : HomologicalComplex A c
j : ι
⊢ (F.map
          (imageToKernel (HomologicalComplex.dTo C j) (HomologicalComplex.dFrom C j)
            (_ : HomologicalComplex.dTo C j ≫ HomologicalComplex.dFrom C j = 0)) ≫
        F.map (kernelSubobjectIso (HomologicalComplex.dFrom C j)).hom ≫
          (PreservesKernel.iso F (HomologicalComplex.dFrom C j)).hom ≫
            (kernelSubobjectIso (F.map (HomologicalComplex.dFrom C j))).inv) ≫
      Subobject.arrow (kernelSubobject (F.map (HomologicalComplex.d C j (ComplexShape.next c j)))) =
    ((F.map (imageSubobjectIso (HomologicalComplex.dTo C j)).hom ≫
          IsImage.lift
              (StrongEpiMonoFactorisation.toMonoIsImage
                (StrongEpiMonoFactorisation.mk
                  (MonoFactorisation.mk (F.obj (image (HomologicalComplex.dTo C j)))
                    (F.map (image.ι (HomologicalComplex.dTo C j)))
                    (F.map (factorThruImage (HomologicalComplex.dTo C j))))))
              (Image.monoFactorisation (F.map (HomologicalComplex.dTo C j))) ≫
            (imageSubobjectIso (F.map (HomologicalComplex.dTo C j))).inv) ≫
        imageToKernel (F.map (HomologicalComplex.d C (ComplexShape.prev c j) j))
          (F.map (HomologicalComplex.d C j (ComplexShape.next c j)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F c).obj C) j ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj C) j =
              0)) ≫
      Subobject.arrow (kernelSubobject (F.map (HomologicalComplex.d C j (ComplexShape.next c j))))
[PROOFSTEP]
simp only [Category.assoc, imageToKernel_arrow]
[GOAL]
case h
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.196788, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
C : HomologicalComplex A c
j : ι
⊢ F.map
        (imageToKernel (HomologicalComplex.dTo C j) (HomologicalComplex.dFrom C j)
          (_ : HomologicalComplex.dTo C j ≫ HomologicalComplex.dFrom C j = 0)) ≫
      F.map (kernelSubobjectIso (HomologicalComplex.dFrom C j)).hom ≫
        (PreservesKernel.iso F (HomologicalComplex.dFrom C j)).hom ≫
          (kernelSubobjectIso (F.map (HomologicalComplex.dFrom C j))).inv ≫
            Subobject.arrow (kernelSubobject (F.map (HomologicalComplex.d C j (ComplexShape.next c j)))) =
    F.map (imageSubobjectIso (HomologicalComplex.dTo C j)).hom ≫
      IsImage.lift
          (StrongEpiMonoFactorisation.toMonoIsImage
            (StrongEpiMonoFactorisation.mk
              (MonoFactorisation.mk (F.obj (image (HomologicalComplex.dTo C j)))
                (F.map (image.ι (HomologicalComplex.dTo C j))) (F.map (factorThruImage (HomologicalComplex.dTo C j))))))
          (Image.monoFactorisation (F.map (HomologicalComplex.dTo C j))) ≫
        (imageSubobjectIso (F.map (HomologicalComplex.dTo C j))).inv ≫
          Subobject.arrow (imageSubobject (F.map (HomologicalComplex.d C (ComplexShape.prev c j) j)))
[PROOFSTEP]
erw [kernelSubobject_arrow', imageSubobject_arrow']
[GOAL]
case h
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.196788, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
C : HomologicalComplex A c
j : ι
⊢ F.map
        (imageToKernel (HomologicalComplex.dTo C j) (HomologicalComplex.dFrom C j)
          (_ : HomologicalComplex.dTo C j ≫ HomologicalComplex.dFrom C j = 0)) ≫
      F.map (kernelSubobjectIso (HomologicalComplex.dFrom C j)).hom ≫
        (PreservesKernel.iso F (HomologicalComplex.dFrom C j)).hom ≫ kernel.ι (F.map (HomologicalComplex.dFrom C j)) =
    F.map (imageSubobjectIso (HomologicalComplex.dTo C j)).hom ≫
      IsImage.lift
          (StrongEpiMonoFactorisation.toMonoIsImage
            (StrongEpiMonoFactorisation.mk
              (MonoFactorisation.mk (F.obj (image (HomologicalComplex.dTo C j)))
                (F.map (image.ι (HomologicalComplex.dTo C j))) (F.map (factorThruImage (HomologicalComplex.dTo C j))))))
          (Image.monoFactorisation (F.map (HomologicalComplex.dTo C j))) ≫
        image.ι (F.map (HomologicalComplex.dTo C j))
[PROOFSTEP]
simp [← F.map_comp]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
⊢ ∀ {X Y : HomologicalComplex A c} (f : X ⟶ Y),
    (homologyFunctor A c i ⋙ F).map f ≫ ((fun X => homologyIso F X i) Y).hom =
      ((fun X => homologyIso F X i) X).hom ≫ (mapHomologicalComplex F c ⋙ homologyFunctor B c i).map f
[PROOFSTEP]
intro X Y f
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ (homologyFunctor A c i ⋙ F).map f ≫ ((fun X => homologyIso F X i) Y).hom =
    ((fun X => homologyIso F X i) X).hom ≫ (mapHomologicalComplex F c ⋙ homologyFunctor B c i).map f
[PROOFSTEP]
dsimp
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ F.map
        (homology.map (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0)
          (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0) (HomologicalComplex.Hom.sqTo f i)
          (HomologicalComplex.Hom.sqFrom f i)
          (_ : (HomologicalComplex.Hom.sqTo f i).right = (HomologicalComplex.Hom.sqTo f i).right)) ≫
      (homologyIso F Y i).hom =
    (homologyIso F X i).hom ≫
      homology.map
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
            0)
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
            0)
        (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F c).map f) i)
        (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F c).map f) i)
        (_ :
          (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F c).map f) i).right =
            (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F c).map f) i).right)
[PROOFSTEP]
rw [← Iso.inv_comp_eq, ← Category.assoc, ← Iso.eq_comp_inv]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ (homologyIso F X i).inv ≫
      F.map
        (homology.map (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0)
          (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0) (HomologicalComplex.Hom.sqTo f i)
          (HomologicalComplex.Hom.sqFrom f i)
          (_ : (HomologicalComplex.Hom.sqTo f i).right = (HomologicalComplex.Hom.sqTo f i).right)) =
    homology.map
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
            0)
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
            0)
        (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F c).map f) i)
        (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F c).map f) i)
        (_ :
          (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F c).map f) i).right =
            (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F c).map f) i).right) ≫
      (homologyIso F Y i).inv
[PROOFSTEP]
refine' coequalizer.hom_ext _
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ coequalizer.π
        (imageToKernel (HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i)
          (HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i)
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
              0))
        0 ≫
      (homologyIso F X i).inv ≫
        F.map
          (homology.map (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0)
            (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0) (HomologicalComplex.Hom.sqTo f i)
            (HomologicalComplex.Hom.sqFrom f i)
            (_ : (HomologicalComplex.Hom.sqTo f i).right = (HomologicalComplex.Hom.sqTo f i).right)) =
    coequalizer.π
        (imageToKernel (HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i)
          (HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i)
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
              0))
        0 ≫
      homology.map
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
              0)
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
              0)
          (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F c).map f) i)
          (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F c).map f) i)
          (_ :
            (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F c).map f) i).right =
              (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F c).map f) i).right) ≫
        (homologyIso F Y i).inv
[PROOFSTEP]
dsimp [homologyIso]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ cokernel.π
        (imageToKernel (F.map (HomologicalComplex.d X (ComplexShape.prev c i) i))
          (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
              0)) ≫
      (cokernel.map
            (imageToKernel (F.map (HomologicalComplex.d X (ComplexShape.prev c i) i))
              (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
                  0))
            (F.map
              (imageToKernel (HomologicalComplex.dTo X i) (HomologicalComplex.dFrom X i)
                (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0)))
            (((imageSubobjectIso (F.map (HomologicalComplex.dTo X i))).hom ≫
                image.lift
                  (MonoFactorisation.mk (F.obj (image (HomologicalComplex.dTo X i)))
                    (F.map (image.ι (HomologicalComplex.dTo X i)))
                    (F.map (factorThruImage (HomologicalComplex.dTo X i))))) ≫
              F.map (imageSubobjectIso (HomologicalComplex.dTo X i)).inv)
            (((kernelSubobjectIso (F.map (HomologicalComplex.dFrom X i))).hom ≫
                (PreservesKernel.iso F (HomologicalComplex.dFrom X i)).inv) ≫
              F.map (kernelSubobjectIso (HomologicalComplex.dFrom X i)).inv)
            (_ :
              imageToKernel (F.map (HomologicalComplex.d X (ComplexShape.prev c i) i))
                    (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
                    (_ :
                      HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                          HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
                        0) ≫
                  (F.mapIso (kernelSubobjectIso (HomologicalComplex.dFrom X i)) ≪≫
                      PreservesKernel.iso F (HomologicalComplex.dFrom X i) ≪≫
                        (kernelSubobjectIso (F.map (HomologicalComplex.dFrom X i))).symm).inv =
                (F.mapIso (imageSubobjectIso (HomologicalComplex.dTo X i)) ≪≫
                      (PreservesImage.iso F (HomologicalComplex.dTo X i)).symm ≪≫
                        (imageSubobjectIso (F.map (HomologicalComplex.dTo X i))).symm).inv ≫
                  F.map
                    (imageToKernel (HomologicalComplex.dTo X i) (HomologicalComplex.dFrom X i)
                      (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0))) ≫
          (PreservesCokernel.iso F
              (imageToKernel (HomologicalComplex.dTo X i) (HomologicalComplex.dFrom X i)
                (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0))).inv) ≫
        F.map
          (homology.map (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0)
            (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0) (HomologicalComplex.Hom.sqTo f i)
            (HomologicalComplex.Hom.sqFrom f i)
            (_ : (HomologicalComplex.Hom.sqTo f i).right = (HomologicalComplex.Hom.sqTo f i).right)) =
    cokernel.π
        (imageToKernel (F.map (HomologicalComplex.d X (ComplexShape.prev c i) i))
          (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
              0)) ≫
      homology.map
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
              0)
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
              0)
          (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F c).map f) i)
          (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F c).map f) i)
          (_ :
            (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F c).map f) i).right =
              (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F c).map f) i).right) ≫
        cokernel.map
            (imageToKernel (F.map (HomologicalComplex.d Y (ComplexShape.prev c i) i))
              (F.map (HomologicalComplex.d Y i (ComplexShape.next c i)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
                  0))
            (F.map
              (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
            (((imageSubobjectIso (F.map (HomologicalComplex.dTo Y i))).hom ≫
                image.lift
                  (MonoFactorisation.mk (F.obj (image (HomologicalComplex.dTo Y i)))
                    (F.map (image.ι (HomologicalComplex.dTo Y i)))
                    (F.map (factorThruImage (HomologicalComplex.dTo Y i))))) ≫
              F.map (imageSubobjectIso (HomologicalComplex.dTo Y i)).inv)
            (((kernelSubobjectIso (F.map (HomologicalComplex.dFrom Y i))).hom ≫
                (PreservesKernel.iso F (HomologicalComplex.dFrom Y i)).inv) ≫
              F.map (kernelSubobjectIso (HomologicalComplex.dFrom Y i)).inv)
            (_ :
              imageToKernel (F.map (HomologicalComplex.d Y (ComplexShape.prev c i) i))
                    (F.map (HomologicalComplex.d Y i (ComplexShape.next c i)))
                    (_ :
                      HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
                          HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
                        0) ≫
                  (F.mapIso (kernelSubobjectIso (HomologicalComplex.dFrom Y i)) ≪≫
                      PreservesKernel.iso F (HomologicalComplex.dFrom Y i) ≪≫
                        (kernelSubobjectIso (F.map (HomologicalComplex.dFrom Y i))).symm).inv =
                (F.mapIso (imageSubobjectIso (HomologicalComplex.dTo Y i)) ≪≫
                      (PreservesImage.iso F (HomologicalComplex.dTo Y i)).symm ≪≫
                        (imageSubobjectIso (F.map (HomologicalComplex.dTo Y i))).symm).inv ≫
                  F.map
                    (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                      (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))) ≫
          (PreservesCokernel.iso F
              (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))).inv
[PROOFSTEP]
simp only [PreservesCokernel.iso_inv]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ cokernel.π
        (imageToKernel (F.map (HomologicalComplex.d X (ComplexShape.prev c i) i))
          (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
              0)) ≫
      (cokernel.map
            (imageToKernel (F.map (HomologicalComplex.d X (ComplexShape.prev c i) i))
              (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
                  0))
            (F.map
              (imageToKernel (HomologicalComplex.dTo X i) (HomologicalComplex.dFrom X i)
                (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0)))
            (((imageSubobjectIso (F.map (HomologicalComplex.dTo X i))).hom ≫
                image.lift
                  (MonoFactorisation.mk (F.obj (image (HomologicalComplex.dTo X i)))
                    (F.map (image.ι (HomologicalComplex.dTo X i)))
                    (F.map (factorThruImage (HomologicalComplex.dTo X i))))) ≫
              F.map (imageSubobjectIso (HomologicalComplex.dTo X i)).inv)
            (((kernelSubobjectIso (F.map (HomologicalComplex.dFrom X i))).hom ≫
                (PreservesKernel.iso F (HomologicalComplex.dFrom X i)).inv) ≫
              F.map (kernelSubobjectIso (HomologicalComplex.dFrom X i)).inv)
            (_ :
              imageToKernel (F.map (HomologicalComplex.d X (ComplexShape.prev c i) i))
                    (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
                    (_ :
                      HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                          HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
                        0) ≫
                  (F.mapIso (kernelSubobjectIso (HomologicalComplex.dFrom X i)) ≪≫
                      PreservesKernel.iso F (HomologicalComplex.dFrom X i) ≪≫
                        (kernelSubobjectIso (F.map (HomologicalComplex.dFrom X i))).symm).inv =
                (F.mapIso (imageSubobjectIso (HomologicalComplex.dTo X i)) ≪≫
                      (PreservesImage.iso F (HomologicalComplex.dTo X i)).symm ≪≫
                        (imageSubobjectIso (F.map (HomologicalComplex.dTo X i))).symm).inv ≫
                  F.map
                    (imageToKernel (HomologicalComplex.dTo X i) (HomologicalComplex.dFrom X i)
                      (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0))) ≫
          cokernelComparison
            (imageToKernel (HomologicalComplex.dTo X i) (HomologicalComplex.dFrom X i)
              (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0))
            F) ≫
        F.map
          (homology.map (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0)
            (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0) (HomologicalComplex.Hom.sqTo f i)
            (HomologicalComplex.Hom.sqFrom f i)
            (_ : (HomologicalComplex.Hom.sqTo f i).right = (HomologicalComplex.Hom.sqTo f i).right)) =
    cokernel.π
        (imageToKernel (F.map (HomologicalComplex.d X (ComplexShape.prev c i) i))
          (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
              0)) ≫
      homology.map
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
              0)
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
              0)
          (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F c).map f) i)
          (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F c).map f) i)
          (_ :
            (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F c).map f) i).right =
              (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F c).map f) i).right) ≫
        cokernel.map
            (imageToKernel (F.map (HomologicalComplex.d Y (ComplexShape.prev c i) i))
              (F.map (HomologicalComplex.d Y i (ComplexShape.next c i)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
                  0))
            (F.map
              (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
            (((imageSubobjectIso (F.map (HomologicalComplex.dTo Y i))).hom ≫
                image.lift
                  (MonoFactorisation.mk (F.obj (image (HomologicalComplex.dTo Y i)))
                    (F.map (image.ι (HomologicalComplex.dTo Y i)))
                    (F.map (factorThruImage (HomologicalComplex.dTo Y i))))) ≫
              F.map (imageSubobjectIso (HomologicalComplex.dTo Y i)).inv)
            (((kernelSubobjectIso (F.map (HomologicalComplex.dFrom Y i))).hom ≫
                (PreservesKernel.iso F (HomologicalComplex.dFrom Y i)).inv) ≫
              F.map (kernelSubobjectIso (HomologicalComplex.dFrom Y i)).inv)
            (_ :
              imageToKernel (F.map (HomologicalComplex.d Y (ComplexShape.prev c i) i))
                    (F.map (HomologicalComplex.d Y i (ComplexShape.next c i)))
                    (_ :
                      HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
                          HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
                        0) ≫
                  (F.mapIso (kernelSubobjectIso (HomologicalComplex.dFrom Y i)) ≪≫
                      PreservesKernel.iso F (HomologicalComplex.dFrom Y i) ≪≫
                        (kernelSubobjectIso (F.map (HomologicalComplex.dFrom Y i))).symm).inv =
                (F.mapIso (imageSubobjectIso (HomologicalComplex.dTo Y i)) ≪≫
                      (PreservesImage.iso F (HomologicalComplex.dTo Y i)).symm ≪≫
                        (imageSubobjectIso (F.map (HomologicalComplex.dTo Y i))).symm).inv ≫
                  F.map
                    (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                      (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))) ≫
          cokernelComparison
            (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
              (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))
            F
[PROOFSTEP]
dsimp [homology.map]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ cokernel.π
        (imageToKernel (F.map (HomologicalComplex.d X (ComplexShape.prev c i) i))
          (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
              0)) ≫
      (cokernel.map
            (imageToKernel (F.map (HomologicalComplex.d X (ComplexShape.prev c i) i))
              (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
                  0))
            (F.map
              (imageToKernel (HomologicalComplex.dTo X i) (HomologicalComplex.dFrom X i)
                (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0)))
            (((imageSubobjectIso (F.map (HomologicalComplex.dTo X i))).hom ≫
                image.lift
                  (MonoFactorisation.mk (F.obj (image (HomologicalComplex.dTo X i)))
                    (F.map (image.ι (HomologicalComplex.dTo X i)))
                    (F.map (factorThruImage (HomologicalComplex.dTo X i))))) ≫
              F.map (imageSubobjectIso (HomologicalComplex.dTo X i)).inv)
            (((kernelSubobjectIso (F.map (HomologicalComplex.dFrom X i))).hom ≫
                (PreservesKernel.iso F (HomologicalComplex.dFrom X i)).inv) ≫
              F.map (kernelSubobjectIso (HomologicalComplex.dFrom X i)).inv)
            (_ :
              imageToKernel (F.map (HomologicalComplex.d X (ComplexShape.prev c i) i))
                    (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
                    (_ :
                      HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                          HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
                        0) ≫
                  (F.mapIso (kernelSubobjectIso (HomologicalComplex.dFrom X i)) ≪≫
                      PreservesKernel.iso F (HomologicalComplex.dFrom X i) ≪≫
                        (kernelSubobjectIso (F.map (HomologicalComplex.dFrom X i))).symm).inv =
                (F.mapIso (imageSubobjectIso (HomologicalComplex.dTo X i)) ≪≫
                      (PreservesImage.iso F (HomologicalComplex.dTo X i)).symm ≪≫
                        (imageSubobjectIso (F.map (HomologicalComplex.dTo X i))).symm).inv ≫
                  F.map
                    (imageToKernel (HomologicalComplex.dTo X i) (HomologicalComplex.dFrom X i)
                      (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0))) ≫
          cokernelComparison
            (imageToKernel (HomologicalComplex.dTo X i) (HomologicalComplex.dFrom X i)
              (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0))
            F) ≫
        F.map
          (cokernel.desc
            (imageToKernel (HomologicalComplex.dTo X i) (HomologicalComplex.dFrom X i)
              (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0))
            (kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i) ≫
              cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
            (_ :
              imageToKernel (HomologicalComplex.dTo X i) (HomologicalComplex.dFrom X i)
                    (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0) ≫
                  kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i) ≫
                    cokernel.π
                      (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                        (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)) =
                0)) =
    cokernel.π
        (imageToKernel (F.map (HomologicalComplex.d X (ComplexShape.prev c i) i))
          (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
              0)) ≫
      cokernel.desc
          (imageToKernel (F.map (HomologicalComplex.d X (ComplexShape.prev c i) i))
            (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
                0))
          (kernelSubobjectMap (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F c).map f) i) ≫
            cokernel.π
              (imageToKernel (F.map (HomologicalComplex.d Y (ComplexShape.prev c i) i))
                (F.map (HomologicalComplex.d Y i (ComplexShape.next c i)))
                (_ :
                  HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
                      HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
                    0)))
          (_ :
            imageToKernel (F.map (HomologicalComplex.d X (ComplexShape.prev c i) i))
                  (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F c).obj X) i ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj X) i =
                      0) ≫
                kernelSubobjectMap (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F c).map f) i) ≫
                  cokernel.π
                    (imageToKernel (F.map (HomologicalComplex.d Y (ComplexShape.prev c i) i))
                      (F.map (HomologicalComplex.d Y i (ComplexShape.next c i)))
                      (_ :
                        HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
                            HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
                          0)) =
              0) ≫
        cokernel.map
            (imageToKernel (F.map (HomologicalComplex.d Y (ComplexShape.prev c i) i))
              (F.map (HomologicalComplex.d Y i (ComplexShape.next c i)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
                  0))
            (F.map
              (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
            (((imageSubobjectIso (F.map (HomologicalComplex.dTo Y i))).hom ≫
                image.lift
                  (MonoFactorisation.mk (F.obj (image (HomologicalComplex.dTo Y i)))
                    (F.map (image.ι (HomologicalComplex.dTo Y i)))
                    (F.map (factorThruImage (HomologicalComplex.dTo Y i))))) ≫
              F.map (imageSubobjectIso (HomologicalComplex.dTo Y i)).inv)
            (((kernelSubobjectIso (F.map (HomologicalComplex.dFrom Y i))).hom ≫
                (PreservesKernel.iso F (HomologicalComplex.dFrom Y i)).inv) ≫
              F.map (kernelSubobjectIso (HomologicalComplex.dFrom Y i)).inv)
            (_ :
              imageToKernel (F.map (HomologicalComplex.d Y (ComplexShape.prev c i) i))
                    (F.map (HomologicalComplex.d Y i (ComplexShape.next c i)))
                    (_ :
                      HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
                          HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
                        0) ≫
                  (F.mapIso (kernelSubobjectIso (HomologicalComplex.dFrom Y i)) ≪≫
                      PreservesKernel.iso F (HomologicalComplex.dFrom Y i) ≪≫
                        (kernelSubobjectIso (F.map (HomologicalComplex.dFrom Y i))).symm).inv =
                (F.mapIso (imageSubobjectIso (HomologicalComplex.dTo Y i)) ≪≫
                      (PreservesImage.iso F (HomologicalComplex.dTo Y i)).symm ≪≫
                        (imageSubobjectIso (F.map (HomologicalComplex.dTo Y i))).symm).inv ≫
                  F.map
                    (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                      (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))) ≫
          cokernelComparison
            (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
              (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))
            F
[PROOFSTEP]
simp only [← Category.assoc, cokernel.π_desc]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ (((((kernelSubobjectIso (F.map (HomologicalComplex.dFrom X i))).hom ≫
              (PreservesKernel.iso F (HomologicalComplex.dFrom X i)).inv) ≫
            F.map (kernelSubobjectIso (HomologicalComplex.dFrom X i)).inv) ≫
          cokernel.π
            (F.map
              (imageToKernel (HomologicalComplex.dTo X i) (HomologicalComplex.dFrom X i)
                (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0)))) ≫
        cokernelComparison
          (imageToKernel (HomologicalComplex.dTo X i) (HomologicalComplex.dFrom X i)
            (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0))
          F) ≫
      F.map
        (cokernel.desc
          (imageToKernel (HomologicalComplex.dTo X i) (HomologicalComplex.dFrom X i)
            (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0))
          (kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i) ≫
            cokernel.π
              (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
          (_ :
            imageToKernel (HomologicalComplex.dTo X i) (HomologicalComplex.dFrom X i)
                  (_ : HomologicalComplex.dTo X i ≫ HomologicalComplex.dFrom X i = 0) ≫
                kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i) ≫
                  cokernel.π
                    (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                      (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)) =
              0)) =
    ((kernelSubobjectMap (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F c).map f) i) ≫
          cokernel.π
            (imageToKernel (F.map (HomologicalComplex.d Y (ComplexShape.prev c i) i))
              (F.map (HomologicalComplex.d Y i (ComplexShape.next c i)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
                  0))) ≫
        cokernel.map
          (imageToKernel (F.map (HomologicalComplex.d Y (ComplexShape.prev c i) i))
            (F.map (HomologicalComplex.d Y i (ComplexShape.next c i)))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
                0))
          (F.map
            (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
              (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
          (((imageSubobjectIso (F.map (HomologicalComplex.dTo Y i))).hom ≫
              image.lift
                (MonoFactorisation.mk (F.obj (image (HomologicalComplex.dTo Y i)))
                  (F.map (image.ι (HomologicalComplex.dTo Y i)))
                  (F.map (factorThruImage (HomologicalComplex.dTo Y i))))) ≫
            F.map (imageSubobjectIso (HomologicalComplex.dTo Y i)).inv)
          (((kernelSubobjectIso (F.map (HomologicalComplex.dFrom Y i))).hom ≫
              (PreservesKernel.iso F (HomologicalComplex.dFrom Y i)).inv) ≫
            F.map (kernelSubobjectIso (HomologicalComplex.dFrom Y i)).inv)
          (_ :
            imageToKernel (F.map (HomologicalComplex.d Y (ComplexShape.prev c i) i))
                  (F.map (HomologicalComplex.d Y i (ComplexShape.next c i)))
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F c).obj Y) i ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F c).obj Y) i =
                      0) ≫
                (F.mapIso (kernelSubobjectIso (HomologicalComplex.dFrom Y i)) ≪≫
                    PreservesKernel.iso F (HomologicalComplex.dFrom Y i) ≪≫
                      (kernelSubobjectIso (F.map (HomologicalComplex.dFrom Y i))).symm).inv =
              (F.mapIso (imageSubobjectIso (HomologicalComplex.dTo Y i)) ≪≫
                    (PreservesImage.iso F (HomologicalComplex.dTo Y i)).symm ≪≫
                      (imageSubobjectIso (F.map (HomologicalComplex.dTo Y i))).symm).inv ≫
                F.map
                  (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                    (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))) ≫
      cokernelComparison
        (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
          (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))
        F
[PROOFSTEP]
simp only [Category.assoc, cokernelComparison_map_desc, cokernel.π_desc]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ (kernelSubobjectIso (F.map (HomologicalComplex.dFrom X i))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.dFrom X i)).inv ≫
        F.map (kernelSubobjectIso (HomologicalComplex.dFrom X i)).inv ≫
          F.map
            (kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i) ≫
              cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))) =
    kernelSubobjectMap (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F c).map f) i) ≫
      (kernelSubobjectIso (F.map (HomologicalComplex.dFrom Y i))).hom ≫
        (PreservesKernel.iso F (HomologicalComplex.dFrom Y i)).inv ≫
          F.map (kernelSubobjectIso (HomologicalComplex.dFrom Y i)).inv ≫
            cokernel.π
                (F.map
                  (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                    (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))) ≫
              cokernelComparison
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))
                F
[PROOFSTEP]
simp only [π_comp_cokernelComparison, ← F.map_comp]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ (kernelSubobjectIso (F.map (HomologicalComplex.dFrom X i))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.dFrom X i)).inv ≫
        F.map
          ((kernelSubobjectIso (HomologicalComplex.dFrom X i)).inv ≫
            kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i) ≫
              cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))) =
    kernelSubobjectMap (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F c).map f) i) ≫
      (kernelSubobjectIso (F.map (HomologicalComplex.dFrom Y i))).hom ≫
        (PreservesKernel.iso F (HomologicalComplex.dFrom Y i)).inv ≫
          F.map
            ((kernelSubobjectIso (HomologicalComplex.dFrom Y i)).inv ≫
              cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
[PROOFSTEP]
erw [← kernelSubobjectIso_comp_kernel_map_assoc]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ (kernelSubobjectIso (F.map (HomologicalComplex.dFrom X i))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.dFrom X i)).inv ≫
        F.map
          ((kernelSubobjectIso (HomologicalComplex.dFrom X i)).inv ≫
            kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i) ≫
              cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))) =
    (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      kernel.map (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
          (F.map (HomologicalComplex.d Y i (ComplexShape.next c i)))
          (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F c).map f) i).left
          (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F c).map f) i).right
          (_ :
            (Arrow.mk (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
                (𝟭 B).map (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F c).map f) i).right =
              (𝟭 B).map (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F c).map f) i).left ≫
                (Arrow.mk (F.map (HomologicalComplex.d Y i (ComplexShape.next c i)))).hom) ≫
        (PreservesKernel.iso F (HomologicalComplex.dFrom Y i)).inv ≫
          F.map
            ((kernelSubobjectIso (HomologicalComplex.dFrom Y i)).inv ≫
              cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
[PROOFSTEP]
simp only [HomologicalComplex.Hom.sqFrom_right, HomologicalComplex.Hom.sqFrom_left, F.mapHomologicalComplex_map_f,
  F.map_comp]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ (kernelSubobjectIso (F.map (HomologicalComplex.dFrom X i))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.dFrom X i)).inv ≫
        F.map (kernelSubobjectIso (HomologicalComplex.dFrom X i)).inv ≫
          F.map (kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i)) ≫
            F.map
              (cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))) =
    (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      kernel.map (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
          (F.map (HomologicalComplex.d Y i (ComplexShape.next c i))) (F.map (HomologicalComplex.Hom.f f i))
          (F.map (HomologicalComplex.Hom.f f (ComplexShape.next c i)))
          (_ :
            F.map (HomologicalComplex.d X i (ComplexShape.next c i)) ≫
                F.map (HomologicalComplex.Hom.f f (ComplexShape.next c i)) =
              F.map (HomologicalComplex.Hom.f f i) ≫ F.map (HomologicalComplex.d Y i (ComplexShape.next c i))) ≫
        (PreservesKernel.iso F (HomologicalComplex.dFrom Y i)).inv ≫
          F.map (kernelSubobjectIso (HomologicalComplex.dFrom Y i)).inv ≫
            F.map
              (cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.dFrom Y i)
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
[PROOFSTEP]
dsimp [HomologicalComplex.dFrom, HomologicalComplex.Hom.next]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map (kernelSubobjectIso (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
          F.map (kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i)) ≫
            F.map
              (cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))) =
    (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      kernel.map (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))
          (F.map (HomologicalComplex.d Y i (ComplexShape.next c i))) (F.map (HomologicalComplex.Hom.f f i))
          (F.map (HomologicalComplex.Hom.f f (ComplexShape.next c i)))
          (_ :
            F.map (HomologicalComplex.d X i (ComplexShape.next c i)) ≫
                F.map (HomologicalComplex.Hom.f f (ComplexShape.next c i)) =
              F.map (HomologicalComplex.Hom.f f i) ≫ F.map (HomologicalComplex.d Y i (ComplexShape.next c i))) ≫
        (PreservesKernel.iso F (HomologicalComplex.d Y i (ComplexShape.next c i))).inv ≫
          F.map (kernelSubobjectIso (HomologicalComplex.d Y i (ComplexShape.next c i))).inv ≫
            F.map
              (cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
[PROOFSTEP]
rw [kernel_map_comp_preserves_kernel_iso_inv_assoc]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map (kernelSubobjectIso (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
          F.map (kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i)) ≫
            F.map
              (cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))) =
    (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map
            (kernel.map (HomologicalComplex.d X i (ComplexShape.next c i))
              (HomologicalComplex.d Y i (ComplexShape.next c i)) (HomologicalComplex.Hom.f f i)
              (HomologicalComplex.Hom.f f (ComplexShape.next c i)) ?hpq) ≫
          F.map (kernelSubobjectIso (HomologicalComplex.d Y i (ComplexShape.next c i))).inv ≫
            F.map
              (cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
case hpq
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ HomologicalComplex.d X i (ComplexShape.next c i) ≫ HomologicalComplex.Hom.f f (ComplexShape.next c i) =
    HomologicalComplex.Hom.f f i ≫ HomologicalComplex.d Y i (ComplexShape.next c i)
[PROOFSTEP]
conv_lhs => erw [← F.map_comp_assoc]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
| (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
    (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
      F.map (kernelSubobjectIso (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map (kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i)) ≫
          F.map
            (cokernel.π
              (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
[PROOFSTEP]
erw [← F.map_comp_assoc]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
| (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
    (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
      F.map (kernelSubobjectIso (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map (kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i)) ≫
          F.map
            (cokernel.π
              (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
[PROOFSTEP]
erw [← F.map_comp_assoc]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
| (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
    (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
      F.map (kernelSubobjectIso (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map (kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i)) ≫
          F.map
            (cokernel.π
              (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
[PROOFSTEP]
erw [← F.map_comp_assoc]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map
            ((kernelSubobjectIso (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
              kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i)) ≫
          F.map
            (cokernel.π
              (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))) =
    (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map
            (kernel.map (HomologicalComplex.d X i (ComplexShape.next c i))
              (HomologicalComplex.d Y i (ComplexShape.next c i)) (HomologicalComplex.Hom.f f i)
              (HomologicalComplex.Hom.f f (ComplexShape.next c i)) ?hpq) ≫
          F.map (kernelSubobjectIso (HomologicalComplex.d Y i (ComplexShape.next c i))).inv ≫
            F.map
              (cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
case hpq
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ HomologicalComplex.d X i (ComplexShape.next c i) ≫ HomologicalComplex.Hom.f f (ComplexShape.next c i) =
    HomologicalComplex.Hom.f f i ≫ HomologicalComplex.d Y i (ComplexShape.next c i)
[PROOFSTEP]
rotate_right
[GOAL]
case hpq
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ HomologicalComplex.d X i (ComplexShape.next c i) ≫ HomologicalComplex.Hom.f f (ComplexShape.next c i) =
    HomologicalComplex.Hom.f f i ≫ HomologicalComplex.d Y i (ComplexShape.next c i)
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map
            ((kernelSubobjectIso (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
              kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i)) ≫
          F.map
            (cokernel.π
              (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))) =
    (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map
            (kernel.map (HomologicalComplex.d X i (ComplexShape.next c i))
              (HomologicalComplex.d Y i (ComplexShape.next c i)) (HomologicalComplex.Hom.f f i)
              (HomologicalComplex.Hom.f f (ComplexShape.next c i)) ?hpq) ≫
          F.map (kernelSubobjectIso (HomologicalComplex.d Y i (ComplexShape.next c i))).inv ≫
            F.map
              (cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
[PROOFSTEP]
simp
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map
            ((kernelSubobjectIso (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
              kernelSubobjectMap (HomologicalComplex.Hom.sqFrom f i)) ≫
          F.map
            (cokernel.π
              (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))) =
    (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map
            (kernel.map (HomologicalComplex.d X i (ComplexShape.next c i))
              (HomologicalComplex.d Y i (ComplexShape.next c i)) (HomologicalComplex.Hom.f f i)
              (HomologicalComplex.Hom.f f (ComplexShape.next c i))
              (_ :
                HomologicalComplex.d X i (ComplexShape.next c i) ≫ HomologicalComplex.Hom.f f (ComplexShape.next c i) =
                  HomologicalComplex.Hom.f f i ≫ HomologicalComplex.d Y i (ComplexShape.next c i))) ≫
          F.map (kernelSubobjectIso (HomologicalComplex.d Y i (ComplexShape.next c i))).inv ≫
            F.map
              (cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
[PROOFSTEP]
rw [← kernel_map_comp_kernelSubobjectIso_inv]
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map
            (kernel.map (HomologicalComplex.d X i (ComplexShape.next c i))
                (HomologicalComplex.d Y i (ComplexShape.next c i)) (HomologicalComplex.Hom.sqFrom f i).left
                (HomologicalComplex.Hom.sqFrom f i).right
                (_ :
                  (Arrow.mk (HomologicalComplex.d X i (ComplexShape.next c i))).hom ≫
                      (𝟭 A).map (HomologicalComplex.Hom.sqFrom f i).right =
                    (𝟭 A).map (HomologicalComplex.Hom.sqFrom f i).left ≫
                      (Arrow.mk (HomologicalComplex.d Y i (ComplexShape.next c i))).hom) ≫
              (kernelSubobjectIso (HomologicalComplex.d Y i (ComplexShape.next c i))).inv) ≫
          F.map
            (cokernel.π
              (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))) =
    (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map
            (kernel.map (HomologicalComplex.d X i (ComplexShape.next c i))
              (HomologicalComplex.d Y i (ComplexShape.next c i)) (HomologicalComplex.Hom.f f i)
              (HomologicalComplex.Hom.f f (ComplexShape.next c i))
              (_ :
                HomologicalComplex.d X i (ComplexShape.next c i) ≫ HomologicalComplex.Hom.f f (ComplexShape.next c i) =
                  HomologicalComplex.Hom.f f i ≫ HomologicalComplex.d Y i (ComplexShape.next c i))) ≫
          F.map (kernelSubobjectIso (HomologicalComplex.d Y i (ComplexShape.next c i))).inv ≫
            F.map
              (cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
[PROOFSTEP]
any_goals simp
[GOAL]
A : Type u
inst✝⁶ : Category.{v, u} A
inst✝⁵ : Abelian A
X✝ Y✝ Z : A
f✝ : X✝ ⟶ Y✝
g : Y✝ ⟶ Z
w : f✝ ≫ g = 0
ι : Type u_1
c : ComplexShape ι
B : Type u_2
inst✝⁴ : Category.{?u.214307, u_2} B
inst✝³ : Abelian B
F : A ⥤ B
inst✝² : Additive F
inst✝¹ : PreservesFiniteLimits F
inst✝ : PreservesFiniteColimits F
i : ι
X Y : HomologicalComplex A c
f : X ⟶ Y
⊢ (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map
            (kernel.map (HomologicalComplex.d X i (ComplexShape.next c i))
                (HomologicalComplex.d Y i (ComplexShape.next c i)) (HomologicalComplex.Hom.sqFrom f i).left
                (HomologicalComplex.Hom.sqFrom f i).right
                (_ :
                  (Arrow.mk (HomologicalComplex.d X i (ComplexShape.next c i))).hom ≫
                      (𝟭 A).map (HomologicalComplex.Hom.sqFrom f i).right =
                    (𝟭 A).map (HomologicalComplex.Hom.sqFrom f i).left ≫
                      (Arrow.mk (HomologicalComplex.d Y i (ComplexShape.next c i))).hom) ≫
              (kernelSubobjectIso (HomologicalComplex.d Y i (ComplexShape.next c i))).inv) ≫
          F.map
            (cokernel.π
              (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0))) =
    (kernelSubobjectIso (F.map (HomologicalComplex.d X i (ComplexShape.next c i)))).hom ≫
      (PreservesKernel.iso F (HomologicalComplex.d X i (ComplexShape.next c i))).inv ≫
        F.map
            (kernel.map (HomologicalComplex.d X i (ComplexShape.next c i))
              (HomologicalComplex.d Y i (ComplexShape.next c i)) (HomologicalComplex.Hom.f f i)
              (HomologicalComplex.Hom.f f (ComplexShape.next c i))
              (_ :
                HomologicalComplex.d X i (ComplexShape.next c i) ≫ HomologicalComplex.Hom.f f (ComplexShape.next c i) =
                  HomologicalComplex.Hom.f f i ≫ HomologicalComplex.d Y i (ComplexShape.next c i))) ≫
          F.map (kernelSubobjectIso (HomologicalComplex.d Y i (ComplexShape.next c i))).inv ≫
            F.map
              (cokernel.π
                (imageToKernel (HomologicalComplex.dTo Y i) (HomologicalComplex.d Y i (ComplexShape.next c i))
                  (_ : HomologicalComplex.dTo Y i ≫ HomologicalComplex.dFrom Y i = 0)))
[PROOFSTEP]
simp
