Theorem: CategoryTheory.Abelian.Functor.rightDerivedZeroToSelfApp_comp_inv
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
⊢ rightDerivedZeroToSelfApp F P ≫ rightDerivedZeroToSelfAppInv F P = 𝟙 ((rightDerived F 0).obj X)

tactic: rw [← Category.assoc, Iso.comp_inv_eq, Category.id_comp, Category.assoc, Category.assoc, ←
  Iso.eq_inv_comp, 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✝¹ : EnoughInjectives C
inst✝ : PreservesFiniteLimits F
X : C
P : InjectiveResolution X
⊢ ((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))) ≫
      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 =
    𝟙 ((rightDerived F 0).obj X)

tactic: apply homology.hom_to_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
⊢ (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))) ≫
        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) =
    𝟙 (HomologicalComplex.homology ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)

tactic: apply homology.hom_from_ext
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
⊢ ((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))) ≫
          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)) ≫
      homology.ι (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) =
    𝟙 (HomologicalComplex.homology ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0) ≫
      homology.ι (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)

tactic: rw [Category.assoc, Category.assoc, homology.lift_ι, Category.id_comp]
state_before: case 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✝¹ : EnoughInjectives C
inst✝ : PreservesFiniteLimits F
X : C
P : InjectiveResolution X
⊢ homology.π' (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) ≫
      ((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))) ≫
            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)) ≫
        homology.ι (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) =
    homology.π' (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.homology ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0) ≫
        homology.ι (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)

tactic: erw [homology.π'_ι]
state_before: case 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✝¹ : EnoughInjectives C
inst✝ : PreservesFiniteLimits F
X : C
P : InjectiveResolution X
⊢ homology.π' (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) ≫
      (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.map (HomologicalComplex.Hom.f P.ι 0) ≫
            cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)) =
    homology.π' (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) ≫
      homology.ι (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)

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

tactic: erw [homology.π'_ι]
state_before: case 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✝¹ : EnoughInjectives C
inst✝ : PreservesFiniteLimits F
X : C
P : InjectiveResolution X
⊢ (homology.π' (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) ≫
        homology.ι (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) ≫
        cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)) =
    kernel.ι (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0) ≫
      cokernel.π (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)

case h.h.ex
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
⊢ Exact (F.map (HomologicalComplex.Hom.f P.ι 0))
    (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))

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

case h.h.ex
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
⊢ Exact (F.map (HomologicalComplex.Hom.f P.ι 0))
    (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))

tactic: erw [cokernel.π_desc]
state_before: case 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✝¹ : EnoughInjectives C
inst✝ : PreservesFiniteLimits F
X : C
P : InjectiveResolution X
⊢ kernel.ι (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0) ≫
      (cokernel.π (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 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)) ≫
        cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)) =
    kernel.ι (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0) ≫
      cokernel.π (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)

case h.h.ex
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
⊢ Exact (F.map (HomologicalComplex.Hom.f P.ι 0))
    (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))

tactic: rw [whisker_eq]
state_before: case 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✝¹ : EnoughInjectives C
inst✝ : PreservesFiniteLimits F
X : C
P : InjectiveResolution X
⊢ kernel.ι (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0) ≫
      𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)) ≫
        cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)) =
    kernel.ι (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0) ≫
      cokernel.π (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)

case h.h.ex
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
⊢ Exact (F.map (HomologicalComplex.Hom.f P.ι 0))
    (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))

tactic: dsimp
state_before: case h.h.w
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
⊢ 𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)) ≫
      cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)) =
    cokernel.π (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)

case h.h.ex
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
⊢ Exact (F.map (HomologicalComplex.Hom.f P.ι 0))
    (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))

tactic: simp
state_before: case h.h.w
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
⊢ 𝟙 (F.obj (HomologicalComplex.X P.cocomplex 0)) ≫
      cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)) =
    cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))

case h.h.ex
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
⊢ Exact (F.map (HomologicalComplex.Hom.f P.ι 0))
    (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))

tactic: apply exact_of_map_injectiveResolution
state_before: case h.h.ex
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
⊢ Exact (F.map (HomologicalComplex.Hom.f P.ι 0))
    (F.map (HomologicalComplex.d P.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))