Theorem: CategoryTheory.Abelian.Functor.rightDerivedZeroToSelfAppInv_comp
File: Mathlib/CategoryTheory/Abelian/RightDerived.lean

tactic: dsimp [rightDerivedZeroToSelfApp, rightDerivedZeroToSelfAppInv]
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✝¹ : EnoughInjectives C
inst✝ : PreservesFiniteLimits F
X : C
P : InjectiveResolution X
⊢ rightDerivedZeroToSelfAppInv F P ≫ rightDerivedZeroToSelfApp F P = 𝟙 (F.obj X)

tactic: rw [← Category.assoc _ (F.rightDerivedObjIso 0 P).hom,
  Category.assoc _ _ (F.rightDerivedObjIso 0 P).hom, Iso.inv_hom_id, Category.comp_id, ←
  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✝¹ : EnoughInjectives C
inst✝ : PreservesFiniteLimits F
X : C
P : InjectiveResolution X
⊢ (homology.lift (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
          (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
              0)
          (F.map (HomologicalComplex.Hom.f P.ι 0) ≫
            cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)))
          (_ :
            (F.map (HomologicalComplex.Hom.f P.ι 0) ≫
                  cokernel.π
                    (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)) ≫
                cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                  (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                      0) =
              0) ≫
        (rightDerivedObjIso F 0 P).inv) ≫
      (rightDerivedObjIso F 0 P).hom ≫
        (homologyIsoKernelDesc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
              (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                  0)).hom ≫
          kernel.map
              (cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
                (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
                (_ :
                  HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                      HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                    0))
              (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
              (cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
                (𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)))
                (_ :
                  HomologicalComplex.d ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex)
                        (ComplexShape.prev (ComplexShape.up ℕ) 0) 0 ≫
                      𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)) =
                    0))
              (𝟙 (F.obj (HomologicalComplex.X P.cocomplex (ComplexShape.next (ComplexShape.up ℕ) 0))))
              (_ :
                cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                      (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                      (_ :
                        HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                            HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                          0) ≫
                    𝟙 (HomologicalComplex.xNext ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0) =
                  cokernel.desc
                      (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                      (𝟙 (HomologicalComplex.X ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0))
                      (_ :
                        HomologicalComplex.d ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex)
                              (ComplexShape.prev (ComplexShape.up ℕ) 0) 0 ≫
                            𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)) =
                          0) ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0) ≫
            inv
              (kernel.lift (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
                (F.map (HomologicalComplex.Hom.f P.ι 0))
                (_ :
                  F.map (HomologicalComplex.Hom.f P.ι 0) ≫
                      F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)) =
                    0)) =
    𝟙 (F.obj X)

tactic: apply (@IsIso.comp_inv_eq D _ _ _ _ _ ?_ _ _).mpr
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✝¹ : EnoughInjectives C
inst✝ : PreservesFiniteLimits F
X : C
P : InjectiveResolution X
⊢ ((homology.lift (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
            (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                0)
            (F.map (HomologicalComplex.Hom.f P.ι 0) ≫
              cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)))
            (_ :
              (F.map (HomologicalComplex.Hom.f P.ι 0) ≫
                    cokernel.π
                      (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)) ≫
                  cokernel.desc
                    (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                    (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                    (_ :
                      HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                          HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                        0) =
                0) ≫
          (homologyIsoKernelDesc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
              (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                  0)).hom) ≫
        kernel.map
          (cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
            (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                0))
          (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
          (cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
            (𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)))
            (_ :
              HomologicalComplex.d ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex)
                    (ComplexShape.prev (ComplexShape.up ℕ) 0) 0 ≫
                  𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)) =
                0))
          (𝟙 (F.obj (HomologicalComplex.X P.cocomplex (ComplexShape.next (ComplexShape.up ℕ) 0))))
          (_ :
            cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                  (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                      0) ≫
                𝟙 (HomologicalComplex.xNext ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0) =
              cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                  (𝟙 (HomologicalComplex.X ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0))
                  (_ :
                    HomologicalComplex.d ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex)
                          (ComplexShape.prev (ComplexShape.up ℕ) 0) 0 ≫
                        𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)) =
                      0) ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)) ≫
      inv
        (kernel.lift (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
          (F.map (HomologicalComplex.Hom.f P.ι 0))
          (_ :
            F.map (HomologicalComplex.Hom.f P.ι 0) ≫
                F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)) =
              0)) =
    𝟙 (F.obj X)

