Theorem: TensorAlgebra.toDirectSum_tensorPower_tprod
File: Mathlib/LinearAlgebra/TensorAlgebra/ToTensorPower.lean

Proof steps:
state_before: R : Type u_1
M : Type u_2
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
n : ℕ
x : Fin n → M
⊢ toDirectSum ((tprod R M n) x) = (DirectSum.of (fun i => ⨂[R]^i M) n) ((PiTensorProduct.tprod R) x)
state_after: R : Type u_1
M : Type u_2
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
n : ℕ
x : Fin n → M
⊢ (List.ofFn (⇑toDirectSum ∘ fun i => (ι R) (x i))).prod =
    (DirectSum.of (fun i => ⨂[R]^i M) n) ((PiTensorProduct.tprod R) x)
tactic: rw [tprod_apply, map_list_prod, List.map_ofFn]
state_before: R : Type u_1
M : Type u_2
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
n : ℕ
x : Fin n → M
⊢ (List.ofFn (⇑toDirectSum ∘ fun i => (ι R) (x i))).prod =
    (DirectSum.of (fun i => ⨂[R]^i M) n) ((PiTensorProduct.tprod R) x)
state_after: R : Type u_1
M : Type u_2
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
n : ℕ
x : Fin n → M
⊢ (List.ofFn fun x_1 => (DirectSum.of (fun n => ⨂[R]^n M) 1) ((PiTensorProduct.tprod R) fun x_2 => x x_1)).prod =
    (DirectSum.of (fun i => ⨂[R]^i M) n) ((PiTensorProduct.tprod R) x)
tactic: simp_rw [Function.comp, toDirectSum_ι]
state_before: R : Type u_1
M : Type u_2
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
n : ℕ
x : Fin n → M
⊢ (List.ofFn fun x_1 => (DirectSum.of (fun n => ⨂[R]^n M) 1) ((PiTensorProduct.tprod R) fun x_2 => x x_1)).prod =
    (DirectSum.of (fun i => ⨂[R]^i M) n) ((PiTensorProduct.tprod R) x)
state_after: R : Type u_1
M : Type u_2
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
n : ℕ
x : Fin n → M
⊢ (DirectSum.of (fun n => ⨂[R]^n M) ((List.finRange n).dProdIndex fun x => 1))
      ((List.finRange n).dProd (fun x => 1) fun x_1 => (PiTensorProduct.tprod R) fun x_2 => x x_1) =
    (DirectSum.of (fun i => ⨂[R]^i M) n) ((PiTensorProduct.tprod R) x)
tactic: rw [DirectSum.list_prod_ofFn_of_eq_dProd]
state_before: R : Type u_1
M : Type u_2
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
n : ℕ
x : Fin n → M
⊢ (DirectSum.of (fun n => ⨂[R]^n M) ((List.finRange n).dProdIndex fun x => 1))
      ((List.finRange n).dProd (fun x => 1) fun x_1 => (PiTensorProduct.tprod R) fun x_2 => x x_1) =
    (DirectSum.of (fun i => ⨂[R]^i M) n) ((PiTensorProduct.tprod R) x)
state_after: case h
R : Type u_1
M : Type u_2
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
n : ℕ
x : Fin n → M
⊢ GradedMonoid.mk ((List.finRange n).dProdIndex fun x => 1)
      ((List.finRange n).dProd (fun x => 1) fun x_1 => (PiTensorProduct.tprod R) fun x_2 => x x_1) =
    GradedMonoid.mk n ((PiTensorProduct.tprod R) x)
tactic: apply DirectSum.of_eq_of_gradedMonoid_eq
state_before: case h
R : Type u_1
M : Type u_2
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
n : ℕ
x : Fin n → M
⊢ GradedMonoid.mk ((List.finRange n).dProdIndex fun x => 1)
      ((List.finRange n).dProd (fun x => 1) fun x_1 => (PiTensorProduct.tprod R) fun x_2 => x x_1) =
    GradedMonoid.mk n ((PiTensorProduct.tprod R) x)
state_after: case h
R : Type u_1
M : Type u_2
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
n : ℕ
x : Fin n → M
⊢ (List.map (fun a => GradedMonoid.mk 1 ((PiTensorProduct.tprod R) fun x_1 => x a)) (List.finRange n)).prod =
    GradedMonoid.mk n ((PiTensorProduct.tprod R) x)
tactic: rw [GradedMonoid.mk_list_dProd]
state_before: case h
R : Type u_1
M : Type u_2
inst✝² : CommSemiring R
inst✝¹ : AddCommMonoid M
inst✝ : Module R M
n : ℕ
x : Fin n → M
⊢ (List.map (fun a => GradedMonoid.mk 1 ((PiTensorProduct.tprod R) fun x_1 => x a)) (List.finRange n)).prod =
    GradedMonoid.mk n ((PiTensorProduct.tprod R) x)
state_after: no goals
tactic: rw [TensorPower.list_prod_gradedMonoid_mk_single]