-- Mathlib/Algebra/Homology/HomotopyCategory/HomComplex.lean
@[simp]
lemma δ_ofHomotopy {φ₁ φ₂ : F ⟶ G} (h : Homotopy φ₁ φ₂) :
    δ (-1) 0 (Cochain.ofHomotopy h) = Cochain.ofHom φ₁ - Cochain.ofHom φ₂

Proof state:
case h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : Preadditive C
F G : CochainComplex C ℤ
φ₁ φ₂ : F ⟶ G
h : Homotopy φ₁ φ₂
p : ℤ
eq : φ₁.f p = F.d p (p + 1) ≫ h.hom (p + 1) p + h.hom p (p - 1) ≫ G.d (p - 1) p + φ₂.f p
⊢ h.hom p (p - 1) ≫ G.d (p - 1) p + F.d p (p + 1) ≫ h.hom (p + 1) p =
    F.d p (p + 1) ≫ h.hom (p + 1) p + h.hom p (p - 1) ≫ G.d (p - 1) p + φ₂.f p - φ₂.f p

Tactic:
abel

Result:
no goals

Proof state:
case h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : Preadditive C
F G : CochainComplex C ℤ
φ₁ φ₂ : F ⟶ G
h : Homotopy φ₁ φ₂
p : ℤ
eq : φ₁.f p = F.d p (p + 1) ≫ h.hom (p + 1) p + h.hom p (p - 1) ≫ G.d (p - 1) p + φ₂.f p
⊢ (Cochain.mk fun p q x => h.hom p q).v p (p - 1) ⋯ ≫ G.d (p - 1) p +
      Int.negOnePow 0 • F.d p (p + 1) ≫ (Cochain.mk fun p q x => h.hom p q).v (p + 1) p ⋯ =
    (Cochain.ofHom φ₁ - Cochain.ofHom φ₂).v p p ⋯

Tactic:
simp only [Cochain.mk_v, neg_add_cancel, one_smul, Int.negOnePow_zero,
  Cochain.sub_v, Cochain.ofHom_v, eq]

Result:
case h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : Preadditive C
F G : CochainComplex C ℤ
φ₁ φ₂ : F ⟶ G
h : Homotopy φ₁ φ₂
p : ℤ
eq : φ₁.f p = F.d p (p + 1) ≫ h.hom (p + 1) p + h.hom p (p - 1) ≫ G.d (p - 1) p + φ₂.f p
⊢ h.hom p (p - 1) ≫ G.d (p - 1) p + F.d p (p + 1) ≫ h.hom (p + 1) p =
    F.d p (p + 1) ≫ h.hom (p + 1) p + h.hom p (p - 1) ≫ G.d (p - 1) p + φ₂.f p - φ₂.f p

Proof state:
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : Preadditive C
F G : CochainComplex C ℤ
φ₁ φ₂ : F ⟶ G
h : Homotopy φ₁ φ₂
p : ℤ
eq : φ₁.f p = F.d p (p + 1) ≫ h.hom (p + 1) p + (prevD p) h.hom + φ₂.f p
⊢ (ComplexShape.up ℤ).Rel (p - 1) p

Tactic:
simp

Result:
no goals

Proof state:
case h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : Preadditive C
F G : CochainComplex C ℤ
φ₁ φ₂ : F ⟶ G
h : Homotopy φ₁ φ₂
p : ℤ
eq : φ₁.f p = F.d p (p + 1) ≫ h.hom (p + 1) p + h.hom p (p - 1) ≫ G.d (p - 1) p + φ₂.f p
⊢ (δ (-1) 0 (Cochain.ofHomotopy h)).v p p ⋯ = (Cochain.ofHom φ₁ - Cochain.ofHom φ₂).v p p ⋯

Tactic:
rw [Cochain.ofHomotopy, δ_v (-1) 0 (neg_add_cancel 1) _ p p (add_zero p) (p-1) (p+1) rfl rfl]

