Theorem: HomotopyCategory.mappingConeCompTriangleh_distinguished
File: Mathlib/Algebra/Homology/HomotopyCategory/Triangulated.lean

Proof steps:
state_before: C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : Preadditive C
inst✝¹ : HasZeroObject C
inst✝ : HasBinaryBiproducts C
X₁ X₂ X₃ : CochainComplex C ℤ
f : X₁ ⟶ X₂
g : X₂ ⟶ X₃
⊢ CochainComplex.mappingConeCompTriangleh f g ∈ distinguishedTriangles
state_after: C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : Preadditive C
inst✝¹ : HasZeroObject C
inst✝ : HasBinaryBiproducts C
X₁ X₂ X₃ : CochainComplex C ℤ
f : X₁ ⟶ X₂
g : X₂ ⟶ X₃
⊢ CochainComplex.mappingConeCompTriangleh f g ≅
    CochainComplex.mappingCone.triangleh (CochainComplex.mappingConeCompTriangle f g).mor₁
tactic: refine ⟨_, _, (CochainComplex.mappingConeCompTriangle f g).mor₁, ⟨?_⟩⟩
state_before: C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : Preadditive C
inst✝¹ : HasZeroObject C
inst✝ : HasBinaryBiproducts C
X₁ X₂ X₃ : CochainComplex C ℤ
f : X₁ ⟶ X₂
g : X₂ ⟶ X₃
⊢ CochainComplex.mappingConeCompTriangleh f g ≅
    CochainComplex.mappingCone.triangleh (CochainComplex.mappingConeCompTriangle f g).mor₁
state_after: C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : Preadditive C
inst✝¹ : HasZeroObject C
inst✝ : HasBinaryBiproducts C
X₁ X₂ X₃ : CochainComplex C ℤ
f : X₁ ⟶ X₂
g : X₂ ⟶ X₃
⊢ (CochainComplex.mappingConeCompTriangleh f g).mor₃ ≫
      (shiftFunctor (HomotopyCategory C (ComplexShape.up ℤ)) 1).map
        (Iso.refl (CochainComplex.mappingConeCompTriangleh f g).obj₁).hom =
    (isoOfHomotopyEquiv (CochainComplex.mappingConeCompHomotopyEquiv f g)).hom ≫
      (CochainComplex.mappingCone.triangleh (CochainComplex.mappingConeCompTriangle f g).mor₁).mor₃
tactic: refine Triangle.isoMk _ _ (Iso.refl _) (Iso.refl _) (isoOfHomotopyEquiv
    (CochainComplex.mappingConeCompHomotopyEquiv f g)) (by aesop_cat) (by simp) ?_
state_before: C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : Preadditive C
inst✝¹ : HasZeroObject C
inst✝ : HasBinaryBiproducts C
X₁ X₂ X₃ : CochainComplex C ℤ
f : X₁ ⟶ X₂
g : X₂ ⟶ X₃
⊢ (CochainComplex.mappingConeCompTriangleh f g).mor₃ ≫
      (shiftFunctor (HomotopyCategory C (ComplexShape.up ℤ)) 1).map
        (Iso.refl (CochainComplex.mappingConeCompTriangleh f g).obj₁).hom =
    (isoOfHomotopyEquiv (CochainComplex.mappingConeCompHomotopyEquiv f g)).hom ≫
      (CochainComplex.mappingCone.triangleh (CochainComplex.mappingConeCompTriangle f g).mor₁).mor₃
state_after: C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : Preadditive C
inst✝¹ : HasZeroObject C
inst✝ : HasBinaryBiproducts C
X₁ X₂ X₃ : CochainComplex C ℤ
f : X₁ ⟶ X₂
g : X₂ ⟶ X₃
⊢ ((quotient C (ComplexShape.up ℤ)).map
          ((CochainComplex.mappingCone.triangle g).mor₃ ≫
            (shiftFunctor (CochainComplex C ℤ) 1).map (CochainComplex.mappingCone.inr f)) ≫
        ((quotient C (ComplexShape.up ℤ)).commShiftIso 1).hom.app (CochainComplex.mappingCone f)) ≫
      (shiftFunctor (HomotopyCategory C (ComplexShape.up ℤ)) 1).map
        (𝟙 ((quotient C (ComplexShape.up ℤ)).obj (CochainComplex.mappingCone f))) =
    (quotient C (ComplexShape.up ℤ)).map (CochainComplex.mappingConeCompHomotopyEquiv f g).hom ≫
      (quotient C (ComplexShape.up ℤ)).map
          (CochainComplex.mappingCone.triangle (CochainComplex.mappingCone.map f (f ≫ g) (𝟙 X₁) g ⋯)).mor₃ ≫
        ((quotient C (ComplexShape.up ℤ)).commShiftIso 1).hom.app (CochainComplex.mappingCone f)
