Theorem: CategoryTheory.Abelian.Functor.leftDerivedZeroToSelfApp_comp_inv
File: Mathlib/CategoryTheory/Abelian/LeftDerived.lean

tactic: dsimp [leftDerivedZeroToSelfApp, leftDerivedZeroToSelfAppInv]
state_before: C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
⊢ leftDerivedZeroToSelfApp F P ≫ leftDerivedZeroToSelfAppInv F P = 𝟙 ((leftDerived F 0).obj X)

tactic: rw [← Category.assoc, ← Category.assoc, ← Category.assoc, Iso.comp_inv_eq]
state_before: C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
⊢ ((leftDerivedObjIso F 0 P).hom ≫
        homology.desc' (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0)
          (kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) ≫
            F.map (HomologicalComplex.Hom.f P.π 0))
          (_ :
            kernel.lift (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                  (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                      0) ≫
                kernel.ι (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0) ≫
                  F.map (HomologicalComplex.Hom.f P.π 0) =
              0)) ≫
      inv
          (cokernel.desc (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
            (F.map (HomologicalComplex.Hom.f P.π 0))
            (_ :
              F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
                  F.map (HomologicalComplex.Hom.f P.π 0) =
                0)) ≫
        cokernel.map (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
            (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
              (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                  0))
            (𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))))
            (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
              (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
              (_ :
                𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                    F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
                  0))
            (_ :
              F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
                  kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                    (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
                    (_ :
                      𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                          F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
                        0) =
                𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))) ≫
                  kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                    (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
                    (_ :
                      HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                          HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                        0)) ≫
          (homologyIsoCokernelLift
                (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
                (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                (_ :
                  HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                      HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                    0)).inv ≫
            (leftDerivedObjIso F 0 P).inv =
    𝟙 ((leftDerived F 0).obj X)

tactic: simp only [Category.id_comp]
state_before: C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
⊢ ((((leftDerivedObjIso F 0 P).hom ≫
            homology.desc' (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
              (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                  0)
              (kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) ≫
                F.map (HomologicalComplex.Hom.f P.π 0))
              (_ :
                kernel.lift (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                      (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                      (_ :
                        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                            HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                          0) ≫
                    kernel.ι
                        (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0) ≫
                      F.map (HomologicalComplex.Hom.f P.π 0) =
                  0)) ≫
          inv
            (cokernel.desc (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
              (F.map (HomologicalComplex.Hom.f P.π 0))
              (_ :
                F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
                    F.map (HomologicalComplex.Hom.f P.π 0) =
                  0))) ≫
        cokernel.map (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
            (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                0))
          (𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))))
          (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
            (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
            (_ :
              𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                  F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
                0))
          (_ :
            F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
                kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                  (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
                  (_ :
                    𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                        F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
                      0) =
              𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))) ≫
                kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                  (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                      0))) ≫
      (homologyIsoCokernelLift (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0)).inv =
    𝟙 ((leftDerived F 0).obj X) ≫ (leftDerivedObjIso F 0 P).hom

tactic: rw [Category.assoc, Category.assoc, Category.assoc]
state_before: C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
⊢ ((((leftDerivedObjIso F 0 P).hom ≫
            homology.desc' (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
              (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                  0)
              (kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) ≫
                F.map (HomologicalComplex.Hom.f P.π 0))
              (_ :
                kernel.lift (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                      (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                      (_ :
                        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                            HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                          0) ≫
                    kernel.ι
                        (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0) ≫
                      F.map (HomologicalComplex.Hom.f P.π 0) =
                  0)) ≫
          inv
            (cokernel.desc (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
              (F.map (HomologicalComplex.Hom.f P.π 0))
              (_ :
                F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
                    F.map (HomologicalComplex.Hom.f P.π 0) =
                  0))) ≫
        cokernel.map (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
            (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                0))
          (𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))))
          (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
            (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
            (_ :
              𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                  F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
                0))
          (_ :
            F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
                kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                  (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
                  (_ :
                    𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                        F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
                      0) =
              𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))) ≫
                kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                  (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                      0))) ≫
      (homologyIsoCokernelLift (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0)).inv =
    (leftDerivedObjIso F 0 P).hom

