Theorem: CategoryTheory.GradedObject.Monoidal.left_tensor_tensorObj₃_ext
File: Mathlib/CategoryTheory/GradedObject/Monoidal.lean

Proof steps:
state_before: I : Type u
inst✝¹⁰ : AddMonoid I
C : Type u_1
inst✝⁹ : Category.{u_2, u_1} C
inst✝⁸ : MonoidalCategory C
Z✝ : C
X₁ X₂ X₃ : GradedObject I C
inst✝⁷ : X₁.HasTensor X₂
inst✝⁶ : X₂.HasTensor X₃
inst✝⁵ : (tensorObj X₁ X₂).HasTensor X₃
inst✝⁴ : X₁.HasTensor (tensorObj X₂ X₃)
Y₁ Y₂ Y₃ : GradedObject I C
inst✝³ : Y₁.HasTensor Y₂
inst✝² : Y₂.HasTensor Y₃
inst✝¹ : (tensorObj Y₁ Y₂).HasTensor Y₃
inst✝ : Y₁.HasTensor (tensorObj Y₂ Y₃)
j : I
A Z : C
f g : Z ⊗ tensorObj X₁ (tensorObj X₂ X₃) j ⟶ A
H : X₁.HasGoodTensorTensor₂₃ X₂ X₃
hZ : HasLeftTensor₃ObjExt Z X₁ X₂ X₃ j
h :
  ∀ (i₁ i₂ i₃ : I) (h : i₁ + i₂ + i₃ = j),
    Z ◁ ιTensorObj₃ X₁ X₂ X₃ i₁ i₂ i₃ j h ≫ f = Z ◁ ιTensorObj₃ X₁ X₂ X₃ i₁ i₂ i₃ j h ≫ g
⊢ f = g
state_after: I : Type u
inst✝¹⁰ : AddMonoid I
C : Type u_1
inst✝⁹ : Category.{u_2, u_1} C
inst✝⁸ : MonoidalCategory C
Z✝ : C
X₁ X₂ X₃ : GradedObject I C
inst✝⁷ : X₁.HasTensor X₂
inst✝⁶ : X₂.HasTensor X₃
inst✝⁵ : (tensorObj X₁ X₂).HasTensor X₃
inst✝⁴ : X₁.HasTensor (tensorObj X₂ X₃)
Y₁ Y₂ Y₃ : GradedObject I C
inst✝³ : Y₁.HasTensor Y₂
inst✝² : Y₂.HasTensor Y₃
inst✝¹ : (tensorObj Y₁ Y₂).HasTensor Y₃
inst✝ : Y₁.HasTensor (tensorObj Y₂ Y₃)
j : I
A Z : C
f g : Z ⊗ tensorObj X₁ (tensorObj X₂ X₃) j ⟶ A
H : X₁.HasGoodTensorTensor₂₃ X₂ X₃
hZ : HasLeftTensor₃ObjExt Z X₁ X₂ X₃ j
h :
  ∀ (i₁ i₂ i₃ : I) (h : i₁ + i₂ + i₃ = j),
    Z ◁ ιTensorObj₃ X₁ X₂ X₃ i₁ i₂ i₃ j h ≫ f = Z ◁ ιTensorObj₃ X₁ X₂ X₃ i₁ i₂ i₃ j h ≫ g
