Theorem: CategoryTheory.NatTrans.leftDerived_eq
File: Mathlib/CategoryTheory/Functor/LeftDerived.lean

tactic: symm
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 G : C ⥤ D
inst✝¹ : Functor.Additive F
inst✝ : Functor.Additive G
α : F ⟶ G
n : ℕ
X : C
P : ProjectiveResolution X
⊢ (leftDerived α n).app X =
    (Functor.leftDerivedObjIso F n P).hom ≫
      (homologyFunctor D (ComplexShape.down ℕ) n).map ((mapHomologicalComplex α (ComplexShape.down ℕ)).app P.complex) ≫
        (Functor.leftDerivedObjIso G n P).inv

tactic: dsimp [NatTrans.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 G : C ⥤ D
inst✝¹ : Functor.Additive F
inst✝ : Functor.Additive G
α : F ⟶ G
n : ℕ
X : C
P : ProjectiveResolution X
⊢ (Functor.leftDerivedObjIso F n P).hom ≫
      (homologyFunctor D (ComplexShape.down ℕ) n).map ((mapHomologicalComplex α (ComplexShape.down ℕ)).app P.complex) ≫
        (Functor.leftDerivedObjIso G n P).inv =
    (leftDerived α n).app X

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 G : C ⥤ D
inst✝¹ : Functor.Additive F
inst✝ : Functor.Additive G
α : F ⟶ G
n : ℕ
X : C
P : ProjectiveResolution X
⊢ ((HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
          ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
            ((Functor.mapHomologicalComplex F (ComplexShape.down ℕ)).map
              (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom)) ≫
        𝟙
          ((HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).obj
            ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).obj
              ((Functor.mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex)))) ≫
      homology.map
          (_ :
            HomologicalComplex.dTo ((Functor.mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) n ≫
                HomologicalComplex.dFrom ((Functor.mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) n =
              0)
          (_ :
            HomologicalComplex.dTo ((Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).obj P.complex) n ≫
                HomologicalComplex.dFrom ((Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).obj P.complex) n =
              0)
          (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex α (ComplexShape.down ℕ)).app P.complex) n)
          (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex α (ComplexShape.down ℕ)).app P.complex) n)
          (_ :
            (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex α (ComplexShape.down ℕ)).app P.complex) n).right =
              (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex α (ComplexShape.down ℕ)).app P.complex) n).right) ≫
        𝟙 (HomologicalComplex.homology ((Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).obj P.complex) n) ≫
          (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
            ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
              ((Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).map
                (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).inv)) =
    (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
      ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
        ((mapHomologicalComplex α (ComplexShape.down ℕ)).app ((projectiveResolutions C).obj X).as))

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 G : C ⥤ D
inst✝¹ : Functor.Additive F
inst✝ : Functor.Additive G
α : F ⟶ G
n : ℕ
X : C
P : ProjectiveResolution X
⊢ (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
        ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
          ((Functor.mapHomologicalComplex F (ComplexShape.down ℕ)).map
            (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom)) ≫
      homology.map
          (_ :
            HomologicalComplex.dTo ((Functor.mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) n ≫
                HomologicalComplex.dFrom ((Functor.mapHomologicalComplex F (ComplexShape.down ℕ)).obj P.complex) n =
              0)
          (_ :
            HomologicalComplex.dTo ((Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).obj P.complex) n ≫
                HomologicalComplex.dFrom ((Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).obj P.complex) n =
              0)
          (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex α (ComplexShape.down ℕ)).app P.complex) n)
          (HomologicalComplex.Hom.sqFrom ((mapHomologicalComplex α (ComplexShape.down ℕ)).app P.complex) n)
          (_ :
            (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex α (ComplexShape.down ℕ)).app P.complex) n).right =
              (HomologicalComplex.Hom.sqTo ((mapHomologicalComplex α (ComplexShape.down ℕ)).app P.complex) n).right) ≫
        (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
          ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
            ((Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).map
              (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).inv)) =
    (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
      ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
        ((mapHomologicalComplex α (ComplexShape.down ℕ)).app ((projectiveResolutions C).obj X).as))

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 G : C ⥤ D
inst✝¹ : Functor.Additive F
inst✝ : Functor.Additive G
α : F ⟶ G
n : ℕ
X : C
P : ProjectiveResolution X
⊢ (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
        ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
          ((Functor.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 α (ComplexShape.down ℕ)).app P.complex)) ≫
        (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
          ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
            ((Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).map
              (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).inv)) =
    (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
      ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
        ((mapHomologicalComplex α (ComplexShape.down ℕ)).app ((projectiveResolutions C).obj X).as))

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 G : C ⥤ D
inst✝¹ : Functor.Additive F
inst✝ : Functor.Additive G
α : F ⟶ G
n : ℕ
X : C
P : ProjectiveResolution X
⊢ (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
      ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
        ((Functor.mapHomologicalComplex F (ComplexShape.down ℕ)).map
            (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom ≫
          (mapHomologicalComplex α (ComplexShape.down ℕ)).app P.complex ≫
            (Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).map
              (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).inv)) =
    (HomotopyCategory.homologyFunctor D (ComplexShape.down ℕ) n).map
      ((HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
        ((mapHomologicalComplex α (ComplexShape.down ℕ)).app ((projectiveResolutions C).obj X).as))

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 G : C ⥤ D
inst✝¹ : Functor.Additive F
inst✝ : Functor.Additive G
α : F ⟶ G
n : ℕ
X : C
P : ProjectiveResolution X
⊢ (HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
      ((Functor.mapHomologicalComplex F (ComplexShape.down ℕ)).map
          (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom ≫
        (mapHomologicalComplex α (ComplexShape.down ℕ)).app P.complex ≫
          (Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).map
            (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).inv) =
    (HomotopyCategory.quotient D (ComplexShape.down ℕ)).map
      ((mapHomologicalComplex α (ComplexShape.down ℕ)).app ((projectiveResolutions C).obj X).as)

tactic: simp only [NatTrans.mapHomologicalComplex_naturality_assoc, ← Functor.map_comp]
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 G : C ⥤ D
inst✝¹ : Functor.Additive F
inst✝ : Functor.Additive G
α : F ⟶ G
n : ℕ
X : C
P : ProjectiveResolution X
⊢ Homotopy
    ((Functor.mapHomologicalComplex F (ComplexShape.down ℕ)).map
        (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom ≫
      (mapHomologicalComplex α (ComplexShape.down ℕ)).app P.complex ≫
        (Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).map
          (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).inv)
    ((mapHomologicalComplex α (ComplexShape.down ℕ)).app ((projectiveResolutions C).obj X).as)

tactic: apply Homotopy.compLeftId
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 G : C ⥤ D
inst✝¹ : Functor.Additive F
inst✝ : Functor.Additive G
α : F ⟶ G
n : ℕ
X : C
P : ProjectiveResolution X
⊢ Homotopy
    ((mapHomologicalComplex α (ComplexShape.down ℕ)).app ((projectiveResolutions C).obj X).as ≫
      (Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).map
        ((ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom ≫
          (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).inv))
    ((mapHomologicalComplex α (ComplexShape.down ℕ)).app ((projectiveResolutions C).obj X).as)

tactic: refine' (Functor.mapHomotopy _ (HomotopyEquiv.homotopyHomInvId _) ).trans _
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 G : C ⥤ D
inst✝¹ : Functor.Additive F
inst✝ : Functor.Additive G
α : F ⟶ G
n : ℕ
X : C
P : ProjectiveResolution X
⊢ Homotopy
    ((Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).map
      ((ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).hom ≫
        (ProjectiveResolution.homotopyEquiv (projectiveResolution X) P).inv))
    (𝟙 ((Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).obj ((projectiveResolutions C).obj X).as))

tactic: apply Homotopy.ofEq
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 G : C ⥤ D
inst✝¹ : Functor.Additive F
inst✝ : Functor.Additive G
α : F ⟶ G
n : ℕ
X : C
P : ProjectiveResolution X
⊢ Homotopy ((Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).map (𝟙 ((projectiveResolutions C).obj X).as))
    (𝟙 ((Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).obj ((projectiveResolutions C).obj X).as))

tactic: simp only [Functor.map_id]
state_before: case e_a.h.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 G : C ⥤ D
inst✝¹ : Functor.Additive F
inst✝ : Functor.Additive G
α : F ⟶ G
n : ℕ
X : C
P : ProjectiveResolution X
⊢ (Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).map (𝟙 ((projectiveResolutions C).obj X).as) =
    𝟙 ((Functor.mapHomologicalComplex G (ComplexShape.down ℕ)).obj ((projectiveResolutions C).obj X).as)