Theorem: TensorProduct.exists_multiset
File: Mathlib/LinearAlgebra/TensorProduct/Finiteness.lean

tactic: induction x with
| zero => exact ⟨0, by simp⟩
| tmul x y => exact ⟨{(x, y)}, by simp⟩
| add x y hx hy =>
  obtain ⟨Sx, hx⟩ := hx
  obtain ⟨Sy, hy⟩ := hy
  exact ⟨Sx + Sy, by rw [Multiset.map_add, Multiset.sum_add, hx, hy]⟩
state_before: R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid N
inst✝¹ : Module R M
inst✝ : Module R N
M₁ M₂ : Submodule R M
N₁ N₂ : Submodule R N
x : M ⊗[R] N
⊢ ∃ S, x = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) S).sum
state_after: no goals

tactic: exact ⟨0, by simp⟩
state_before: case zero
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid N
inst✝¹ : Module R M
inst✝ : Module R N
M₁ M₂ : Submodule R M
N₁ N₂ : Submodule R N
⊢ ∃ S, 0 = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) S).sum
state_after: no goals

tactic: simp
state_before: R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid N
inst✝¹ : Module R M
inst✝ : Module R N
M₁ M₂ : Submodule R M
N₁ N₂ : Submodule R N
⊢ 0 = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) 0).sum
state_after: no goals

tactic: exact ⟨{(x, y)}, by simp⟩
state_before: case tmul
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid N
inst✝¹ : Module R M
inst✝ : Module R N
M₁ M₂ : Submodule R M
N₁ N₂ : Submodule R N
x : M
y : N
⊢ ∃ S, x ⊗ₜ[R] y = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) S).sum
state_after: no goals

tactic: simp
state_before: R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid N
inst✝¹ : Module R M
inst✝ : Module R N
M₁ M₂ : Submodule R M
N₁ N₂ : Submodule R N
x : M
y : N
⊢ x ⊗ₜ[R] y = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) {(x, y)}).sum
state_after: no goals

tactic: obtain ⟨Sx, hx⟩ := hx
state_before: case add
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid N
inst✝¹ : Module R M
inst✝ : Module R N
M₁ M₂ : Submodule R M
N₁ N₂ : Submodule R N
x y : M ⊗[R] N
hx : ∃ S, x = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) S).sum
hy : ∃ S, y = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) S).sum
⊢ ∃ S, x + y = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) S).sum
state_after: case add.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid N
inst✝¹ : Module R M
inst✝ : Module R N
M₁ M₂ : Submodule R M
N₁ N₂ : Submodule R N
x y : M ⊗[R] N
hy : ∃ S, y = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) S).sum
Sx : Multiset (M × N)
hx : x = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) Sx).sum
⊢ ∃ S, x + y = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) S).sum

tactic: obtain ⟨Sy, hy⟩ := hy
state_before: case add.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid N
inst✝¹ : Module R M
inst✝ : Module R N
M₁ M₂ : Submodule R M
N₁ N₂ : Submodule R N
x y : M ⊗[R] N
hy : ∃ S, y = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) S).sum
Sx : Multiset (M × N)
hx : x = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) Sx).sum
⊢ ∃ S, x + y = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) S).sum
state_after: case add.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid N
inst✝¹ : Module R M
inst✝ : Module R N
M₁ M₂ : Submodule R M
N₁ N₂ : Submodule R N
x y : M ⊗[R] N
Sx : Multiset (M × N)
hx : x = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) Sx).sum
Sy : Multiset (M × N)
hy : y = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) Sy).sum
⊢ ∃ S, x + y = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) S).sum

tactic: exact ⟨Sx + Sy, by rw [Multiset.map_add, Multiset.sum_add, hx, hy]⟩
state_before: case add.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid N
inst✝¹ : Module R M
inst✝ : Module R N
M₁ M₂ : Submodule R M
N₁ N₂ : Submodule R N
x y : M ⊗[R] N
Sx : Multiset (M × N)
hx : x = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) Sx).sum
Sy : Multiset (M × N)
hy : y = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) Sy).sum
⊢ ∃ S, x + y = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) S).sum
state_after: no goals

tactic: rw [Multiset.map_add, Multiset.sum_add, hx, hy]
state_before: R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁴ : CommSemiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid N
inst✝¹ : Module R M
inst✝ : Module R N
M₁ M₂ : Submodule R M
N₁ N₂ : Submodule R N
x y : M ⊗[R] N
Sx : Multiset (M × N)
hx : x = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) Sx).sum
Sy : Multiset (M × N)
hy : y = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) Sy).sum
⊢ x + y = (Multiset.map (fun i => i.1 ⊗ₜ[R] i.2) (Sx + Sy)).sum
state_after: no goals