Theorem: CategoryTheory.Abelian.Functor.leftDerivedZeroToSelfAppInv_comp
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
⊢ leftDerivedZeroToSelfAppInv F P ≫ leftDerivedZeroToSelfApp F P = 𝟙 (F.obj X)

tactic: rw [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
⊢ (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) ≫
      (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) =
    𝟙 (F.obj X)

tactic: simp only [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
⊢ 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) ≫
          (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) =
    𝟙 (F.obj X)

tactic: rw [← Category.assoc (F.leftDerivedObjIso 0 P).inv, Iso.inv_hom_id]
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
⊢ 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 ≫
            (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) =
    𝟙 (F.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
⊢ 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)) ≫
            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) =
    𝟙 (F.obj X)

tactic: have : IsIso (cokernel.desc (F.map
  (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
    (F.map (HomologicalComplex.Hom.f P.π 0)) (exact_of_map_projectiveResolution F P).w) :=
  isIso_cokernel_desc_of_exact_of_epi _ _ (exact_of_map_projectiveResolution F P)
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
⊢ 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 ≫
          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) =
    𝟙 (F.obj X)

tactic: rw [IsIso.inv_comp_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
this :
  IsIso
    (cokernel.desc (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.Hom.f P.π 0))
      (_ :
        HomologicalComplex.dTo ((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 ≫
          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) =
    𝟙 (F.obj X)

tactic: simp only [Category.comp_id]
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
this :
  IsIso
    (cokernel.desc (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.Hom.f P.π 0))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 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 ≫
        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) =
    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) ≫
      𝟙 (F.obj X)

tactic: apply coequalizer.hom_ext
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
this :
  IsIso
    (cokernel.desc (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.Hom.f P.π 0))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 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 ≫
        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) =
    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)

tactic: simp only [cokernel.π_desc_assoc, Category.assoc, cokernel.π_desc, homology.desc']
state_before: case 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
this :
  IsIso
    (cokernel.desc (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.Hom.f P.π 0))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
            F.map (HomologicalComplex.Hom.f P.π 0) =
          0))
⊢ coequalizer.π (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 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 ≫
          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) =
    coequalizer.π (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0)) 0 ≫
      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)

tactic: rw [← Category.assoc, ← Category.assoc (homologyIsoCokernelLift _ _ _).inv, Iso.inv_hom_id]
state_before: case 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
this :
  IsIso
    (cokernel.desc (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.Hom.f P.π 0))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
            F.map (HomologicalComplex.Hom.f P.π 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) ≫
      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)) ≫
        (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 ≫
          (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 ≫
            cokernel.desc
              (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.ι (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) =
    F.map (HomologicalComplex.Hom.f P.π 0)

tactic: simp only [Category.assoc, cokernel.π_desc, kernel.lift_ι_assoc, Category.id_comp]
state_before: case 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
this :
  IsIso
    (cokernel.desc (F.map (HomologicalComplex.d P.complex (ComplexShape.prev (ComplexShape.down ℕ) 0) 0))
      (F.map (HomologicalComplex.Hom.f P.π 0))
      (_ :
        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) 0 ≫
            F.map (HomologicalComplex.Hom.f P.π 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) ≫
        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 (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.desc
          (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.ι (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) =
    F.map (HomologicalComplex.Hom.f P.π 0)