Theorem: TensorProduct.vanishesTrivially_of_sum_tmul_eq_zero_of_rTensor_injective
File: Mathlib/LinearAlgebra/TensorProduct/Vanishing.lean

tactic: have mem_M' i : m i ∈ span R (Set.range m) := subset_span ⟨i, rfl⟩
state_before: R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
⊢ VanishesTrivially R m n
state_after: R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
⊢ VanishesTrivially R m n

tactic: set m' : ι → span R (Set.range m) := Subtype.coind m mem_M' with m'_eq
state_before: R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
⊢ VanishesTrivially R m n
state_after: R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
⊢ VanishesTrivially R m n

tactic: have hm' : span R (Set.range m') = ⊤ := by
  apply map_injective_of_injective (injective_subtype (span R (Set.range m)))
  rw [Submodule.map_span, Submodule.map_top, range_subtype, coeSubtype, ← Set.range_comp]
  rfl
state_before: R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
⊢ VanishesTrivially R m n
state_after: R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
hm' : span R (Set.range m') = ⊤
⊢ VanishesTrivially R m n

tactic: have hm'n : ∑ i, m' i ⊗ₜ n i = (0 : span R (Set.range m) ⊗[R] N) := by
  apply hm
  simp only [m'_eq, map_sum, rTensor_tmul, coeSubtype, Subtype.coind_coe, _root_.map_zero, hmn]
state_before: R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
hm' : span R (Set.range m') = ⊤
⊢ VanishesTrivially R m n
state_after: R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
hm' : span R (Set.range m') = ⊤
hm'n : ∑ i : ι, m' i ⊗ₜ[R] n i = 0
⊢ VanishesTrivially R m n

tactic: have : VanishesTrivially R m' n := vanishesTrivially_of_sum_tmul_eq_zero R hm' hm'n
state_before: R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
hm' : span R (Set.range m') = ⊤
hm'n : ∑ i : ι, m' i ⊗ₜ[R] n i = 0
⊢ VanishesTrivially R m n
state_after: R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
hm' : span R (Set.range m') = ⊤
hm'n : ∑ i : ι, m' i ⊗ₜ[R] n i = 0
this : VanishesTrivially R m' n
⊢ VanishesTrivially R m n

tactic: unfold VanishesTrivially at this ⊢
state_before: R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
hm' : span R (Set.range m') = ⊤
hm'n : ∑ i : ι, m' i ⊗ₜ[R] n i = 0
this : VanishesTrivially R m' n
⊢ VanishesTrivially R m n
state_after: R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
hm' : span R (Set.range m') = ⊤
hm'n : ∑ i : ι, m' i ⊗ₜ[R] n i = 0
this : ∃ κ x a y, (∀ (i : ι), n i = ∑ j : κ, a i j • y j) ∧ ∀ (j : κ), ∑ i : ι, a i j • m' i = 0
⊢ ∃ κ x a y, (∀ (i : ι), n i = ∑ j : κ, a i j • y j) ∧ ∀ (j : κ), ∑ i : ι, a i j • m i = 0

tactic: convert this with κ _ a y j
state_before: R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
hm' : span R (Set.range m') = ⊤
hm'n : ∑ i : ι, m' i ⊗ₜ[R] n i = 0
this : ∃ κ x a y, (∀ (i : ι), n i = ∑ j : κ, a i j • y j) ∧ ∀ (j : κ), ∑ i : ι, a i j • m' i = 0
⊢ ∃ κ x a y, (∀ (i : ι), n i = ∑ j : κ, a i j • y j) ∧ ∀ (j : κ), ∑ i : ι, a i j • m i = 0
state_after: case h.e'_2.h.h.e'_2.h.h.e'_2.h.h.e'_2.h.h.e'_2.h.a
R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
hm' : span R (Set.range m') = ⊤
hm'n : ∑ i : ι, m' i ⊗ₜ[R] n i = 0
this : ∃ κ x a y, (∀ (i : ι), n i = ∑ j : κ, a i j • y j) ∧ ∀ (j : κ), ∑ i : ι, a i j • m' i = 0
κ : Type u
x✝ : Fintype κ
a : ι → κ → R
y : κ → N
j : κ
⊢ ∑ i : ι, a i j • m i = 0 ↔ ∑ i : ι, a i j • m' i = 0