tactic: dsimp [CochainComplex.mappingConeCompTriangleh]
state_before: C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : Preadditive C
inst✝¹ : HasZeroObject C
inst✝ : HasBinaryBiproducts C
X₁ X₂ X₃ : CochainComplex C ℤ
f : X₁ ⟶ X₂
g : X₂ ⟶ X₃
⊢ ((quotient C (ComplexShape.up ℤ)).map
          ((CochainComplex.mappingCone.triangle g).mor₃ ≫
            (shiftFunctor (CochainComplex C ℤ) 1).map (CochainComplex.mappingCone.inr f)) ≫
        ((quotient C (ComplexShape.up ℤ)).commShiftIso 1).hom.app (CochainComplex.mappingCone f)) ≫
      (shiftFunctor (HomotopyCategory C (ComplexShape.up ℤ)) 1).map
        (𝟙 ((quotient C (ComplexShape.up ℤ)).obj (CochainComplex.mappingCone f))) =
    (quotient C (ComplexShape.up ℤ)).map (CochainComplex.mappingConeCompHomotopyEquiv f g).hom ≫
      (quotient C (ComplexShape.up ℤ)).map
          (CochainComplex.mappingCone.triangle (CochainComplex.mappingCone.map f (f ≫ g) (𝟙 X₁) g ⋯)).mor₃ ≫
        ((quotient C (ComplexShape.up ℤ)).commShiftIso 1).hom.app (CochainComplex.mappingCone f)
state_after: C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : Preadditive C
inst✝¹ : HasZeroObject C
inst✝ : HasBinaryBiproducts C
X₁ X₂ X₃ : CochainComplex C ℤ
f : X₁ ⟶ X₂
g : X₂ ⟶ X₃
⊢ (quotient C (ComplexShape.up ℤ)).map
        ((CochainComplex.mappingCone.triangle g).mor₃ ≫
          (shiftFunctor (CochainComplex C ℤ) 1).map (CochainComplex.mappingCone.inr f)) ≫
      ((quotient C (ComplexShape.up ℤ)).commShiftIso 1).hom.app (CochainComplex.mappingCone f) =
    (quotient C (ComplexShape.up ℤ)).map
        ((CochainComplex.mappingConeCompHomotopyEquiv f g).hom ≫
          (CochainComplex.mappingCone.triangle (CochainComplex.mappingCone.map f (f ≫ g) (𝟙 X₁) g ⋯)).mor₃) ≫
      ((quotient C (ComplexShape.up ℤ)).commShiftIso 1).hom.app (CochainComplex.mappingCone f)
tactic: rw [CategoryTheory.Functor.map_id, comp_id, ← Functor.map_comp_assoc]
state_before: C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : Preadditive C
inst✝¹ : HasZeroObject C
inst✝ : HasBinaryBiproducts C
X₁ X₂ X₃ : CochainComplex C ℤ
f : X₁ ⟶ X₂
g : X₂ ⟶ X₃
⊢ (quotient C (ComplexShape.up ℤ)).map
        ((CochainComplex.mappingCone.triangle g).mor₃ ≫
          (shiftFunctor (CochainComplex C ℤ) 1).map (CochainComplex.mappingCone.inr f)) ≫
      ((quotient C (ComplexShape.up ℤ)).commShiftIso 1).hom.app (CochainComplex.mappingCone f) =
    (quotient C (ComplexShape.up ℤ)).map
        ((CochainComplex.mappingConeCompHomotopyEquiv f g).hom ≫
          (CochainComplex.mappingCone.triangle (CochainComplex.mappingCone.map f (f ≫ g) (𝟙 X₁) g ⋯)).mor₃) ≫
      ((quotient C (ComplexShape.up ℤ)).commShiftIso 1).hom.app (CochainComplex.mappingCone f)
state_after: case e_a.e_a
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : Preadditive C
inst✝¹ : HasZeroObject C
inst✝ : HasBinaryBiproducts C
X₁ X₂ X₃ : CochainComplex C ℤ
f : X₁ ⟶ X₂
g : X₂ ⟶ X₃
⊢ (CochainComplex.mappingCone.triangle g).mor₃ ≫
      (shiftFunctor (CochainComplex C ℤ) 1).map (CochainComplex.mappingCone.inr f) =
    (CochainComplex.mappingConeCompHomotopyEquiv f g).hom ≫
      (CochainComplex.mappingCone.triangle (CochainComplex.mappingCone.map f (f ≫ g) (𝟙 X₁) g ⋯)).mor₃
tactic: congr 2
state_before: case e_a.e_a
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : Preadditive C
inst✝¹ : HasZeroObject C
inst✝ : HasBinaryBiproducts C
X₁ X₂ X₃ : CochainComplex C ℤ
f : X₁ ⟶ X₂
g : X₂ ⟶ X₃
⊢ (CochainComplex.mappingCone.triangle g).mor₃ ≫
      (shiftFunctor (CochainComplex C ℤ) 1).map (CochainComplex.mappingCone.inr f) =
    (CochainComplex.mappingConeCompHomotopyEquiv f g).hom ≫
      (CochainComplex.mappingCone.triangle (CochainComplex.mappingCone.map f (f ≫ g) (𝟙 X₁) g ⋯)).mor₃
state_after: no goals
tactic: exact (CochainComplex.mappingConeCompHomotopyEquiv_comm₂ f g).symm