Theorem: CategoryTheory.Pretriangulated.productTriangle.zero₃₁
File: Mathlib/CategoryTheory/Triangulated/Basic.lean

Proof steps:
state_before: C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasShift C ℤ
T₁ T₂ T₃ : Triangle C
J : Type u_1
T : J → Triangle C
inst✝⁴ : HasProduct fun j => (T j).obj₁
inst✝³ : HasProduct fun j => (T j).obj₂
inst✝² : HasProduct fun j => (T j).obj₃
inst✝¹ : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₁
inst✝ : HasZeroMorphisms C
h : ∀ (j : J), (T j).mor₃ ≫ (shiftFunctor C 1).map (T j).mor₁ = 0
⊢ (productTriangle T).mor₃ ≫ (shiftFunctor C 1).map (productTriangle T).mor₁ = 0
state_after: C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasShift C ℤ
T₁ T₂ T₃ : Triangle C
J : Type u_1
T : J → Triangle C
inst✝⁴ : HasProduct fun j => (T j).obj₁
inst✝³ : HasProduct fun j => (T j).obj₂
inst✝² : HasProduct fun j => (T j).obj₃
inst✝¹ : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₁
inst✝ : HasZeroMorphisms C
h : ∀ (j : J), (T j).mor₃ ≫ (shiftFunctor C 1).map (T j).mor₁ = 0
this : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₂
⊢ (productTriangle T).mor₃ ≫ (shiftFunctor C 1).map (productTriangle T).mor₁ = 0
tactic: have : HasProduct (fun j => (T j).obj₂⟦(1 : ℤ)⟧) :=
    ⟨_, isLimitFanMkObjOfIsLimit (shiftFunctor C (1 : ℤ)) _ _
      (productIsProduct (fun j => (T j).obj₂))⟩
state_before: C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasShift C ℤ
T₁ T₂ T₃ : Triangle C
J : Type u_1
T : J → Triangle C
inst✝⁴ : HasProduct fun j => (T j).obj₁
inst✝³ : HasProduct fun j => (T j).obj₂
inst✝² : HasProduct fun j => (T j).obj₃
inst✝¹ : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₁
inst✝ : HasZeroMorphisms C
h : ∀ (j : J), (T j).mor₃ ≫ (shiftFunctor C 1).map (T j).mor₁ = 0
this : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₂
⊢ (productTriangle T).mor₃ ≫ (shiftFunctor C 1).map (productTriangle T).mor₁ = 0
state_after: C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasShift C ℤ
T₁ T₂ T₃ : Triangle C
J : Type u_1
T : J → Triangle C
inst✝⁴ : HasProduct fun j => (T j).obj₁
inst✝³ : HasProduct fun j => (T j).obj₂
inst✝² : HasProduct fun j => (T j).obj₃
inst✝¹ : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₁
inst✝ : HasZeroMorphisms C
h : ∀ (j : J), (T j).mor₃ ≫ (shiftFunctor C 1).map (T j).mor₁ = 0
this : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₂
⊢ ((Pi.map fun j => (T j).mor₃) ≫ inv (piComparison (shiftFunctor C 1) fun j => (T j).obj₁)) ≫
      (shiftFunctor C 1).map (Pi.map fun j => (T j).mor₁) =
    0
tactic: dsimp
state_before: C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasShift C ℤ
T₁ T₂ T₃ : Triangle C
J : Type u_1
T : J → Triangle C
inst✝⁴ : HasProduct fun j => (T j).obj₁
inst✝³ : HasProduct fun j => (T j).obj₂
inst✝² : HasProduct fun j => (T j).obj₃
inst✝¹ : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₁
inst✝ : HasZeroMorphisms C
h : ∀ (j : J), (T j).mor₃ ≫ (shiftFunctor C 1).map (T j).mor₁ = 0
this : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₂
⊢ ((Pi.map fun j => (T j).mor₃) ≫ inv (piComparison (shiftFunctor C 1) fun j => (T j).obj₁)) ≫
      (shiftFunctor C 1).map (Pi.map fun j => (T j).mor₁) =
    0
state_after: C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasShift C ℤ
T₁ T₂ T₃ : Triangle C
J : Type u_1
T : J → Triangle C
inst✝⁴ : HasProduct fun j => (T j).obj₁
inst✝³ : HasProduct fun j => (T j).obj₂
inst✝² : HasProduct fun j => (T j).obj₃
inst✝¹ : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₁
inst✝ : HasZeroMorphisms C
h : ∀ (j : J), (T j).mor₃ ≫ (shiftFunctor C 1).map (T j).mor₁ = 0
this : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₂
⊢ ((Pi.map fun j => (T j).mor₃) ≫ inv (piComparison (shiftFunctor C 1) fun j => (T j).obj₁)) ≫
      (shiftFunctor C 1).map (Pi.lift fun j => Pi.π (fun j => (T j).obj₁) j ≫ (T j).mor₁) =
    0