tactic: convert Category.comp_id (leftDerivedObjIso F 0 P).hom
state_before: C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
⊢ (leftDerivedObjIso F 0 P).hom ≫
      homology.desc' (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0)
          (kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) ≫
            F.map (HomologicalComplex.Hom.f P.π 0))
          (_ :
            kernel.lift (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                  (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                      0) ≫
                kernel.ι (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0) ≫
                  F.map (HomologicalComplex.Hom.f P.π 0) =
              0) ≫
        inv
            (cokernel.desc (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
              (F.map (HomologicalComplex.Hom.f P.π 0))
              (_ :
                F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
                    F.map (HomologicalComplex.Hom.f P.π 0) =
                  0)) ≫
          cokernel.map (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
              (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
                (_ :
                  HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                      HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                    0))
              (𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))))
              (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
                (_ :
                  𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                      F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
                    0))
              (_ :
                F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
                    kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                      (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
                      (_ :
                        𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                            F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
                          0) =
                  𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))) ≫
                    kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                      (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
                      (_ :
                        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                            HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                          0)) ≫
            (homologyIsoCokernelLift
                (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
                (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                (_ :
                  HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                      HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                    0)).inv =
    (leftDerivedObjIso F 0 P).hom

tactic: rw [← Category.assoc, ← Category.assoc, Iso.comp_inv_eq]
state_before: case h.e'_2.h.h.e'_7.h
C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
e_1✝ :
  ((leftDerived F 0).obj X ⟶
      homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
        (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
            0)) =
    ((leftDerived F 0).obj X ⟶
      (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex))
e_4✝ :
  HomologicalComplex.homology ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
e_5✝ :
  homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
            HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
          0) =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
⊢ homology.desc' (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
        (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
            0)
        (kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) ≫
          F.map (HomologicalComplex.Hom.f P.π 0))
        (_ :
          kernel.lift (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                (_ :
                  HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                      HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                    0) ≫
              kernel.ι (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0) ≫
                F.map (HomologicalComplex.Hom.f P.π 0) =
            0) ≫
      inv
          (cokernel.desc (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
            (F.map (HomologicalComplex.Hom.f P.π 0))
            (_ :
              F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
                  F.map (HomologicalComplex.Hom.f P.π 0) =
                0)) ≫
        cokernel.map (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
            (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
              (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                  0))
            (𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))))
            (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
              (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
              (_ :
                𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                    F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
                  0))
            (_ :
              F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
                  kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                    (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
                    (_ :
                      𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                          F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
                        0) =
                𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))) ≫
                  kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                    (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
                    (_ :
                      HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                          HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                        0)) ≫
          (homologyIsoCokernelLift
              (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
              (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                  0)).inv =
    𝟙 ((homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex))

tactic: simp only [Category.id_comp]
state_before: case h.e'_2.h.h.e'_7.h
C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
e_1✝ :
  ((leftDerived F 0).obj X ⟶
      homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
        (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
            0)) =
    ((leftDerived F 0).obj X ⟶
      (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex))
e_4✝ :
  HomologicalComplex.homology ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
e_5✝ :
  homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
            HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
          0) =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
⊢ (homology.desc' (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0)
          (kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) ≫
            F.map (HomologicalComplex.Hom.f P.π 0))
          (_ :
            kernel.lift (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                  (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                      0) ≫
                kernel.ι (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0) ≫
                  F.map (HomologicalComplex.Hom.f P.π 0) =
              0) ≫
        inv
          (cokernel.desc (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
            (F.map (HomologicalComplex.Hom.f P.π 0))
            (_ :
              F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
                  F.map (HomologicalComplex.Hom.f P.π 0) =
                0))) ≫
      cokernel.map (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
        (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0))
        (𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))))
        (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
          (_ :
            𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
              0))
        (_ :
          F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
              kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
                (_ :
                  𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                      F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
                    0) =
            𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))) ≫
              kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
                (_ :
                  HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                      HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                    0)) =
    𝟙
        ((homologyFunctor D (ComplexShape.down ℕ) 0).obj
          ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)) ≫
      (homologyIsoCokernelLift (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0)).hom

tactic: apply homology.hom_from_ext
state_before: case h.e'_2.h.h.e'_7.h
C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
e_1✝ :
  ((leftDerived F 0).obj X ⟶
      homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
        (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
            0)) =
    ((leftDerived F 0).obj X ⟶
      (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex))
e_4✝ :
  HomologicalComplex.homology ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
e_5✝ :
  homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
            HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
          0) =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
