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

tactic: dsimp [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
X Y : C
f : X ⟶ Y
P : InjectiveResolution X
Q : InjectiveResolution Y
⊢ F.map f ≫ rightDerivedZeroToSelfAppInv F Q = rightDerivedZeroToSelfAppInv F P ≫ (rightDerived F 0).map f

tactic: simp only [CategoryTheory.Functor.map_id, Category.id_comp, ← 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
X Y : C
f : X ⟶ Y
P : InjectiveResolution X
Q : InjectiveResolution Y
⊢ F.map f ≫
      homology.lift (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
          (F.map (HomologicalComplex.d Q.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 =
              0)
          (F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
            cokernel.π (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)))
          (_ :
            (F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
                  cokernel.π
                    (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)) ≫
                cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)
                  (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 =
                      0) =
              0) ≫
        (rightDerivedObjIso F 0 Q).inv =
    (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).map f

tactic: rw [Iso.comp_inv_eq, rightDerived_map_eq F 0 f (InjectiveResolution.desc f Q P) (by simp),
  Category.assoc, Category.assoc, Category.assoc, Category.assoc, Iso.inv_hom_id,
  Category.comp_id, ← Category.assoc (F.rightDerivedObjIso 0 P).inv, Iso.inv_hom_id,
  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
X Y : C
f : X ⟶ Y
P : InjectiveResolution X
Q : InjectiveResolution Y
⊢ (F.map f ≫
        homology.lift (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
          (F.map (HomologicalComplex.d Q.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 =
              0)
          (F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
            cokernel.π (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)))
          (_ :
            (F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
                  cokernel.π
                    (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)) ≫
                cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)
                  (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 =
                      0) =
              0)) ≫
      (rightDerivedObjIso F 0 Q).inv =
    (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).map f

tactic: dsimp only [homologyFunctor_map]
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
X Y : C
f : X ⟶ Y
P : InjectiveResolution X
Q : InjectiveResolution Y
⊢ F.map f ≫
      homology.lift (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
        (F.map (HomologicalComplex.d Q.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 =
            0)
        (F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
          cokernel.π (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)))
        (_ :
          (F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
                cokernel.π (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)) ≫
              cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)
                (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)
                (_ :
                  HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
                      HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 =
                    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) ≫
      (homologyFunctor D (ComplexShape.up ℕ) 0).map
        ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P))

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
X Y : C
f : X ⟶ Y
P : InjectiveResolution X
Q : InjectiveResolution Y
⊢ F.map f ≫
      homology.lift (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
        (F.map (HomologicalComplex.d Q.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 =
            0)
        (F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
          cokernel.π (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)))
        (_ :
          (F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
                cokernel.π (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)) ≫
              cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)
                (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)
                (_ :
                  HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
                      HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 =
                    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.map
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
            0)
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 =
            0)
        (HomologicalComplex.Hom.sqTo
          ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0)
        (HomologicalComplex.Hom.sqFrom
          ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0)
        (_ :
          (HomologicalComplex.Hom.sqTo
                ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).right =
            (HomologicalComplex.Hom.sqTo
                ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).right)

tactic: rw [Category.assoc, homology.lift_ι, Category.assoc]
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
X Y : C
f : X ⟶ Y
P : InjectiveResolution X
Q : InjectiveResolution Y
⊢ (F.map f ≫
        homology.lift (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
          (F.map (HomologicalComplex.d Q.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 =
              0)
          (F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
            cokernel.π (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)))
          (_ :
            (F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
                  cokernel.π
                    (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)) ≫
                cokernel.desc (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)
                  (HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)
                  (_ :
                    HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
                        HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 =
                      0) =
              0)) ≫
      homology.ι (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
        (F.map (HomologicalComplex.d Q.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 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.map
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
              0)
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 =
              0)
          (HomologicalComplex.Hom.sqTo
            ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0)
          (HomologicalComplex.Hom.sqFrom
            ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0)
          (_ :
            (HomologicalComplex.Hom.sqTo
                  ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).right =
              (HomologicalComplex.Hom.sqTo
                  ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).right)) ≫
      homology.ι (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
        (F.map (HomologicalComplex.d Q.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
              HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 =
            0)

tactic: erw [homology.map_ι]
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
X Y : C
f : X ⟶ Y
P : InjectiveResolution X
Q : InjectiveResolution Y
⊢ F.map f ≫
      F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
        cokernel.π (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (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.map
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 =
              0)
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 =
              0)
          (HomologicalComplex.Hom.sqTo
            ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0)
          (HomologicalComplex.Hom.sqFrom
            ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0)
          (_ :
            (HomologicalComplex.Hom.sqTo
                  ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).right =
              (HomologicalComplex.Hom.sqTo
                  ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).right) ≫
        homology.ι (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))
          (F.map (HomologicalComplex.d Q.cocomplex 0 (ComplexShape.next (ComplexShape.up ℕ) 0)))
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0 =
              0)

tactic: rw [←Category.assoc (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
X Y : C
f : X ⟶ Y
P : InjectiveResolution X
Q : InjectiveResolution Y
⊢ F.map f ≫
      F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
        cokernel.π (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (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.ι (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) ≫
        cokernel.map (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
          (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)
          (HomologicalComplex.Hom.sqTo
              ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left
          (HomologicalComplex.Hom.sqFrom
              ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                (HomologicalComplex.Hom.sqFrom
                    ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left =
              (HomologicalComplex.Hom.sqTo
                    ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left ≫
                HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)

tactic: erw [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
X Y : C
f : X ⟶ Y
P : InjectiveResolution X
Q : InjectiveResolution Y
⊢ F.map f ≫
      F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
        cokernel.π (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (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.ι (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)) ≫
      cokernel.map (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
        (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)
        (HomologicalComplex.Hom.sqTo
            ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left
        (HomologicalComplex.Hom.sqFrom
            ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
              (HomologicalComplex.Hom.sqFrom
                  ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left =
            (HomologicalComplex.Hom.sqTo
                  ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left ≫
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)

tactic: rw [Category.assoc]
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
X Y : C
f : X ⟶ Y
P : InjectiveResolution X
Q : InjectiveResolution Y
⊢ F.map f ≫
      F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
        cokernel.π (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)) =
    (F.map (HomologicalComplex.Hom.f P.ι 0) ≫
        cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0))) ≫
      cokernel.map (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
        (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)
        (HomologicalComplex.Hom.sqTo
            ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left
        (HomologicalComplex.Hom.sqFrom
            ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left
        (_ :
          HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
              (HomologicalComplex.Hom.sqFrom
                  ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left =
            (HomologicalComplex.Hom.sqTo
                  ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left ≫
              HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)

tactic: erw [cokernel.π_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✝ : EnoughInjectives C
X Y : C
f : X ⟶ Y
P : InjectiveResolution X
Q : InjectiveResolution Y
⊢ F.map f ≫
      F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
        cokernel.π (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)) =
    F.map (HomologicalComplex.Hom.f P.ι 0) ≫
      cokernel.π (F.map (HomologicalComplex.d P.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)) ≫
        cokernel.map (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0)
          (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)
          (HomologicalComplex.Hom.sqTo
              ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left
          (HomologicalComplex.Hom.sqFrom
              ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj P.cocomplex) 0 ≫
                (HomologicalComplex.Hom.sqFrom
                    ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left =
              (HomologicalComplex.Hom.sqTo
                    ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left ≫
                HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)

tactic: rw [← Category.assoc, ← Functor.map_comp, ← Category.assoc,
  HomologicalComplex.Hom.sqFrom_left, mapHomologicalComplex_map_f, ← Functor.map_comp,
  show f ≫ Q.ι.f 0 = P.ι.f 0 ≫ (InjectiveResolution.desc f Q P).f 0 from
    HomologicalComplex.congr_hom (InjectiveResolution.desc_commutes f Q P).symm 0]
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
X Y : C
f : X ⟶ Y
P : InjectiveResolution X
Q : InjectiveResolution Y
⊢ F.map f ≫
      F.map (HomologicalComplex.Hom.f Q.ι 0) ≫
        cokernel.π (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)) =
    F.map (HomologicalComplex.Hom.f P.ι 0) ≫
      (HomologicalComplex.Hom.sqFrom
            ((mapHomologicalComplex F (ComplexShape.up ℕ)).map (InjectiveResolution.desc f Q P)) 0).left ≫
        cokernel.π (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)

tactic: rfl
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
X Y : C
f : X ⟶ Y
P : InjectiveResolution X
Q : InjectiveResolution Y
⊢ F.map (HomologicalComplex.Hom.f P.ι 0 ≫ HomologicalComplex.Hom.f (InjectiveResolution.desc f Q P) 0) ≫
      cokernel.π (F.map (HomologicalComplex.d Q.cocomplex (ComplexShape.prev (ComplexShape.up ℕ) 0) 0)) =
    F.map (HomologicalComplex.Hom.f P.ι 0 ≫ HomologicalComplex.Hom.f (InjectiveResolution.desc f Q P) 0) ≫
      cokernel.π (HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.up ℕ)).obj Q.cocomplex) 0)

tactic: simp
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
X Y : C
f : X ⟶ Y
P : InjectiveResolution X
Q : InjectiveResolution Y
⊢ P.ι ≫ InjectiveResolution.desc f Q P = (CochainComplex.single₀ C).map f ≫ Q.ι