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

tactic: induction x with
| zero => exact ⟨0, by simp⟩
| tmul x y => exact ⟨Finsupp.single x y, by simp⟩
| add x y hx hy =>
  obtain ⟨Sx, hx⟩ := hx
  obtain ⟨Sy, hy⟩ := hy
  use Sx + Sy
  rw [hx, hy]
  exact (Finsupp.sum_add_index' (by simp) TensorProduct.tmul_add).symm
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 = S.sum fun m n => m ⊗ₜ[R] n
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 = S.sum fun m n => m ⊗ₜ[R] n
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 = Finsupp.sum 0 fun m n => m ⊗ₜ[R] n
state_after: no goals

tactic: exact ⟨Finsupp.single 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 = S.sum fun m n => m ⊗ₜ[R] n
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 = (Finsupp.single x y).sum fun m n => m ⊗ₜ[R] n
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 = S.sum fun m n => m ⊗ₜ[R] n
hy : ∃ S, y = S.sum fun m n => m ⊗ₜ[R] n
⊢ ∃ S, x + y = S.sum fun m n => m ⊗ₜ[R] n
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 = S.sum fun m n => m ⊗ₜ[R] n
Sx : M →₀ N
hx : x = Sx.sum fun m n => m ⊗ₜ[R] n
⊢ ∃ S, x + y = S.sum fun m n => m ⊗ₜ[R] n

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 = S.sum fun m n => m ⊗ₜ[R] n
Sx : M →₀ N
hx : x = Sx.sum fun m n => m ⊗ₜ[R] n
⊢ ∃ S, x + y = S.sum fun m n => m ⊗ₜ[R] n
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 : M →₀ N
hx : x = Sx.sum fun m n => m ⊗ₜ[R] n
Sy : M →₀ N
hy : y = Sy.sum fun m n => m ⊗ₜ[R] n
⊢ ∃ S, x + y = S.sum fun m n => m ⊗ₜ[R] n

tactic: use Sx + Sy
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 : M →₀ N
hx : x = Sx.sum fun m n => m ⊗ₜ[R] n
Sy : M →₀ N
hy : y = Sy.sum fun m n => m ⊗ₜ[R] n
⊢ ∃ S, x + y = S.sum fun m n => m ⊗ₜ[R] n
state_after: case h
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 : M →₀ N
hx : x = Sx.sum fun m n => m ⊗ₜ[R] n
Sy : M →₀ N
hy : y = Sy.sum fun m n => m ⊗ₜ[R] n
⊢ x + y = (Sx + Sy).sum fun m n => m ⊗ₜ[R] n

tactic: rw [hx, hy]
state_before: case h
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 : M →₀ N
hx : x = Sx.sum fun m n => m ⊗ₜ[R] n
Sy : M →₀ N
hy : y = Sy.sum fun m n => m ⊗ₜ[R] n
⊢ x + y = (Sx + Sy).sum fun m n => m ⊗ₜ[R] n
state_after: case h
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 : M →₀ N
hx : x = Sx.sum fun m n => m ⊗ₜ[R] n
Sy : M →₀ N
hy : y = Sy.sum fun m n => m ⊗ₜ[R] n
⊢ ((Sx.sum fun m n => m ⊗ₜ[R] n) + Sy.sum fun m n => m ⊗ₜ[R] n) = (Sx + Sy).sum fun m n => m ⊗ₜ[R] n

tactic: exact (Finsupp.sum_add_index' (by simp) TensorProduct.tmul_add).symm
state_before: case h
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 : M →₀ N
hx : x = Sx.sum fun m n => m ⊗ₜ[R] n
Sy : M →₀ N
hy : y = Sy.sum fun m n => m ⊗ₜ[R] n
⊢ ((Sx.sum fun m n => m ⊗ₜ[R] n) + Sy.sum fun m n => m ⊗ₜ[R] n) = (Sx + Sy).sum fun m n => m ⊗ₜ[R] n
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 y : M ⊗[R] N
Sx : M →₀ N
hx : x = Sx.sum fun m n => m ⊗ₜ[R] n
Sy : M →₀ N
hy : y = Sy.sum fun m n => m ⊗ₜ[R] n
⊢ ∀ (a : M), a ⊗ₜ[R] 0 = 0
state_after: no goals