l3lab/ntp-mathlib huggingface dataset:
theorem map_eq_desc'_lift_right (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
        (by simp [h]))
        (by
          ext
          simp only [Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
          erw [← reassoc_of% α.w]
          simp) := by
  rw [map_eq_desc'_lift_left]
  ext
  

Proof state:
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'

Next tactic:
simp [h]
theorem map_eq_lift_desc'_right (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
          (by
            

Proof state:
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

Next tactic:
simp only [kernel.lift_ι_assoc]
theorem map_eq_lift_desc'_right (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc]
            

Proof state:
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

Next tactic:
erw [← reassoc_of% α.w]
theorem map_eq_lift_desc'_right (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc]
            erw [← reassoc_of% α.w]
            

Proof state:
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

Next tactic:
simp
theorem map_eq_lift_desc'_right (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc]
            erw [← reassoc_of% α.w]
            simp))
        (by
          -- Porting note: once was known as ext
          

Proof state:
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

Next tactic:
apply homology'.hom_from_ext
theorem map_eq_lift_desc'_right (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc]
            erw [← reassoc_of% α.w]
            simp))
        (by
          -- Porting note: once was known as ext
          apply homology'.hom_from_ext
          

Proof state:
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

Next tactic:
simp [h]
theorem map_eq_lift_desc'_right (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc]
            erw [← reassoc_of% α.w]
            simp))
        (by
          -- Porting note: once was known as ext
          apply homology'.hom_from_ext
          simp [h]) := by
  

Proof state:
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)

Next tactic:
rw [map_eq_desc'_lift_right]
theorem map_eq_lift_desc'_right (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc]
            erw [← reassoc_of% α.w]
            simp))
        (by
          -- Porting note: once was known as ext
          apply homology'.hom_from_ext
          simp [h]) := by
  rw [map_eq_desc'_lift_right]
  -- Porting note: once was known as ext
  

Proof state:
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)

