Theorem: CategoryTheory.Functor.leftDerived_map_eq
File: Mathlib/CategoryTheory/Functor/LeftDerived.lean

tactic: dsimp only [Functor.leftDerived, Functor.leftDerivedObjIso]
state_before: C : Type u
inst✝¹² : Category C
D : Type u_2
inst✝¹¹ : Category D
inst✝¹⁰ : Preadditive C
inst✝⁹ : HasZeroObject C
inst✝⁸ : HasEqualizers C
inst✝⁷ : HasImages C
inst✝⁶ : HasProjectiveResolutions C
inst✝⁵ : Preadditive D
inst✝⁴ : HasEqualizers D
inst✝³ : HasCokernels D
inst✝² : HasImages D
inst✝¹ : HasImageMaps D
F : C ⥤ D
inst✝ : Additive F
n : ℕ
X Y : C
f : X ⟶ Y
P : ProjectiveResolution X
Q : ProjectiveResolution Y
g : P.complex ⟶ Q.complex
w : g ≫ Q.π = P.π ≫ (ChainComplex.single₀ C).map f
⊢ (leftDerived F n).map f =
    (leftDerivedObjIso F n P).hom ≫
      (homologyFunctor D (ComplexShape.down ℕ) n).map ((mapHomologicalComplex F (ComplexShape.down ℕ)).map g) ≫
        (leftDerivedObjIso F n Q).inv

tactic: dsimp
state_before: C : Type u
inst✝¹² : Category C
D : Type u_2
inst✝¹¹ : Category D
inst✝¹⁰ : Preadditive C
inst✝⁹ : HasZeroObject C
inst✝⁸ : HasEqualizers C
inst✝⁷ : HasImages C
inst✝⁶ : HasProjectiveResolutions C
inst✝⁵ : Preadditive D
inst✝⁴ : HasEqualizers D
inst✝³ : HasCokernels D
inst✝² : HasImages D
inst✝¹ : HasImageMaps D
F : C ⥤ D
inst✝ : Additive F
n : ℕ
X Y : C
f : X ⟶ Y
P : ProjectiveResolution X
Q : ProjectiveResolution Y
g : P.complex ⟶ Q.complex
w : g ≫ Q.π = P.π ≫ (ChainComplex.single₀ C).map f
⊢ (projectiveResolutions C ⋙
          mapHomotopyCategory F (ComplexShape.down ℕ) ⋙ HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
      f =
    ((HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).mapIso
            (HomotopyCategory.isoOfHomotopyEquiv
              (mapHomotopyEquiv F (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P))) ≪≫
          (HomotopyCategory.homologyFactors D (ComplexShape.down ℕ) n).app
            ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)).hom ≫
      (homologyFunctor D (ComplexShape.down ℕ) n).map ((mapHomologicalComplex F (ComplexShape.down ℕ)).map g) ≫
        ((HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).mapIso
              (HomotopyCategory.isoOfHomotopyEquiv
                (mapHomotopyEquiv F (ProjectiveResolution.homotopyEquiv (projectiveResolution Y) Q))) ≪≫
            (HomotopyCategory.homologyFactors D (ComplexShape.down ℕ) n).app
              ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj Q.complex)).inv

tactic: simp only [Category.comp_id, Category.id_comp]
state_before: C : Type u
inst✝¹² : Category C
D : Type u_2
inst✝¹¹ : Category D
inst✝¹⁰ : Preadditive C
inst✝⁹ : HasZeroObject C
inst✝⁸ : HasEqualizers C
inst✝⁷ : HasImages C
inst✝⁶ : HasProjectiveResolutions C
inst✝⁵ : Preadditive D
inst✝⁴ : HasEqualizers D
inst✝³ : HasCokernels D
inst✝² : HasImages D
inst✝¹ : HasImageMaps D
F : C ⥤ D
inst✝ : Additive F
n : ℕ
X Y : C
f : X ⟶ Y
P : ProjectiveResolution X
Q : ProjectiveResolution Y
g : P.complex ⟶ Q.complex
w : g ≫ Q.π = P.π ≫ (ChainComplex.single₀ C).map f
⊢ (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
      ((mapHomotopyCategory F (ComplexShape.down ℕ)).map ((projectiveResolutions C).map f)) =
    ((HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
          ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
            ((mapHomologicalComplex F (ComplexShape.down ℕ)).map
              (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom)) ≫
        𝟙
          ((HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).obj
            ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).obj
              ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)))) ≫
      homology.map
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) n ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) n =
              0)
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj Q.complex) n ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj Q.complex) n =
              0)
          (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).map g) n)
          (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).map g) n)
          (_ :
            (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).map g) n).right =
              (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).map g) n).right) ≫
        𝟙 (HomologicalComplex.homology ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj Q.complex) n) ≫
          (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
            ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
              ((mapHomologicalComplex F (ComplexShape.down ℕ)).map
                (ProjectiveResolution.homotopyEquiv (projectiveResolution Y) Q).inv))