tactic: change _ ≫ (Pi.lift (fun j => Pi.π _ j ≫ (T j).mor₁))⟦(1 : ℤ)⟧' = 0
state_before: C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasShift C ℤ
T₁ T₂ T₃ : Triangle C
J : Type u_1
T : J → Triangle C
inst✝⁴ : HasProduct fun j => (T j).obj₁
inst✝³ : HasProduct fun j => (T j).obj₂
inst✝² : HasProduct fun j => (T j).obj₃
inst✝¹ : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₁
inst✝ : HasZeroMorphisms C
h : ∀ (j : J), (T j).mor₃ ≫ (shiftFunctor C 1).map (T j).mor₁ = 0
this : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₂
⊢ ((Pi.map fun j => (T j).mor₃) ≫ inv (piComparison (shiftFunctor C 1) fun j => (T j).obj₁)) ≫
      (shiftFunctor C 1).map (Pi.lift fun j => Pi.π (fun j => (T j).obj₁) j ≫ (T j).mor₁) =
    0
state_after: C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasShift C ℤ
T₁ T₂ T₃ : Triangle C
J : Type u_1
T : J → Triangle C
inst✝⁴ : HasProduct fun j => (T j).obj₁
inst✝³ : HasProduct fun j => (T j).obj₂
inst✝² : HasProduct fun j => (T j).obj₃
inst✝¹ : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₁
inst✝ : HasZeroMorphisms C
h : ∀ (j : J), (T j).mor₃ ≫ (shiftFunctor C 1).map (T j).mor₁ = 0
this : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₂
⊢ ((Pi.map fun j => (T j).mor₃) ≫
      inv (piComparison (shiftFunctor C 1) fun j => (T j).obj₁) ≫
        (shiftFunctor C 1).map (Pi.lift fun j => Pi.π (fun j => (T j).obj₁) j ≫ (T j).mor₁) ≫
          piComparison (shiftFunctor C 1) fun j => (T j).obj₂) =
    0
tactic: rw [assoc, ← cancel_mono (piComparison _ _), zero_comp, assoc, assoc]
state_before: C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasShift C ℤ
T₁ T₂ T₃ : Triangle C
J : Type u_1
T : J → Triangle C
inst✝⁴ : HasProduct fun j => (T j).obj₁
inst✝³ : HasProduct fun j => (T j).obj₂
inst✝² : HasProduct fun j => (T j).obj₃
inst✝¹ : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₁
inst✝ : HasZeroMorphisms C
h : ∀ (j : J), (T j).mor₃ ≫ (shiftFunctor C 1).map (T j).mor₁ = 0
this : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₂
⊢ ((Pi.map fun j => (T j).mor₃) ≫
      inv (piComparison (shiftFunctor C 1) fun j => (T j).obj₁) ≫
        (shiftFunctor C 1).map (Pi.lift fun j => Pi.π (fun j => (T j).obj₁) j ≫ (T j).mor₁) ≫
          piComparison (shiftFunctor C 1) fun j => (T j).obj₂) =
    0
state_after: case h
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasShift C ℤ
T₁ T₂ T₃ : Triangle C
J : Type u_1
T : J → Triangle C
inst✝⁴ : HasProduct fun j => (T j).obj₁
inst✝³ : HasProduct fun j => (T j).obj₂
inst✝² : HasProduct fun j => (T j).obj₃
inst✝¹ : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₁
inst✝ : HasZeroMorphisms C
h : ∀ (j : J), (T j).mor₃ ≫ (shiftFunctor C 1).map (T j).mor₁ = 0
this : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₂
j : J
⊢ ((Pi.map fun j => (T j).mor₃) ≫
        inv (piComparison (shiftFunctor C 1) fun j => (T j).obj₁) ≫
          (shiftFunctor C 1).map (Pi.lift fun j => Pi.π (fun j => (T j).obj₁) j ≫ (T j).mor₁) ≫
            piComparison (shiftFunctor C 1) fun j => (T j).obj₂) ≫
      Pi.π (fun b => (shiftFunctor C 1).obj (T b).obj₂) j =
    0 ≫ Pi.π (fun b => (shiftFunctor C 1).obj (T b).obj₂) j
tactic: ext j
state_before: case h
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasShift C ℤ
T₁ T₂ T₃ : Triangle C
J : Type u_1
T : J → Triangle C
inst✝⁴ : HasProduct fun j => (T j).obj₁
inst✝³ : HasProduct fun j => (T j).obj₂
inst✝² : HasProduct fun j => (T j).obj₃
inst✝¹ : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₁
inst✝ : HasZeroMorphisms C
h : ∀ (j : J), (T j).mor₃ ≫ (shiftFunctor C 1).map (T j).mor₁ = 0
this : HasProduct fun j => (shiftFunctor C 1).obj (T j).obj₂
j : J
⊢ ((Pi.map fun j => (T j).mor₃) ≫
        inv (piComparison (shiftFunctor C 1) fun j => (T j).obj₁) ≫
          (shiftFunctor C 1).map (Pi.lift fun j => Pi.π (fun j => (T j).obj₁) j ≫ (T j).mor₁) ≫
            piComparison (shiftFunctor C 1) fun j => (T j).obj₂) ≫
      Pi.π (fun b => (shiftFunctor C 1).obj (T b).obj₂) j =
    0 ≫ Pi.π (fun b => (shiftFunctor C 1).obj (T b).obj₂) j
state_after: no goals
tactic: simp only [map_lift_piComparison, assoc, limit.lift_π, Fan.mk_π_app, zero_comp,
    Functor.map_comp, ← piComparison_comp_π_assoc, IsIso.inv_hom_id_assoc,
    limMap_π_assoc, Discrete.natTrans_app, h j, comp_zero]