Theorem: CochainComplex.HomComplex.Cochain.equivHomotopy_symm_apply_hom
File: Mathlib/Algebra/Homology/HomotopyCategory/HomComplex.lean

Proof steps:
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
ho : Homotopy φ₁ φ₂
⊢ ofHom φ₁ = δ (-1) 0 (ofHomotopy ho) + ofHom φ₂
state_after: no goals
tactic: simp only [δ_ofHomotopy, sub_add_cancel]
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
z : { z // ofHom φ₁ = δ (-1) 0 z + ofHom φ₂ }
i j : ℤ
hij : j + 1 ≠ i
x✝ : i + -1 = j
⊢ j + 1 = i
state_after: no goals
tactic: omega
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
z : { z // ofHom φ₁ = δ (-1) 0 z + ofHom φ₂ }
p : ℤ
⊢ φ₁.f p =
    (((dNext p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
        (prevD p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
      φ₂.f p
state_after: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
z : { z // ofHom φ₁ = δ (-1) 0 z + ofHom φ₂ }
p : ℤ
eq : (ofHom φ₁).v p p ⋯ = (δ (-1) 0 ↑z + ofHom φ₂).v p p ⋯
⊢ φ₁.f p =
    (((dNext p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
        (prevD p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
      φ₂.f p
tactic: have eq := Cochain.congr_v z.2 p p (add_zero p)
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
z : { z // ofHom φ₁ = δ (-1) 0 z + ofHom φ₂ }
p : ℤ
eq : (ofHom φ₁).v p p ⋯ = (δ (-1) 0 ↑z + ofHom φ₂).v p p ⋯
⊢ φ₁.f p =
    (((dNext p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
        (prevD p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
      φ₂.f p
state_after: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
z : { z // ofHom φ₁ = δ (-1) 0 z + ofHom φ₂ }
p : ℤ
eq : (ofHom φ₁).v p p ⋯ = (δ (-1) 0 ↑z + ofHom φ₂).v p p ⋯
h₁ : (ComplexShape.up ℤ).Rel (p - 1) p
⊢ φ₁.f p =
    (((dNext p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
        (prevD p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
      φ₂.f p
tactic: have h₁ : (ComplexShape.up ℤ).Rel (p - 1) p := by simp
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
z : { z // ofHom φ₁ = δ (-1) 0 z + ofHom φ₂ }
p : ℤ
eq : (ofHom φ₁).v p p ⋯ = (δ (-1) 0 ↑z + ofHom φ₂).v p p ⋯
h₁ : (ComplexShape.up ℤ).Rel (p - 1) p
⊢ φ₁.f p =
    (((dNext p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
        (prevD p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
      φ₂.f p
state_after: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
z : { z // ofHom φ₁ = δ (-1) 0 z + ofHom φ₂ }
p : ℤ
eq : (ofHom φ₁).v p p ⋯ = (δ (-1) 0 ↑z + ofHom φ₂).v p p ⋯
h₁ : (ComplexShape.up ℤ).Rel (p - 1) p
h₂ : (ComplexShape.up ℤ).Rel p (p + 1)
⊢ φ₁.f p =
    (((dNext p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
        (prevD p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
      φ₂.f p
tactic: have h₂ : (ComplexShape.up ℤ).Rel p (p + 1) := by simp
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
z : { z // ofHom φ₁ = δ (-1) 0 z + ofHom φ₂ }
p : ℤ
eq : (ofHom φ₁).v p p ⋯ = (δ (-1) 0 ↑z + ofHom φ₂).v p p ⋯
h₁ : (ComplexShape.up ℤ).Rel (p - 1) p
h₂ : (ComplexShape.up ℤ).Rel p (p + 1)
⊢ φ₁.f p =
    (((dNext p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
        (prevD p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
      φ₂.f p
state_after: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
z : { z // ofHom φ₁ = δ (-1) 0 z + ofHom φ₂ }
p : ℤ
h₁ : (ComplexShape.up ℤ).Rel (p - 1) p
h₂ : (ComplexShape.up ℤ).Rel p (p + 1)
eq : φ₁.f p = F.d p (p + 1) ≫ (↑z).v (p + 1) p ⋯ + (↑z).v p (p - 1) ⋯ ≫ G.d (p - 1) p + φ₂.f p
⊢ φ₁.f p =
    (((dNext p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
        (prevD p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
      φ₂.f p
tactic: simp only [δ_neg_one_cochain, Cochain.ofHom_v, ComplexShape.up_Rel, Cochain.add_v,
          Homotopy.nullHomotopicMap'_f h₁ h₂] at eq
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
z : { z // ofHom φ₁ = δ (-1) 0 z + ofHom φ₂ }
p : ℤ
h₁ : (ComplexShape.up ℤ).Rel (p - 1) p
h₂ : (ComplexShape.up ℤ).Rel p (p + 1)
eq : φ₁.f p = F.d p (p + 1) ≫ (↑z).v (p + 1) p ⋯ + (↑z).v p (p - 1) ⋯ ≫ G.d (p - 1) p + φ₂.f p
⊢ φ₁.f p =
    (((dNext p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
        (prevD p) fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0) +
      φ₂.f p
state_after: no goals
tactic: rw [dNext_eq _ h₂, prevD_eq _ h₁, eq, dif_pos, dif_pos]
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
ho : Homotopy φ₁ φ₂
⊢ (fun z => { hom := fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0, zero := ⋯, comm := ⋯ })
      ((fun ho => ⟨ofHomotopy ho, ⋯⟩) ho) =
    ho
state_after: case hom.h.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
ho : Homotopy φ₁ φ₂
i j : ℤ
⊢ ((fun z => { hom := fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0, zero := ⋯, comm := ⋯ })
          ((fun ho => ⟨ofHomotopy ho, ⋯⟩) ho)).hom
      i j =
    ho.hom i j
tactic: ext i j
state_before: case hom.h.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
ho : Homotopy φ₁ φ₂
i j : ℤ
⊢ ((fun z => { hom := fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0, zero := ⋯, comm := ⋯ })
          ((fun ho => ⟨ofHomotopy ho, ⋯⟩) ho)).hom
      i j =
    ho.hom i j
state_after: case hom.h.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
ho : Homotopy φ₁ φ₂
i j : ℤ
⊢ (if hij : i + -1 = j then (ofHomotopy ho).v i j hij else 0) = ho.hom i j
tactic: dsimp
state_before: case hom.h.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
ho : Homotopy φ₁ φ₂
i j : ℤ
⊢ (if hij : i + -1 = j then (ofHomotopy ho).v i j hij else 0) = ho.hom i j
state_after: case pos
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
ho : Homotopy φ₁ φ₂
i j : ℤ
h : i + -1 = j
⊢ (ofHomotopy ho).v i j h = ho.hom i j

case neg
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
ho : Homotopy φ₁ φ₂
i j : ℤ
h : ¬i + -1 = j
⊢ 0 = ho.hom i j
tactic: split_ifs with h
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
z : { z // ofHom φ₁ = δ (-1) 0 z + ofHom φ₂ }
⊢ (fun ho => ⟨ofHomotopy ho, ⋯⟩)
      ((fun z => { hom := fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0, zero := ⋯, comm := ⋯ }) z) =
    z
state_after: case a.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
z : { z // ofHom φ₁ = δ (-1) 0 z + ofHom φ₂ }
p q : ℤ
hpq : p + -1 = q
⊢ (↑((fun ho => ⟨ofHomotopy ho, ⋯⟩)
            ((fun z => { hom := fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0, zero := ⋯, comm := ⋯ })
              z))).v
      p q hpq =
    (↑z).v p q hpq
tactic: ext p q hpq
state_before: case a.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
z : { z // ofHom φ₁ = δ (-1) 0 z + ofHom φ₂ }
p q : ℤ
hpq : p + -1 = q
⊢ (↑((fun ho => ⟨ofHomotopy ho, ⋯⟩)
            ((fun z => { hom := fun i j => if hij : i + -1 = j then (↑z).v i j hij else 0, zero := ⋯, comm := ⋯ })
              z))).v
      p q hpq =
    (↑z).v p q hpq
state_after: case a.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
z : { z // ofHom φ₁ = δ (-1) 0 z + ofHom φ₂ }
p q : ℤ
hpq : p + -1 = q
⊢ (if hij : p + -1 = q then (↑z).v p q hij else 0) = (↑z).v p q hpq
tactic: dsimp [Cochain.ofHomotopy]
state_before: case a.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Preadditive C
R : Type u_1
inst✝¹ : Ring R
inst✝ : Linear R C
F G K L : CochainComplex C ℤ
n m : ℤ
φ₁ φ₂ : F ⟶ G
z : { z // ofHom φ₁ = δ (-1) 0 z + ofHom φ₂ }
p q : ℤ
hpq : p + -1 = q
⊢ (if hij : p + -1 = q then (↑z).v p q hij else 0) = (↑z).v p q hpq
state_after: no goals
tactic: rw [dif_pos hpq]