tactic: convert (injective_iff_map_eq_zero' _).mp (injective_subtype (span R (Set.range m))) _
state_before: case h.e'_2.h.h.e'_2.h.h.e'_2.h.h.e'_2.h.h.e'_2.h.a
R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
hm' : span R (Set.range m') = ⊤
hm'n : ∑ i : ι, m' i ⊗ₜ[R] n i = 0
this : ∃ κ x a y, (∀ (i : ι), n i = ∑ j : κ, a i j • y j) ∧ ∀ (j : κ), ∑ i : ι, a i j • m' i = 0
κ : Type u
x✝ : Fintype κ
a : ι → κ → R
y : κ → N
j : κ
⊢ ∑ i : ι, a i j • m i = 0 ↔ ∑ i : ι, a i j • m' i = 0
state_after: case h.e'_1.h.e'_2
R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
hm' : span R (Set.range m') = ⊤
hm'n : ∑ i : ι, m' i ⊗ₜ[R] n i = 0
this : ∃ κ x a y, (∀ (i : ι), n i = ∑ j : κ, a i j • y j) ∧ ∀ (j : κ), ∑ i : ι, a i j • m' i = 0
κ : Type u
x✝ : Fintype κ
a : ι → κ → R
y : κ → N
j : κ
⊢ ∑ i : ι, a i j • m i = (span R (Set.range m)).subtype (∑ i : ι, a i j • m' i)

tactic: simp [m'_eq]
state_before: case h.e'_1.h.e'_2
R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
hm' : span R (Set.range m') = ⊤
hm'n : ∑ i : ι, m' i ⊗ₜ[R] n i = 0
this : ∃ κ x a y, (∀ (i : ι), n i = ∑ j : κ, a i j • y j) ∧ ∀ (j : κ), ∑ i : ι, a i j • m' i = 0
κ : Type u
x✝ : Fintype κ
a : ι → κ → R
y : κ → N
j : κ
⊢ ∑ i : ι, a i j • m i = (span R (Set.range m)).subtype (∑ i : ι, a i j • m' i)
state_after: no goals

tactic: apply map_injective_of_injective (injective_subtype (span R (Set.range m)))
state_before: R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
⊢ span R (Set.range m') = ⊤
state_after: case a
R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
⊢ Submodule.map (span R (Set.range m)).subtype (span R (Set.range m')) = Submodule.map (span R (Set.range m)).subtype ⊤

tactic: rw [Submodule.map_span, Submodule.map_top, range_subtype, coeSubtype, ← Set.range_comp]
state_before: case a
R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
⊢ Submodule.map (span R (Set.range m)).subtype (span R (Set.range m')) = Submodule.map (span R (Set.range m)).subtype ⊤
state_after: case a
R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
⊢ span R (Set.range (Subtype.val ∘ m')) = span R (Set.range m)

tactic: rfl
state_before: case a
R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
⊢ span R (Set.range (Subtype.val ∘ m')) = span R (Set.range m)
state_after: no goals

tactic: apply hm
state_before: R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
hm' : span R (Set.range m') = ⊤
⊢ ∑ i : ι, m' i ⊗ₜ[R] n i = 0
state_after: case a
R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
hm' : span R (Set.range m') = ⊤
⊢ (rTensor N (span R (Set.range m)).subtype) (∑ i : ι, m' i ⊗ₜ[R] n i) = (rTensor N (span R (Set.range m)).subtype) 0

tactic: simp only [m'_eq, map_sum, rTensor_tmul, coeSubtype, Subtype.coind_coe, _root_.map_zero, hmn]
state_before: case a
R : Type u
inst✝⁵ : CommRing R
M : Type u
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
N : Type u
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Type u
inst✝ : Fintype ι
m : ι → M
n : ι → N
hm : Injective ⇑(rTensor N (span R (Set.range m)).subtype)
hmn : ∑ i : ι, m i ⊗ₜ[R] n i = 0
mem_M' : ∀ (i : ι), m i ∈ span R (Set.range m)
m' : ι → ↥(span R (Set.range m)) := Subtype.coind m mem_M'
m'_eq : m' = Subtype.coind m mem_M'
hm' : span R (Set.range m') = ⊤
⊢ (rTensor N (span R (Set.range m)).subtype) (∑ i : ι, m' i ⊗ₜ[R] n i) = (rTensor N (span R (Set.range m)).subtype) 0
state_after: no goals