Theorem: homology'_map_eq_of_homotopy
File: Mathlib/Algebra/Homology/Homotopy.lean

tactic: dsimp [homology'Functor]
state_before: ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ (homology'Functor V c i).map f = (homology'Functor V c i).map g
state_after: ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ homology'.map ⋯ ⋯ (Hom.sqTo f i) (Hom.sqFrom f i) ⋯ = homology'.map ⋯ ⋯ (Hom.sqTo g i) (Hom.sqFrom g i) ⋯

tactic: apply eq_of_sub_eq_zero
state_before: ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ homology'.map ⋯ ⋯ (Hom.sqTo f i) (Hom.sqFrom f i) ⋯ = homology'.map ⋯ ⋯ (Hom.sqTo g i) (Hom.sqFrom g i) ⋯
state_after: case h
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ homology'.map ⋯ ⋯ (Hom.sqTo f i) (Hom.sqFrom f i) ⋯ - homology'.map ⋯ ⋯ (Hom.sqTo g i) (Hom.sqFrom g i) ⋯ = 0

tactic: ext
state_before: case h
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ homology'.map ⋯ ⋯ (Hom.sqTo f i) (Hom.sqFrom f i) ⋯ - homology'.map ⋯ ⋯ (Hom.sqTo g i) (Hom.sqFrom g i) ⋯ = 0
state_after: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ homology'.π (C.dTo i) (C.dFrom i) ⋯ ≫
      (homology'.map ⋯ ⋯ (Hom.sqTo f i) (Hom.sqFrom f i) ⋯ - homology'.map ⋯ ⋯ (Hom.sqTo g i) (Hom.sqFrom g i) ⋯) =
    homology'.π (C.dTo i) (C.dFrom i) ⋯ ≫ 0

tactic: simp only [homology'.π_map, comp_zero, Preadditive.comp_sub]
state_before: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ homology'.π (C.dTo i) (C.dFrom i) ⋯ ≫
      (homology'.map ⋯ ⋯ (Hom.sqTo f i) (Hom.sqFrom f i) ⋯ - homology'.map ⋯ ⋯ (Hom.sqTo g i) (Hom.sqFrom g i) ⋯) =
    homology'.π (C.dTo i) (C.dFrom i) ⋯ ≫ 0
state_after: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ kernelSubobjectMap (Hom.sqFrom f i) ≫ homology'.π (D.dTo i) (D.dFrom i) ⋯ -
      kernelSubobjectMap (Hom.sqFrom g i) ≫ homology'.π (D.dTo i) (D.dFrom i) ⋯ =
    0

tactic: dsimp [kernelSubobjectMap]
state_before: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ kernelSubobjectMap (Hom.sqFrom f i) ≫ homology'.π (D.dTo i) (D.dFrom i) ⋯ -
      kernelSubobjectMap (Hom.sqFrom g i) ≫ homology'.π (D.dTo i) (D.dFrom i) ⋯ =
    0
state_after: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ (kernelSubobject (D.dFrom i)).factorThru ((kernelSubobject (C.dFrom i)).arrow ≫ f.f i) ⋯ ≫
        homology'.π (D.dTo i) (D.dFrom i) ⋯ -
      (kernelSubobject (D.dFrom i)).factorThru ((kernelSubobject (C.dFrom i)).arrow ≫ g.f i) ⋯ ≫
        homology'.π (D.dTo i) (D.dFrom i) ⋯ =
    0

tactic: simp_rw [h.comm i]
state_before: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ (kernelSubobject (D.dFrom i)).factorThru ((kernelSubobject (C.dFrom i)).arrow ≫ f.f i) ⋯ ≫
        homology'.π (D.dTo i) (D.dFrom i) ⋯ -
      (kernelSubobject (D.dFrom i)).factorThru ((kernelSubobject (C.dFrom i)).arrow ≫ g.f i) ⋯ ≫
        homology'.π (D.dTo i) (D.dFrom i) ⋯ =
    0
state_after: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ (kernelSubobject (D.dFrom i)).factorThru
          ((kernelSubobject (C.dFrom i)).arrow ≫ ((dNext i) h.hom + (prevD i) h.hom + g.f i)) ⋯ ≫
        homology'.π (D.dTo i) (D.dFrom i) ⋯ -
      (kernelSubobject (D.dFrom i)).factorThru ((kernelSubobject (C.dFrom i)).arrow ≫ g.f i) ⋯ ≫
        homology'.π (D.dTo i) (D.dFrom i) ⋯ =
    0

tactic: simp only [zero_add, zero_comp, dNext_eq_dFrom_fromNext, kernelSubobject_arrow_comp_assoc,
  Preadditive.comp_add]
state_before: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ (kernelSubobject (D.dFrom i)).factorThru
          ((kernelSubobject (C.dFrom i)).arrow ≫ ((dNext i) h.hom + (prevD i) h.hom + g.f i)) ⋯ ≫
        homology'.π (D.dTo i) (D.dFrom i) ⋯ -
      (kernelSubobject (D.dFrom i)).factorThru ((kernelSubobject (C.dFrom i)).arrow ≫ g.f i) ⋯ ≫
        homology'.π (D.dTo i) (D.dFrom i) ⋯ =
    0
state_after: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ (kernelSubobject (D.dFrom i)).factorThru
          ((kernelSubobject (C.dFrom i)).arrow ≫ (prevD i) h.hom + (kernelSubobject (C.dFrom i)).arrow ≫ g.f i) ⋯ ≫
        homology'.π (D.dTo i) (D.dFrom i) ⋯ -
      (kernelSubobject (D.dFrom i)).factorThru ((kernelSubobject (C.dFrom i)).arrow ≫ g.f i) ⋯ ≫
        homology'.π (D.dTo i) (D.dFrom i) ⋯ =
    0

tactic: rw [← Preadditive.sub_comp]
state_before: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ (kernelSubobject (D.dFrom i)).factorThru
          ((kernelSubobject (C.dFrom i)).arrow ≫ (prevD i) h.hom + (kernelSubobject (C.dFrom i)).arrow ≫ g.f i) ⋯ ≫
        homology'.π (D.dTo i) (D.dFrom i) ⋯ -
      (kernelSubobject (D.dFrom i)).factorThru ((kernelSubobject (C.dFrom i)).arrow ≫ g.f i) ⋯ ≫
        homology'.π (D.dTo i) (D.dFrom i) ⋯ =
    0
state_after: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ ((kernelSubobject (D.dFrom i)).factorThru
          ((kernelSubobject (C.dFrom i)).arrow ≫ (prevD i) h.hom + (kernelSubobject (C.dFrom i)).arrow ≫ g.f i) ⋯ -
        (kernelSubobject (D.dFrom i)).factorThru ((kernelSubobject (C.dFrom i)).arrow ≫ g.f i) ⋯) ≫
      homology'.π (D.dTo i) (D.dFrom i) ⋯ =
    0

tactic: simp only [CategoryTheory.Subobject.factorThru_add_sub_factorThru_right]
state_before: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ ((kernelSubobject (D.dFrom i)).factorThru
          ((kernelSubobject (C.dFrom i)).arrow ≫ (prevD i) h.hom + (kernelSubobject (C.dFrom i)).arrow ≫ g.f i) ⋯ -
        (kernelSubobject (D.dFrom i)).factorThru ((kernelSubobject (C.dFrom i)).arrow ≫ g.f i) ⋯) ≫
      homology'.π (D.dTo i) (D.dFrom i) ⋯ =
    0
state_after: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ (kernelSubobject (D.dFrom i)).factorThru ((kernelSubobject (C.dFrom i)).arrow ≫ (prevD i) h.hom) ⋯ ≫
      homology'.π (D.dTo i) (D.dFrom i) ⋯ =
    0

tactic: erw [Subobject.factorThru_ofLE (D.boundaries_le_cycles' i)]
state_before: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ (kernelSubobject (D.dFrom i)).factorThru ((kernelSubobject (C.dFrom i)).arrow ≫ (prevD i) h.hom) ⋯ ≫
      homology'.π (D.dTo i) (D.dFrom i) ⋯ =
    0
state_after: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ ((D.boundaries i).factorThru ((kernelSubobject (C.dFrom i)).arrow ≫ (prevD i) h.hom) ?h.p ≫
        (D.boundaries i).ofLE (D.cycles' i) ⋯) ≫
      homology'.π (D.dTo i) (D.dFrom i) ⋯ =
    0

case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ (D.boundaries i).Factors ((kernelSubobject (C.dFrom i)).arrow ≫ (prevD i) h.hom)

tactic: simp
state_before: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ ((D.boundaries i).factorThru ((kernelSubobject (C.dFrom i)).arrow ≫ (prevD i) h.hom) ?h.p ≫
        (D.boundaries i).ofLE (D.cycles' i) ⋯) ≫
      homology'.π (D.dTo i) (D.dFrom i) ⋯ =
    0
state_after: no goals

tactic: rw [prevD_eq_toPrev_dTo, ← assoc]
state_before: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ (D.boundaries i).Factors ((kernelSubobject (C.dFrom i)).arrow ≫ (prevD i) h.hom)
state_after: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ (D.boundaries i).Factors (((kernelSubobject (C.dFrom i)).arrow ≫ (toPrev i) h.hom) ≫ D.dTo i)

tactic: apply imageSubobject_factors_comp_self
state_before: case h.p
ι : Type u_1
V : Type u
inst✝⁵ : Category.{v, u} V
inst✝⁴ : Preadditive V
c : ComplexShape ι
C D E : HomologicalComplex V c
f g : C ⟶ D
h✝ k : D ⟶ E
i✝ : ι
inst✝³ : HasEqualizers V
inst✝² : HasCokernels V
inst✝¹ : HasImages V
inst✝ : HasImageMaps V
h : Homotopy f g
i : ι
⊢ (D.boundaries i).Factors (((kernelSubobject (C.dFrom i)).arrow ≫ (toPrev i) h.hom) ≫ D.dTo i)
state_after: no goals