Next tactic:
apply homology'.hom_to_ext
theorem map_eq_lift_desc'_right (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc]
            erw [← reassoc_of% α.w]
            simp))
        (by
          -- Porting note: once was known as ext
          apply homology'.hom_from_ext
          simp [h]) := by
  rw [map_eq_desc'_lift_right]
  -- Porting note: once was known as ext
  apply homology'.hom_to_ext
  

Proof state:
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'

Next tactic:
apply homology'.hom_from_ext
theorem map_eq_lift_desc'_right (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc]
            erw [← reassoc_of% α.w]
            simp))
        (by
          -- Porting note: once was known as ext
          apply homology'.hom_from_ext
          simp [h]) := by
  rw [map_eq_desc'_lift_right]
  -- Porting note: once was known as ext
  apply homology'.hom_to_ext
  apply homology'.hom_from_ext
  

Proof state:
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'

Next tactic:
simp
@[reassoc (attr := simp)]
theorem map_ι (α β h) :
    map w w' α β h ≫ ι f' g' w' =
      ι f g w ≫ cokernel.map f f' α.left β.left (by 

Proof state:
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'

Next tactic:
simp [h, β.w.symm]
@[reassoc (attr := simp)]
theorem map_ι (α β h) :
    map w w' α β h ≫ ι f' g' w' =
      ι f g w ≫ cokernel.map f f' α.left β.left (by simp [h, β.w.symm]) := by
  

Proof state:
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')

Next tactic:
rw [map_eq_lift_desc'_left, lift_ι]
@[reassoc (attr := simp)]
theorem map_ι (α β h) :
    map w w' α β h ≫ ι f' g' w' =
      ι f g w ≫ cokernel.map f f' α.left β.left (by simp [h, β.w.symm]) := by
  rw [map_eq_lift_desc'_left, lift_ι]
  -- Porting note: once was known as ext
  

Proof state:
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')

Next tactic:
apply homology'.hom_from_ext
@[reassoc (attr := simp)]
theorem map_ι (α β h) :
    map w w' α β h ≫ ι f' g' w' =
      ι f g w ≫ cokernel.map f f' α.left β.left (by simp [h, β.w.symm]) := by
  rw [map_eq_lift_desc'_left, lift_ι]
  -- Porting note: once was known as ext
  apply homology'.hom_from_ext
  

Proof state:
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')

Next tactic:
simp only [← Category.assoc]
@[reassoc (attr := simp)]
theorem map_ι (α β h) :
    map w w' α β h ≫ ι f' g' w' =
      ι f g w ≫ cokernel.map f f' α.left β.left (by simp [h, β.w.symm]) := by
  rw [map_eq_lift_desc'_left, lift_ι]
  -- Porting note: once was known as ext
  apply homology'.hom_from_ext
  simp only [← Category.assoc]
  

Proof state:
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')

Next tactic:
rw [π'_ι, π'_desc', Category.assoc, Category.assoc, cokernel.π_desc]
/-- When `F` is an exact additive functor, `F(Hᵢ(X)) ≅ Hᵢ(F(X))` for `X` a complex. -/
noncomputable def homology'Iso (C : HomologicalComplex A c) (j : ι) :
    F.obj (C.homology' j) ≅ ((F.mapHomologicalComplex c).obj C).homology' j :=
  (PreservesCokernel.iso F _).trans
    (cokernel.mapIso _ _
      ((F.mapIso (imageSubobjectIso _)).trans
        ((PreservesImage.iso F _).symm.trans (imageSubobjectIso _).symm))
      ((F.mapIso (kernelSubobjectIso _)).trans
        ((PreservesKernel.iso F _).trans (kernelSubobjectIso _).symm))
      (by
        

Proof state:
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.285620, 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)

Next tactic:
dsimp
/-- When `F` is an exact additive functor, `F(Hᵢ(X)) ≅ Hᵢ(F(X))` for `X` a complex. -/
noncomputable def homology'Iso (C : HomologicalComplex A c) (j : ι) :
    F.obj (C.homology' j) ≅ ((F.mapHomologicalComplex c).obj C).homology' j :=
  (PreservesCokernel.iso F _).trans
    (cokernel.mapIso _ _
      ((F.mapIso (imageSubobjectIso _)).trans
        ((PreservesImage.iso F _).symm.trans (imageSubobjectIso _).symm))
      ((F.mapIso (kernelSubobjectIso _)).trans
        ((PreservesKernel.iso F _).trans (kernelSubobjectIso _).symm))
      (by
        dsimp
        

Proof state:
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.285620, 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)

Next tactic:
ext
/-- When `F` is an exact additive functor, `F(Hᵢ(X)) ≅ Hᵢ(F(X))` for `X` a complex. -/
noncomputable def homology'Iso (C : HomologicalComplex A c) (j : ι) :
    F.obj (C.homology' j) ≅ ((F.mapHomologicalComplex c).obj C).homology' j :=
  (PreservesCokernel.iso F _).trans
    (cokernel.mapIso _ _
      ((F.mapIso (imageSubobjectIso _)).trans
        ((PreservesImage.iso F _).symm.trans (imageSubobjectIso _).symm))
      ((F.mapIso (kernelSubobjectIso _)).trans
        ((PreservesKernel.iso F _).trans (kernelSubobjectIso _).symm))
      (by
        dsimp
        ext
        

Proof state:
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.285620, 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))))

Next tactic:
simp only [Category.assoc, imageToKernel_arrow]
/-- When `F` is an exact additive functor, `F(Hᵢ(X)) ≅ Hᵢ(F(X))` for `X` a complex. -/
noncomputable def homology'Iso (C : HomologicalComplex A c) (j : ι) :
    F.obj (C.homology' j) ≅ ((F.mapHomologicalComplex c).obj C).homology' j :=
  (PreservesCokernel.iso F _).trans
    (cokernel.mapIso _ _
      ((F.mapIso (imageSubobjectIso _)).trans
        ((PreservesImage.iso F _).symm.trans (imageSubobjectIso _).symm))
      ((F.mapIso (kernelSubobjectIso _)).trans
        ((PreservesKernel.iso F _).trans (kernelSubobjectIso _).symm))
      (by
        dsimp
        ext
        simp only [Category.assoc, imageToKernel_arrow]
        

Proof state:
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.285620, 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)))

Next tactic:
erw [kernelSubobject_arrow', imageSubobject_arrow']