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

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
⊢ (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: 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₂
⊢ (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: 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.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: 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₁) =
    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: ext j
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: 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]
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