⊢ (homology.desc' (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0)
          (kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) ≫
            F.map (HomologicalComplex.Hom.f P.π 0))
          (_ :
            kernel.lift (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                  (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                      0) ≫
                kernel.ι (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0) ≫
                  F.map (HomologicalComplex.Hom.f P.π 0) =
              0) ≫
        inv
          (cokernel.desc (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
            (F.map (HomologicalComplex.Hom.f P.π 0))
            (_ :
              F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
                  F.map (HomologicalComplex.Hom.f P.π 0) =
                0))) ≫
      cokernel.map (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
        (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0))
        (𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))))
        (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
          (_ :
            𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
              0))
        (_ :
          F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
              kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
                (_ :
                  𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                      F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
                    0) =
            𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))) ≫
              kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
                (_ :
                  HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                      HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                    0)) =
    𝟙
        ((homologyFunctor D (ComplexShape.down ℕ) 0).obj
          ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)) ≫
      (homologyIsoCokernelLift (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0)).hom

tactic: simp only [← Category.assoc]
state_before: case h.e'_2.h.h.e'_7.h.h
C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
e_1✝ :
  ((leftDerived F 0).obj X ⟶
      homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
        (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
            0)) =
    ((leftDerived F 0).obj X ⟶
      (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex))
e_4✝ :
  HomologicalComplex.homology ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
e_5✝ :
  homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
            HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
          0) =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
⊢ homology.π' (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
        (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
            0) ≫
      (homology.desc' (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
            (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                0)
            (kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) ≫
              F.map (HomologicalComplex.Hom.f P.π 0))
            (_ :
              kernel.lift (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                    (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                    (_ :
                      HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                          HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                        0) ≫
                  kernel.ι
                      (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0) ≫
                    F.map (HomologicalComplex.Hom.f P.π 0) =
                0) ≫
          inv
            (cokernel.desc (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
              (F.map (HomologicalComplex.Hom.f P.π 0))
              (_ :
                F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
                    F.map (HomologicalComplex.Hom.f P.π 0) =
                  0))) ≫
        cokernel.map (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
            (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                0))
          (𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))))
          (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
            (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
            (_ :
              𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                  F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
                0))
          (_ :
            F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
                kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                  (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
                  (_ :
                    𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                        F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
                      0) =
              𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))) ≫
                kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                  (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                      0)) =
    homology.π' (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
        (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
            0) ≫
      𝟙
          ((homologyFunctor D (ComplexShape.down ℕ) 0).obj
            ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)) ≫
        (homologyIsoCokernelLift (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
            (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                0)).hom

tactic: erw [homology.π'_desc', Category.assoc, Category.assoc, ←
  Category.assoc (F.map _), Abelian.cokernel.desc.inv _ _ (exact_of_map_projectiveResolution F P),
  cokernel.π_desc, homology.π', Category.comp_id, Category.assoc (cokernel.π _), Iso.inv_hom_id,
  Category.comp_id, ← Category.assoc]
state_before: case h.e'_2.h.h.e'_7.h.h
C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
e_1✝ :
  ((leftDerived F 0).obj X ⟶
      homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
        (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
            0)) =
    ((leftDerived F 0).obj X ⟶
      (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex))
e_4✝ :
  HomologicalComplex.homology ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
e_5✝ :
  homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
            HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
          0) =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
⊢ ((homology.π' (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
            (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                0) ≫
          homology.desc' (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
            (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                0)
            (kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) ≫
              F.map (HomologicalComplex.Hom.f P.π 0))
            (_ :
              kernel.lift (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                    (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
                    (_ :
                      HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                          HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                        0) ≫
                  kernel.ι
                      (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0) ≫
                    F.map (HomologicalComplex.Hom.f P.π 0) =
                0)) ≫
        inv
          (cokernel.desc (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
            (F.map (HomologicalComplex.Hom.f P.π 0))
            (_ :
              F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
                  F.map (HomologicalComplex.Hom.f P.π 0) =
                0))) ≫
      cokernel.map (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
        (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0))
        (𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))))
        (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
          (_ :
            𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
              0))
        (_ :
          F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0) ≫
              kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
                (_ :
                  𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                      F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
                    0) =
            𝟙 (F.obj (HomologicalComplex.X P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0))) ≫
              kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
                (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
                (_ :
                  HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                      HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
                    0)) =
    (homology.π' (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
          (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0) ≫
        𝟙
          ((homologyFunctor D (ComplexShape.down ℕ) 0).obj
            ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex))) ≫
      (homologyIsoCokernelLift (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0)).hom