tactic: rw [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✝¹ : EnoughInjectives C
inst✝ : PreservesFiniteLimits F
X : C
P : InjectiveResolution X
⊢ (homology.lift (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
          (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
              0)
          (F.map (HomologicalComplex.Hom.f P.ι 0) ≫
            cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)))
          (_ :
            (F.map (HomologicalComplex.Hom.f P.ι 0) ≫
                  cokernel.π
                    (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)) ≫
                cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                  (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                      0) =
              0) ≫
        (homologyIsoKernelDesc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
            (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                0)).hom) ≫
      kernel.map
        (cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
          (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
              0))
        (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
        (cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
          (𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)))
          (_ :
            HomologicalComplex.d ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex)
                  (ComplexShape.prev (ComplexShape.up ℕ) 0) 0 ≫
                𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)) =
              0))
        (𝟙 (F.obj (HomologicalComplex.X P.cocomplex (ComplexShape.next (ComplexShape.up ℕ) 0))))
        (_ :
          cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                (_ :
                  HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                      HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                    0) ≫
              𝟙 (HomologicalComplex.xNext ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0) =
            cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                (𝟙 (HomologicalComplex.X ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0))
                (_ :
                  HomologicalComplex.d ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex)
                        (ComplexShape.prev (ComplexShape.up ℕ) 0) 0 ≫
                      𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)) =
                    0) ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0) =
    𝟙 (F.obj X) ≫
      kernel.lift (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
        (F.map (HomologicalComplex.Hom.f P.ι 0))
        (_ :
          F.map (HomologicalComplex.Hom.f P.ι 0) ≫
              F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)) =
            0)

tactic: apply equalizer.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✝¹ : EnoughInjectives C
inst✝ : PreservesFiniteLimits F
X : C
P : InjectiveResolution X
⊢ (homology.lift (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
          (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
              0)
          (F.map (HomologicalComplex.Hom.f P.ι 0) ≫
            cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)))
          (_ :
            (F.map (HomologicalComplex.Hom.f P.ι 0) ≫
                  cokernel.π
                    (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)) ≫
                cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                  (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                      0) =
              0) ≫
        (homologyIsoKernelDesc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
            (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                0)).hom) ≫
      kernel.map
        (cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
          (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
              0))
        (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
        (cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
          (𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)))
          (_ :
            HomologicalComplex.d ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex)
                  (ComplexShape.prev (ComplexShape.up ℕ) 0) 0 ≫
                𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)) =
              0))
        (𝟙 (F.obj (HomologicalComplex.X P.cocomplex (ComplexShape.next (ComplexShape.up ℕ) 0))))
        (_ :
          cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                (_ :
                  HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                      HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                    0) ≫
              𝟙 (HomologicalComplex.xNext ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0) =
            cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                (𝟙 (HomologicalComplex.X ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0))
                (_ :
                  HomologicalComplex.d ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex)
                        (ComplexShape.prev (ComplexShape.up ℕ) 0) 0 ≫
                      𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)) =
                    0) ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0) =
    kernel.lift (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
      (F.map (HomologicalComplex.Hom.f P.ι 0))
      (_ :
        F.map (HomologicalComplex.Hom.f P.ι 0) ≫
            F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)) =
          0)