Result:
case h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : Preadditive C
F G : CochainComplex C ℤ
φ₁ φ₂ : F ⟶ G
h : Homotopy φ₁ φ₂
p : ℤ
eq : φ₁.f p = F.d p (p + 1) ≫ h.hom (p + 1) p + h.hom p (p - 1) ≫ G.d (p - 1) p + φ₂.f p
⊢ (Cochain.mk fun p q x => h.hom p q).v p (p - 1) ⋯ ≫ G.d (p - 1) p +
      Int.negOnePow 0 • F.d p (p + 1) ≫ (Cochain.mk fun p q x => h.hom p q).v (p + 1) p ⋯ =
    (Cochain.ofHom φ₁ - Cochain.ofHom φ₂).v p p ⋯

Proof state:
case h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : Preadditive C
F G : CochainComplex C ℤ
φ₁ φ₂ : F ⟶ G
h : Homotopy φ₁ φ₂
p : ℤ
eq : φ₁.f p = (dNext p) h.hom + (prevD p) h.hom + φ₂.f p
⊢ (δ (-1) 0 (Cochain.ofHomotopy h)).v p p ⋯ = (Cochain.ofHom φ₁ - Cochain.ofHom φ₂).v p p ⋯

Tactic:
rw [dNext_eq h.hom (show (ComplexShape.up ℤ).Rel p (p+1) by simp),
  prevD_eq h.hom (show (ComplexShape.up ℤ).Rel (p-1) p by simp)] at eq

Result:
case h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : Preadditive C
F G : CochainComplex C ℤ
φ₁ φ₂ : F ⟶ G
h : Homotopy φ₁ φ₂
p : ℤ
eq : φ₁.f p = F.d p (p + 1) ≫ h.hom (p + 1) p + h.hom p (p - 1) ≫ G.d (p - 1) p + φ₂.f p
⊢ (δ (-1) 0 (Cochain.ofHomotopy h)).v p p ⋯ = (Cochain.ofHom φ₁ - Cochain.ofHom φ₂).v p p ⋯

Proof state:
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : Preadditive C
F G : CochainComplex C ℤ
φ₁ φ₂ : F ⟶ G
h : Homotopy φ₁ φ₂
⊢ δ (-1) 0 (Cochain.ofHomotopy h) = Cochain.ofHom φ₁ - Cochain.ofHom φ₂

Tactic:
ext p

Result:
case h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : Preadditive C
F G : CochainComplex C ℤ
φ₁ φ₂ : F ⟶ G
h : Homotopy φ₁ φ₂
p : ℤ
⊢ (δ (-1) 0 (Cochain.ofHomotopy h)).v p p ⋯ = (Cochain.ofHom φ₁ - Cochain.ofHom φ₂).v p p ⋯

Proof state:
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : Preadditive C
F G : CochainComplex C ℤ
φ₁ φ₂ : F ⟶ G
h : Homotopy φ₁ φ₂
p : ℤ
eq : φ₁.f p = (dNext p) h.hom + (prevD p) h.hom + φ₂.f p
⊢ (ComplexShape.up ℤ).Rel p (p + 1)

Tactic:
simp

Result:
no goals

Proof state:
case h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : Preadditive C
F G : CochainComplex C ℤ
φ₁ φ₂ : F ⟶ G
h : Homotopy φ₁ φ₂
p : ℤ
⊢ (δ (-1) 0 (Cochain.ofHomotopy h)).v p p ⋯ = (Cochain.ofHom φ₁ - Cochain.ofHom φ₂).v p p ⋯

Tactic:
have eq := h.comm p

Result:
case h
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : Preadditive C
F G : CochainComplex C ℤ
φ₁ φ₂ : F ⟶ G
h : Homotopy φ₁ φ₂
p : ℤ
eq : φ₁.f p = (dNext p) h.hom + (prevD p) h.hom + φ₂.f p
⊢ (δ (-1) 0 (Cochain.ofHomotopy h)).v p p ⋯ = (Cochain.ofHom φ₁ - Cochain.ofHom φ₂).v p p ⋯