tactic: conv_rhs => rw [← Category.id_comp (cokernel.π _)]
state_before: case h.e'_2.h.h.e'_7.h.h
C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
e_1✝ :
  ((leftDerived F 0).obj X ⟶
      homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
        (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
            0)) =
    ((leftDerived F 0).obj X ⟶
      (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex))
e_4✝ :
  HomologicalComplex.homology ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
e_5✝ :
  homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
            HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
          0) =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
⊢ (kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) ≫
        kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
          (_ :
            𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
              0)) ≫
      cokernel.π
        (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0)) =
    cokernel.π
      (kernel.lift (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
        (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
            0))

tactic: congr
state_before: case h.e'_2.h.h.e'_7.h.h
C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
e_1✝ :
  ((leftDerived F 0).obj X ⟶
      homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
        (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
            0)) =
    ((leftDerived F 0).obj X ⟶
      (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex))
e_4✝ :
  HomologicalComplex.homology ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
e_5✝ :
  homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
            HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
          0) =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
⊢ (kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) ≫
        kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
          (_ :
            𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
              0)) ≫
      cokernel.π
        (kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0)) =
    𝟙 (kernel (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)) ≫
      cokernel.π
        (kernel.lift (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
          (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
              0))

tactic: apply equalizer.hom_ext
state_before: case h.e'_2.h.h.e'_7.h.h.e_a
C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
e_1✝ :
  ((leftDerived F 0).obj X ⟶
      homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
        (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
            0)) =
    ((leftDerived F 0).obj X ⟶
      (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex))
e_4✝ :
  HomologicalComplex.homology ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
e_5✝ :
  homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
            HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
          0) =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
⊢ kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) ≫
      kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
        (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
        (_ :
          𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
              F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
            0) =
    𝟙 (kernel (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0))

tactic: simp only [Category.id_comp]
state_before: case h.e'_2.h.h.e'_7.h.h.e_a.h
C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
e_1✝ :
  ((leftDerived F 0).obj X ⟶
      homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
        (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
            0)) =
    ((leftDerived F 0).obj X ⟶
      (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex))
e_4✝ :
  HomologicalComplex.homology ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
e_5✝ :
  homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
            HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
          0) =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
⊢ (kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) ≫
        kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
          (_ :
            𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
              0)) ≫
      equalizer.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) 0 =
    𝟙 (kernel (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0)) ≫
      equalizer.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) 0

tactic: rw [Category.assoc, equalizer_as_kernel, kernel.lift_ι]
state_before: case h.e'_2.h.h.e'_7.h.h.e_a.h
C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
e_1✝ :
  ((leftDerived F 0).obj X ⟶
      homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
        (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
            0)) =
    ((leftDerived F 0).obj X ⟶
      (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex))
e_4✝ :
  HomologicalComplex.homology ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
e_5✝ :
  homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
            HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
          0) =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
⊢ (kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) ≫
        kernel.lift (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
          (𝟙 (F.obj (HomologicalComplex.X P.complex 0)))
          (_ :
            𝟙 (F.obj (HomologicalComplex.X P.complex 0)) ≫
                F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)) =
              0)) ≫
      equalizer.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) 0 =
    equalizer.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) 0

tactic: simp only [Category.comp_id]
state_before: case h.e'_2.h.h.e'_7.h.h.e_a.h
C : Type u
inst✝⁶ : Category C
D : Type u
inst✝⁵ : Category D
F : C ⥤ D
X✝ Y Z : C
f : X✝ ⟶ Y
g : Y ⟶ Z
inst✝⁴ : Abelian C
inst✝³ : Abelian D
inst✝² : Functor.Additive F
inst✝¹ : EnoughProjectives C
inst✝ : PreservesFiniteColimits F
X : C
P : ProjectiveResolution X
e_1✝ :
  ((leftDerived F 0).obj X ⟶
      homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
        (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
            0)) =
    ((leftDerived F 0).obj X ⟶
      (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex))
e_4✝ :
  HomologicalComplex.homology ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
e_5✝ :
  homology (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
            HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 =
          0) =
    (homologyFunctor D (ComplexShape.down ℕ) 0).obj ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)
⊢ kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0))) ≫
      𝟙 (F.obj (HomologicalComplex.X P.complex 0)) =
    kernel.ι (F.map (HomologicalComplex.d P.complex 0 (ComplexShape.next (ComplexShape.down ℕ) 0)))