tactic: rw [← homologyFunctor_map, HomotopyCategory.homologyFunctor_map_factors]
state_before: C : Type u
inst✝¹² : Category C
D : Type u_2
inst✝¹¹ : Category D
inst✝¹⁰ : Preadditive C
inst✝⁹ : HasZeroObject C
inst✝⁸ : HasEqualizers C
inst✝⁷ : HasImages C
inst✝⁶ : HasProjectiveResolutions C
inst✝⁵ : Preadditive D
inst✝⁴ : HasEqualizers D
inst✝³ : HasCokernels D
inst✝² : HasImages D
inst✝¹ : HasImageMaps D
F : C ⥤ D
inst✝ : Additive F
n : ℕ
X Y : C
f : X ⟶ Y
P : ProjectiveResolution X
Q : ProjectiveResolution Y
g : P.complex ⟶ Q.complex
w : g ≫ Q.π = P.π ≫ (ChainComplex.single₀ C).map f
⊢ (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
      ((mapHomotopyCategory F (ComplexShape.down ℕ)).map ((projectiveResolutions C).map f)) =
    (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
        ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
          ((mapHomologicalComplex F (ComplexShape.down ℕ)).map
            (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom)) ≫
      homology.map
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) n ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) n =
              0)
          (_ :
            HomologicalComplex.dTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj Q.complex) n ≫
                HomologicalComplex.dFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).obj Q.complex) n =
              0)
          (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).map g) n)
          (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex F (ComplexShape.down ℕ)).map g) n)
          (_ :
            (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).map g) n).right =
              (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex F (ComplexShape.down ℕ)).map g) n).right) ≫
        (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
          ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
            ((mapHomologicalComplex F (ComplexShape.down ℕ)).map
              (ProjectiveResolution.homotopyEquiv (projectiveResolution Y) Q).inv))