tactic: simp only [Limits.kernel.lift_ι_assoc,
  Category.assoc, Limits.kernel.lift_ι, homology.lift]
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✝¹ : EnoughInjectives C
inst✝ : PreservesFiniteLimits F
X : C
P : InjectiveResolution X
⊢ ((homology.lift (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
            (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                0)
            (F.map (HomologicalComplex.Hom.f P.ι 0) ≫
              cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)))
            (_ :
              (F.map (HomologicalComplex.Hom.f P.ι 0) ≫
                    cokernel.π
                      (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)) ≫
                  cokernel.desc
                    (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                    (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                    (_ :
                      HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                          HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                        0) =
                0) ≫
          (homologyIsoKernelDesc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
              (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                  0)).hom) ≫
        kernel.map
          (cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
            (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                0))
          (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
          (cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
            (𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)))
            (_ :
              HomologicalComplex.d ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex)
                    (ComplexShape.prev (ComplexShape.up ℕ) 0) 0 ≫
                  𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)) =
                0))
          (𝟙 (F.obj (HomologicalComplex.X P.cocomplex (ComplexShape.next (ComplexShape.up ℕ) 0))))
          (_ :
            cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                  (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                      0) ≫
                𝟙 (HomologicalComplex.xNext ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0) =
              cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                  (𝟙 (HomologicalComplex.X ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0))
                  (_ :
                    HomologicalComplex.d ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex)
                          (ComplexShape.prev (ComplexShape.up ℕ) 0) 0 ≫
                        𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)) =
                      0) ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)) ≫
      equalizer.ι (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0))) 0 =
    kernel.lift (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
        (F.map (HomologicalComplex.Hom.f P.ι 0))
        (_ :
          F.map (HomologicalComplex.Hom.f P.ι 0) ≫
              F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)) =
            0) ≫
      equalizer.ι (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0))) 0

tactic: rw [← Category.assoc, ← Category.assoc,
  Category.assoc _ _ (homologyIsoKernelDesc _ _ _).hom]
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✝¹ : EnoughInjectives C
inst✝ : PreservesFiniteLimits F
X : C
P : InjectiveResolution X
⊢ kernel.lift
        (cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
          (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
              0))
        (F.map (HomologicalComplex.Hom.f P.ι 0) ≫
          cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)))
        (_ :
          (F.map (HomologicalComplex.Hom.f P.ι 0) ≫
                cokernel.π (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)) ≫
              cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                (_ :
                  HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                      HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                    0) =
            0) ≫
      (homologyIsoKernelDesc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
            (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                0)).inv ≫
        (homologyIsoKernelDesc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
              (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                  0)).hom ≫
          kernel.ι
              (cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
                (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
                (_ :
                  HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                      HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                    0)) ≫
            cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
              (𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)))
              (_ :
                HomologicalComplex.d ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex)
                      (ComplexShape.prev (ComplexShape.up ℕ) 0) 0 ≫
                    𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)) =
                  0) =
    F.map (HomologicalComplex.Hom.f P.ι 0)

tactic: simp
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✝¹ : EnoughInjectives C
inst✝ : PreservesFiniteLimits F
X : C
P : InjectiveResolution X
⊢ (kernel.lift
          (cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
            (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                0))
          (F.map (HomologicalComplex.Hom.f P.ι 0) ≫
            cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)))
          (_ :
            (F.map (HomologicalComplex.Hom.f P.ι 0) ≫
                  cokernel.π
                    (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)) ≫
                cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                  (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                      0) =
              0) ≫
        (homologyIsoKernelDesc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
              (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                  0)).inv ≫
          (homologyIsoKernelDesc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
              (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
              (_ :
                HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                    HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                  0)).hom) ≫
      kernel.ι
          (cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
            (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
            (_ :
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                  HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
                0)) ≫
        cokernel.desc (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
          (𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)))
          (_ :
            HomologicalComplex.d ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex)
                  (ComplexShape.prev (ComplexShape.up ℕ) 0) 0 ≫
                𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)) =
              0) =
    F.map (HomologicalComplex.Hom.f P.ι 0)

tactic: apply isIso_kernel_lift_of_exact_of_mono _ _ (exact_of_map_injectiveResolution 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✝¹ : EnoughInjectives C
inst✝ : PreservesFiniteLimits F
X : C
P : InjectiveResolution X
⊢ IsIso
    (kernel.lift (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
      (F.map (HomologicalComplex.Hom.f P.ι 0))
      (_ :
        F.map (HomologicalComplex.Hom.f P.ι 0) ≫
            F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)) =
          0))