Theorem: PiTensorProduct.mul_assoc
File: Mathlib/RingTheory/PiTensorProduct.lean

Proof steps:
state_before: ι : Type u_1
R' : Type u_2
R : Type u_3
A : ι → Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : (i : ι) → NonUnitalSemiring (A i)
inst✝² : (i : ι) → Module R (A i)
inst✝¹ : ∀ (i : ι), SMulCommClass R (A i) (A i)
inst✝ : ∀ (i : ι), IsScalarTower R (A i) (A i)
x y z : ⨂[R] (i : ι), A i
⊢ (mul ((mul x) y)) z = (mul x) ((mul y) z)
state_after: ι : Type u_1
R' : Type u_2
R : Type u_3
A : ι → Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : (i : ι) → NonUnitalSemiring (A i)
inst✝² : (i : ι) → Module R (A i)
inst✝¹ : ∀ (i : ι), SMulCommClass R (A i) (A i)
inst✝ : ∀ (i : ι), IsScalarTower R (A i) (A i)
x y z : ⨂[R] (i : ι), A i
⊢ (LinearMap.llcomp R (⨂[R] (i : ι), A i) (⨂[R] (i : ι), A i) ((⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i)) mul ∘ₗ
      mul =
    (((LinearMap.llcomp R (⨂[R] (i : ι), A i) ((⨂[R] (i : ι), A i) →ₗ[R] (⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i)
            ((⨂[R] (i : ι), A i) →ₗ[R] (⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i))
          LinearMap.lflip)
        ((LinearMap.llcomp R (⨂[R] (i : ι), A i) (⨂[R] (i : ι), A i) ((⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i))
            mul.flip ∘ₗ
          mul)).flip
tactic: suffices LinearMap.llcomp R _ _ _ mul ∘ₗ mul =
      (LinearMap.llcomp R _ _ _ LinearMap.lflip <| LinearMap.llcomp R _ _ _ mul.flip ∘ₗ mul).flip by
    exact DFunLike.congr_fun (DFunLike.congr_fun (DFunLike.congr_fun this x) y) z
state_before: ι : Type u_1
R' : Type u_2
R : Type u_3
A : ι → Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : (i : ι) → NonUnitalSemiring (A i)
inst✝² : (i : ι) → Module R (A i)
inst✝¹ : ∀ (i : ι), SMulCommClass R (A i) (A i)
inst✝ : ∀ (i : ι), IsScalarTower R (A i) (A i)
x y z : ⨂[R] (i : ι), A i
⊢ (LinearMap.llcomp R (⨂[R] (i : ι), A i) (⨂[R] (i : ι), A i) ((⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i)) mul ∘ₗ
      mul =
    (((LinearMap.llcomp R (⨂[R] (i : ι), A i) ((⨂[R] (i : ι), A i) →ₗ[R] (⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i)
            ((⨂[R] (i : ι), A i) →ₗ[R] (⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i))
          LinearMap.lflip)
        ((LinearMap.llcomp R (⨂[R] (i : ι), A i) (⨂[R] (i : ι), A i) ((⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i))
            mul.flip ∘ₗ
          mul)).flip
state_after: case H.H.H.H.H.H
ι : Type u_1
R' : Type u_2
R : Type u_3
A : ι → Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : (i : ι) → NonUnitalSemiring (A i)
inst✝² : (i : ι) → Module R (A i)
inst✝¹ : ∀ (i : ι), SMulCommClass R (A i) (A i)
inst✝ : ∀ (i : ι), IsScalarTower R (A i) (A i)
x✝ y✝ z✝ : ⨂[R] (i : ι), A i
x y z : (i : ι) → A i
⊢ (((((((LinearMap.llcomp R (⨂[R] (i : ι), A i) (⨂[R] (i : ι), A i) ((⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i))
                          mul ∘ₗ
                        mul).compMultilinearMap
                    (tprod R))
                  x).compMultilinearMap
              (tprod R))
            y).compMultilinearMap
        (tprod R))
      z =
    ((((((((LinearMap.llcomp R (⨂[R] (i : ι), A i)
                              ((⨂[R] (i : ι), A i) →ₗ[R] (⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i)
                              ((⨂[R] (i : ι), A i) →ₗ[R] (⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i))
                            LinearMap.lflip)
                          ((LinearMap.llcomp R (⨂[R] (i : ι), A i) (⨂[R] (i : ι), A i)
                                ((⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i))
                              mul.flip ∘ₗ
                            mul)).flip.compMultilinearMap
                    (tprod R))
                  x).compMultilinearMap
              (tprod R))
            y).compMultilinearMap
        (tprod R))
      z
tactic: ext x y z
state_before: case H.H.H.H.H.H
ι : Type u_1
R' : Type u_2
R : Type u_3
A : ι → Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : (i : ι) → NonUnitalSemiring (A i)
inst✝² : (i : ι) → Module R (A i)
inst✝¹ : ∀ (i : ι), SMulCommClass R (A i) (A i)
inst✝ : ∀ (i : ι), IsScalarTower R (A i) (A i)
x✝ y✝ z✝ : ⨂[R] (i : ι), A i
x y z : (i : ι) → A i
⊢ (((((((LinearMap.llcomp R (⨂[R] (i : ι), A i) (⨂[R] (i : ι), A i) ((⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i))
                          mul ∘ₗ
                        mul).compMultilinearMap
                    (tprod R))
                  x).compMultilinearMap
              (tprod R))
            y).compMultilinearMap
        (tprod R))
      z =
    ((((((((LinearMap.llcomp R (⨂[R] (i : ι), A i)
                              ((⨂[R] (i : ι), A i) →ₗ[R] (⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i)
                              ((⨂[R] (i : ι), A i) →ₗ[R] (⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i))
                            LinearMap.lflip)
                          ((LinearMap.llcomp R (⨂[R] (i : ι), A i) (⨂[R] (i : ι), A i)
                                ((⨂[R] (i : ι), A i) →ₗ[R] ⨂[R] (i : ι), A i))
                              mul.flip ∘ₗ
                            mul)).flip.compMultilinearMap
                    (tprod R))
                  x).compMultilinearMap
              (tprod R))
            y).compMultilinearMap
        (tprod R))
      z
state_after: case H.H.H.H.H.H
ι : Type u_1
R' : Type u_2
R : Type u_3
A : ι → Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : (i : ι) → NonUnitalSemiring (A i)
inst✝² : (i : ι) → Module R (A i)
inst✝¹ : ∀ (i : ι), SMulCommClass R (A i) (A i)
inst✝ : ∀ (i : ι), IsScalarTower R (A i) (A i)
x✝ y✝ z✝ : ⨂[R] (i : ι), A i
x y z : (i : ι) → A i
⊢ (tprod R) x * (tprod R) y * (tprod R) z = (tprod R) x * ((tprod R) y * (tprod R) z)
tactic: dsimp [← mul_def]
state_before: case H.H.H.H.H.H
ι : Type u_1
R' : Type u_2
R : Type u_3
A : ι → Type u_4
inst✝⁴ : CommSemiring R
inst✝³ : (i : ι) → NonUnitalSemiring (A i)
inst✝² : (i : ι) → Module R (A i)
inst✝¹ : ∀ (i : ι), SMulCommClass R (A i) (A i)
inst✝ : ∀ (i : ι), IsScalarTower R (A i) (A i)
x✝ y✝ z✝ : ⨂[R] (i : ι), A i
x y z : (i : ι) → A i
⊢ (tprod R) x * (tprod R) y * (tprod R) z = (tprod R) x * ((tprod R) y * (tprod R) z)
state_after: no goals
tactic: simpa only [tprod_mul_tprod] using congr_arg (tprod R) (mul_assoc x y z)