tactic: simp only [← Functor.map_comp]
state_before: C : Type u
inst✝¹² : Category C
D : Type u_2
inst✝¹¹ : Category D
inst✝¹⁰ : Preadditive C
inst✝⁹ : HasZeroObject C
inst✝⁸ : HasEqualizers C
inst✝⁷ : HasImages C
inst✝⁶ : HasProjectiveResolutions C
inst✝⁵ : Preadditive D
inst✝⁴ : HasEqualizers D
inst✝³ : HasCokernels D
inst✝² : HasImages D
inst✝¹ : HasImageMaps D
F : C ⥤ D
inst✝ : Additive F
n : ℕ
X Y : C
f : X ⟶ Y
P : ProjectiveResolution X
Q : ProjectiveResolution Y
g : P.complex ⟶ Q.complex
w : g ≫ Q.π = P.π ≫ (ChainComplex.single₀ C).map f
⊢ (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
      ((mapHomotopyCategory F (ComplexShape.down ℕ)).map ((projectiveResolutions C).map f)) =
    (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
        ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
          ((mapHomologicalComplex F (ComplexShape.down ℕ)).map
            (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom)) ≫
      (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
          ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
            ((mapHomologicalComplex F (ComplexShape.down ℕ)).map g)) ≫
        (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
          ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
            ((mapHomologicalComplex F (ComplexShape.down ℕ)).map
              (ProjectiveResolution.homotopyEquiv (projectiveResolution Y) Q).inv))

tactic: congr 1
state_before: C : Type u
inst✝¹² : Category C
D : Type u_2
inst✝¹¹ : Category D
inst✝¹⁰ : Preadditive C
inst✝⁹ : HasZeroObject C
inst✝⁸ : HasEqualizers C
inst✝⁷ : HasImages C
inst✝⁶ : HasProjectiveResolutions C
inst✝⁵ : Preadditive D
inst✝⁴ : HasEqualizers D
inst✝³ : HasCokernels D
inst✝² : HasImages D
inst✝¹ : HasImageMaps D
F : C ⥤ D
inst✝ : Additive F
n : ℕ
X Y : C
f : X ⟶ Y
P : ProjectiveResolution X
Q : ProjectiveResolution Y
g : P.complex ⟶ Q.complex
w : g ≫ Q.π = P.π ≫ (ChainComplex.single₀ C).map f
⊢ (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
      ((mapHomotopyCategory F (ComplexShape.down ℕ)).map ((projectiveResolutions C).map f)) =
    (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
      ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
        ((mapHomologicalComplex F (ComplexShape.down ℕ)).map
          ((ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom ≫
            g ≫ (ProjectiveResolution.homotopyEquiv (projectiveResolution Y) Q).inv)))

tactic: apply HomotopyCategory.eq_of_homotopy
state_before: case e_a
C : Type u
inst✝¹² : Category C
D : Type u_2
inst✝¹¹ : Category D
inst✝¹⁰ : Preadditive C
inst✝⁹ : HasZeroObject C
inst✝⁸ : HasEqualizers C
inst✝⁷ : HasImages C
inst✝⁶ : HasProjectiveResolutions C
inst✝⁵ : Preadditive D
inst✝⁴ : HasEqualizers D
inst✝³ : HasCokernels D
inst✝² : HasImages D
inst✝¹ : HasImageMaps D
F : C ⥤ D
inst✝ : Additive F
n : ℕ
X Y : C
f : X ⟶ Y
P : ProjectiveResolution X
Q : ProjectiveResolution Y
g : P.complex ⟶ Q.complex
w : g ≫ Q.π = P.π ≫ (ChainComplex.single₀ C).map f
⊢ (mapHomotopyCategory F (ComplexShape.down ℕ)).map ((projectiveResolutions C).map f) =
    (HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
      ((mapHomologicalComplex F (ComplexShape.down ℕ)).map
        ((ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom ≫
          g ≫ (ProjectiveResolution.homotopyEquiv (projectiveResolution Y) Q).inv))

tactic: apply Functor.mapHomotopy
state_before: case e_a.h
C : Type u
inst✝¹² : Category C
D : Type u_2
inst✝¹¹ : Category D
inst✝¹⁰ : Preadditive C
inst✝⁹ : HasZeroObject C
inst✝⁸ : HasEqualizers C
inst✝⁷ : HasImages C
inst✝⁶ : HasProjectiveResolutions C
inst✝⁵ : Preadditive D
inst✝⁴ : HasEqualizers D
inst✝³ : HasCokernels D
inst✝² : HasImages D
inst✝¹ : HasImageMaps D
F : C ⥤ D
inst✝ : Additive F
n : ℕ
X Y : C
f : X ⟶ Y
P : ProjectiveResolution X
Q : ProjectiveResolution Y
g : P.complex ⟶ Q.complex
w : g ≫ Q.π = P.π ≫ (ChainComplex.single₀ C).map f
⊢ Homotopy ((mapHomologicalComplex F (ComplexShape.down ℕ)).map (projectiveResolution.lift f))
    ((mapHomologicalComplex F (ComplexShape.down ℕ)).map
      ((ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom ≫
        g ≫ (ProjectiveResolution.homotopyEquiv (projectiveResolution Y) Q).inv))

tactic: apply ProjectiveResolution.liftHomotopy f
state_before: case e_a.h.h
C : Type u
inst✝¹² : Category C
D : Type u_2
inst✝¹¹ : Category D
inst✝¹⁰ : Preadditive C
inst✝⁹ : HasZeroObject C
inst✝⁸ : HasEqualizers C
inst✝⁷ : HasImages C
inst✝⁶ : HasProjectiveResolutions C
inst✝⁵ : Preadditive D
inst✝⁴ : HasEqualizers D
inst✝³ : HasCokernels D
inst✝² : HasImages D
inst✝¹ : HasImageMaps D
F : C ⥤ D
inst✝ : Additive F
n : ℕ
X Y : C
f : X ⟶ Y
P : ProjectiveResolution X
Q : ProjectiveResolution Y
g : P.complex ⟶ Q.complex
w : g ≫ Q.π = P.π ≫ (ChainComplex.single₀ C).map f
⊢ Homotopy (projectiveResolution.lift f)
    ((ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom ≫
      g ≫ (ProjectiveResolution.homotopyEquiv (projectiveResolution Y) Q).inv)

tactic: . simp
state_before: case e_a.h.h.g_comm
C : Type u
inst✝¹² : Category C
D : Type u_2
inst✝¹¹ : Category D
inst✝¹⁰ : Preadditive C
inst✝⁹ : HasZeroObject C
inst✝⁸ : HasEqualizers C
inst✝⁷ : HasImages C
inst✝⁶ : HasProjectiveResolutions C
inst✝⁵ : Preadditive D
inst✝⁴ : HasEqualizers D
inst✝³ : HasCokernels D
inst✝² : HasImages D
inst✝¹ : HasImageMaps D
F : C ⥤ D
inst✝ : Additive F
n : ℕ
X Y : C
f : X ⟶ Y
P : ProjectiveResolution X
Q : ProjectiveResolution Y
g : P.complex ⟶ Q.complex
w : g ≫ Q.π = P.π ≫ (ChainComplex.single₀ C).map f
⊢ projectiveResolution.lift f ≫ (projectiveResolution Y).π = (projectiveResolution X).π ≫ (ChainComplex.single₀ C).map f

case e_a.h.h.h_comm
C : Type u
inst✝¹² : Category C
D : Type u_2
inst✝¹¹ : Category D
inst✝¹⁰ : Preadditive C
inst✝⁹ : HasZeroObject C
inst✝⁸ : HasEqualizers C
inst✝⁷ : HasImages C
inst✝⁶ : HasProjectiveResolutions C
inst✝⁵ : Preadditive D
inst✝⁴ : HasEqualizers D
inst✝³ : HasCokernels D
inst✝² : HasImages D
inst✝¹ : HasImageMaps D
F : C ⥤ D
inst✝ : Additive F
n : ℕ
X Y : C
f : X ⟶ Y
P : ProjectiveResolution X
Q : ProjectiveResolution Y
g : P.complex ⟶ Q.complex
w : g ≫ Q.π = P.π ≫ (ChainComplex.single₀ C).map f
⊢ ((ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom ≫
        g ≫ (ProjectiveResolution.homotopyEquiv (projectiveResolution Y) Q).inv) ≫
      (projectiveResolution Y).π =
    (projectiveResolution X).π ≫ (ChainComplex.single₀ C).map f

tactic: . simp [w]
state_before: case e_a.h.h.h_comm
C : Type u
inst✝¹² : Category C
D : Type u_2
inst✝¹¹ : Category D
inst✝¹⁰ : Preadditive C
inst✝⁹ : HasZeroObject C
inst✝⁸ : HasEqualizers C
inst✝⁷ : HasImages C
inst✝⁶ : HasProjectiveResolutions C
inst✝⁵ : Preadditive D
inst✝⁴ : HasEqualizers D
inst✝³ : HasCokernels D
inst✝² : HasImages D
inst✝¹ : HasImageMaps D
F : C ⥤ D
inst✝ : Additive F
n : ℕ
X Y : C
f : X ⟶ Y
P : ProjectiveResolution X
Q : ProjectiveResolution Y
g : P.complex ⟶ Q.complex
w : g ≫ Q.π = P.π ≫ (ChainComplex.single₀ C).map f
⊢ ((ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom ≫
        g ≫ (ProjectiveResolution.homotopyEquiv (projectiveResolution Y) Q).inv) ≫
      (projectiveResolution Y).π =
    (projectiveResolution X).π ≫ (ChainComplex.single₀ C).map f

tactic: simp
state_before: case e_a.h.h.g_comm
C : Type u
inst✝¹² : Category C
D : Type u_2
inst✝¹¹ : Category D
inst✝¹⁰ : Preadditive C
inst✝⁹ : HasZeroObject C
inst✝⁸ : HasEqualizers C
inst✝⁷ : HasImages C
inst✝⁶ : HasProjectiveResolutions C
inst✝⁵ : Preadditive D
inst✝⁴ : HasEqualizers D
inst✝³ : HasCokernels D
inst✝² : HasImages D
inst✝¹ : HasImageMaps D
F : C ⥤ D
inst✝ : Additive F
n : ℕ
X Y : C
f : X ⟶ Y
P : ProjectiveResolution X
Q : ProjectiveResolution Y
g : P.complex ⟶ Q.complex
w : g ≫ Q.π = P.π ≫ (ChainComplex.single₀ C).map f
⊢ projectiveResolution.lift f ≫ (projectiveResolution Y).π = (projectiveResolution X).π ≫ (ChainComplex.single₀ C).map f

tactic: simp [w]
state_before: case e_a.h.h.h_comm
C : Type u
inst✝¹² : Category C
D : Type u_2
inst✝¹¹ : Category D
inst✝¹⁰ : Preadditive C
inst✝⁹ : HasZeroObject C
inst✝⁸ : HasEqualizers C
inst✝⁷ : HasImages C
inst✝⁶ : HasProjectiveResolutions C
inst✝⁵ : Preadditive D
inst✝⁴ : HasEqualizers D
inst✝³ : HasCokernels D
inst✝² : HasImages D
inst✝¹ : HasImageMaps D
F : C ⥤ D
inst✝ : Additive F
n : ℕ
X Y : C
f : X ⟶ Y
P : ProjectiveResolution X
Q : ProjectiveResolution Y
g : P.complex ⟶ Q.complex
w : g ≫ Q.π = P.π ≫ (ChainComplex.single₀ C).map f
⊢ ((ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom ≫
        g ≫ (ProjectiveResolution.homotopyEquiv (projectiveResolution Y) Q).inv) ≫
      (projectiveResolution Y).π =
    (projectiveResolution X).π ≫ (ChainComplex.single₀ C).map f