⊢ ∀ (j_1 : Discrete ↑(r₁₂₃ ⁻¹' {j})),
    (((curriedTensor C).obj Z).mapCocone
                (cofan₃MapBifunctorBifunctor₂₃MapObj (curriedTensor C) (curriedTensor C) ρ₂₃ X₁ X₂ X₃ j)).ι.app
          j_1 ≫
        f =
      (((curriedTensor C).obj Z).mapCocone
                (cofan₃MapBifunctorBifunctor₂₃MapObj (curriedTensor C) (curriedTensor C) ρ₂₃ X₁ X₂ X₃ j)).ι.app
          j_1 ≫
        g
tactic: refine (@isColimitOfPreserves C _ C _ _ _ _ ((curriedTensor C).obj Z) _
      (isColimitCofan₃MapBifunctorBifunctor₂₃MapObj (H := H) j) hZ).hom_ext ?_
state_before: I : Type u
inst✝¹⁰ : AddMonoid I
C : Type u_1
inst✝⁹ : Category.{u_2, u_1} C
inst✝⁸ : MonoidalCategory C
Z✝ : C
X₁ X₂ X₃ : GradedObject I C
inst✝⁷ : X₁.HasTensor X₂
inst✝⁶ : X₂.HasTensor X₃
inst✝⁵ : (tensorObj X₁ X₂).HasTensor X₃
inst✝⁴ : X₁.HasTensor (tensorObj X₂ X₃)
Y₁ Y₂ Y₃ : GradedObject I C
inst✝³ : Y₁.HasTensor Y₂
inst✝² : Y₂.HasTensor Y₃
inst✝¹ : (tensorObj Y₁ Y₂).HasTensor Y₃
inst✝ : Y₁.HasTensor (tensorObj Y₂ Y₃)
j : I
A Z : C
f g : Z ⊗ tensorObj X₁ (tensorObj X₂ X₃) j ⟶ A
H : X₁.HasGoodTensorTensor₂₃ X₂ X₃
hZ : HasLeftTensor₃ObjExt Z X₁ X₂ X₃ j
h :
  ∀ (i₁ i₂ i₃ : I) (h : i₁ + i₂ + i₃ = j),
    Z ◁ ιTensorObj₃ X₁ X₂ X₃ i₁ i₂ i₃ j h ≫ f = Z ◁ ιTensorObj₃ X₁ X₂ X₃ i₁ i₂ i₃ j h ≫ g
⊢ ∀ (j_1 : Discrete ↑(r₁₂₃ ⁻¹' {j})),
    (((curriedTensor C).obj Z).mapCocone
                (cofan₃MapBifunctorBifunctor₂₃MapObj (curriedTensor C) (curriedTensor C) ρ₂₃ X₁ X₂ X₃ j)).ι.app
          j_1 ≫
        f =
      (((curriedTensor C).obj Z).mapCocone
                (cofan₃MapBifunctorBifunctor₂₃MapObj (curriedTensor C) (curriedTensor C) ρ₂₃ X₁ X₂ X₃ j)).ι.app
          j_1 ≫
        g
state_after: I : Type u
inst✝¹⁰ : AddMonoid I
C : Type u_1
inst✝⁹ : Category.{u_2, u_1} C
inst✝⁸ : MonoidalCategory C
Z✝ : C
X₁ X₂ X₃ : GradedObject I C
inst✝⁷ : X₁.HasTensor X₂
inst✝⁶ : X₂.HasTensor X₃
inst✝⁵ : (tensorObj X₁ X₂).HasTensor X₃
inst✝⁴ : X₁.HasTensor (tensorObj X₂ X₃)
Y₁ Y₂ Y₃ : GradedObject I C
inst✝³ : Y₁.HasTensor Y₂
inst✝² : Y₂.HasTensor Y₃
inst✝¹ : (tensorObj Y₁ Y₂).HasTensor Y₃
inst✝ : Y₁.HasTensor (tensorObj Y₂ Y₃)
j : I
A Z : C
f g : Z ⊗ tensorObj X₁ (tensorObj X₂ X₃) j ⟶ A
H : X₁.HasGoodTensorTensor₂₃ X₂ X₃
hZ : HasLeftTensor₃ObjExt Z X₁ X₂ X₃ j
h :
  ∀ (i₁ i₂ i₃ : I) (h : i₁ + i₂ + i₃ = j),
    Z ◁ ιTensorObj₃ X₁ X₂ X₃ i₁ i₂ i₃ j h ≫ f = Z ◁ ιTensorObj₃ X₁ X₂ X₃ i₁ i₂ i₃ j h ≫ g
i₁ i₂ i₃ : I
hi : (i₁, i₂, i₃) ∈ r₁₂₃ ⁻¹' {j}
⊢ (((curriedTensor C).obj Z).mapCocone
              (cofan₃MapBifunctorBifunctor₂₃MapObj (curriedTensor C) (curriedTensor C) ρ₂₃ X₁ X₂ X₃ j)).ι.app
        { as := ⟨(i₁, i₂, i₃), hi⟩ } ≫
      f =
    (((curriedTensor C).obj Z).mapCocone
              (cofan₃MapBifunctorBifunctor₂₃MapObj (curriedTensor C) (curriedTensor C) ρ₂₃ X₁ X₂ X₃ j)).ι.app
        { as := ⟨(i₁, i₂, i₃), hi⟩ } ≫
      g
tactic: intro ⟨⟨i₁, i₂, i₃⟩, hi⟩
state_before: I : Type u
inst✝¹⁰ : AddMonoid I
C : Type u_1
inst✝⁹ : Category.{u_2, u_1} C
inst✝⁸ : MonoidalCategory C
Z✝ : C
X₁ X₂ X₃ : GradedObject I C
inst✝⁷ : X₁.HasTensor X₂
inst✝⁶ : X₂.HasTensor X₃
inst✝⁵ : (tensorObj X₁ X₂).HasTensor X₃
inst✝⁴ : X₁.HasTensor (tensorObj X₂ X₃)
Y₁ Y₂ Y₃ : GradedObject I C
inst✝³ : Y₁.HasTensor Y₂
inst✝² : Y₂.HasTensor Y₃
inst✝¹ : (tensorObj Y₁ Y₂).HasTensor Y₃
inst✝ : Y₁.HasTensor (tensorObj Y₂ Y₃)
j : I
A Z : C
f g : Z ⊗ tensorObj X₁ (tensorObj X₂ X₃) j ⟶ A
H : X₁.HasGoodTensorTensor₂₃ X₂ X₃
hZ : HasLeftTensor₃ObjExt Z X₁ X₂ X₃ j
h :
  ∀ (i₁ i₂ i₃ : I) (h : i₁ + i₂ + i₃ = j),
    Z ◁ ιTensorObj₃ X₁ X₂ X₃ i₁ i₂ i₃ j h ≫ f = Z ◁ ιTensorObj₃ X₁ X₂ X₃ i₁ i₂ i₃ j h ≫ g
i₁ i₂ i₃ : I
hi : (i₁, i₂, i₃) ∈ r₁₂₃ ⁻¹' {j}
⊢ (((curriedTensor C).obj Z).mapCocone
              (cofan₃MapBifunctorBifunctor₂₃MapObj (curriedTensor C) (curriedTensor C) ρ₂₃ X₁ X₂ X₃ j)).ι.app
        { as := ⟨(i₁, i₂, i₃), hi⟩ } ≫
      f =
    (((curriedTensor C).obj Z).mapCocone
              (cofan₃MapBifunctorBifunctor₂₃MapObj (curriedTensor C) (curriedTensor C) ρ₂₃ X₁ X₂ X₃ j)).ι.app
        { as := ⟨(i₁, i₂, i₃), hi⟩ } ≫
      g
state_after: no goals
tactic: exact h _ _ _ hi