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

Proof steps:
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
s : Set (M ⊗[R] N)
hs : s.Finite
⊢ ∃ M' N', Module.Finite R ↥M' ∧ Module.Finite R ↥N' ∧ s ⊆ ↑(LinearMap.range (mapIncl M' N'))
state_after: 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 : Set (M ⊗[R] N)
hs : s.Finite
⊢ ∃ M' N', M'.FG ∧ N'.FG ∧ s ⊆ ↑(LinearMap.range (mapIncl M' N'))
tactic: simp_rw [Module.Finite.iff_fg]
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
s : Set (M ⊗[R] N)
hs : s.Finite
⊢ ∃ M' N', M'.FG ∧ N'.FG ∧ s ⊆ ↑(LinearMap.range (mapIncl M' N'))
state_after: 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 : Set (M ⊗[R] N)
hs : s.Finite
⊢ ∀ {a : M ⊗[R] N} {s : Set (M ⊗[R] N)},
    a ∉ s →
      s.Finite →
        (∃ M' N', M'.FG ∧ N'.FG ∧ s ⊆ ↑(LinearMap.range (mapIncl M' N'))) →
          ∃ M' N', M'.FG ∧ N'.FG ∧ insert a s ⊆ ↑(LinearMap.range (mapIncl M' N'))
tactic: refine hs.induction_on ⟨_, _, fg_bot, fg_bot, Set.empty_subset _⟩ ?_
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
s : Set (M ⊗[R] N)
hs : s.Finite
⊢ ∀ {a : M ⊗[R] N} {s : Set (M ⊗[R] N)},
    a ∉ s →
      s.Finite →
        (∃ M' N', M'.FG ∧ N'.FG ∧ s ⊆ ↑(LinearMap.range (mapIncl M' N'))) →
          ∃ M' N', M'.FG ∧ N'.FG ∧ insert a s ⊆ ↑(LinearMap.range (mapIncl M' N'))
state_after: case intro.intro.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
s✝ : Set (M ⊗[R] N)
hs : s✝.Finite
a : M ⊗[R] N
s : Set (M ⊗[R] N)
M' : Submodule R M
N' : Submodule R N
hM' : M'.FG
hN' : N'.FG
h : s ⊆ ↑(LinearMap.range (mapIncl M' N'))
⊢ ∃ M' N', M'.FG ∧ N'.FG ∧ insert a s ⊆ ↑(LinearMap.range (mapIncl M' N'))
tactic: rintro a s - - ⟨M', N', hM', hN', h⟩
state_before: case intro.intro.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
s✝ : Set (M ⊗[R] N)
hs : s✝.Finite
a : M ⊗[R] N
s : Set (M ⊗[R] N)
M' : Submodule R M
N' : Submodule R N
hM' : M'.FG
hN' : N'.FG
h : s ⊆ ↑(LinearMap.range (mapIncl M' N'))
⊢ ∃ M' N', M'.FG ∧ N'.FG ∧ insert a s ⊆ ↑(LinearMap.range (mapIncl M' N'))
state_after: case intro.intro.intro.intro.refine_1
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✝ : Set (M ⊗[R] N)
hs : s✝.Finite
a : M ⊗[R] N
s : Set (M ⊗[R] N)
M' : Submodule R M
N' : Submodule R N
hM' : M'.FG
hN' : N'.FG
h : s ⊆ ↑(LinearMap.range (mapIncl M' N'))
⊢ ∃ M' N', M'.FG ∧ N'.FG ∧ insert 0 s ⊆ ↑(LinearMap.range (mapIncl M' N'))

case intro.intro.intro.intro.refine_2
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✝ : Set (M ⊗[R] N)
hs : s✝.Finite
a : M ⊗[R] N
s : Set (M ⊗[R] N)
M' : Submodule R M
N' : Submodule R N
hM' : M'.FG
hN' : N'.FG
h : s ⊆ ↑(LinearMap.range (mapIncl M' N'))
x : M
y : N
⊢ ∃ M' N', M'.FG ∧ N'.FG ∧ insert (x ⊗ₜ[R] y) s ⊆ ↑(LinearMap.range (mapIncl M' N'))

case intro.intro.intro.intro.refine_3
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✝ : Set (M ⊗[R] N)
hs : s✝.Finite
a : M ⊗[R] N
s : Set (M ⊗[R] N)
M' : Submodule R M
N' : Submodule R N
hM' : M'.FG
hN' : N'.FG
h : s ⊆ ↑(LinearMap.range (mapIncl M' N'))
x y : M ⊗[R] N
hx : ∃ M' N', M'.FG ∧ N'.FG ∧ insert x s ⊆ ↑(LinearMap.range (mapIncl M' N'))
hy : ∃ M' N', M'.FG ∧ N'.FG ∧ insert y s ⊆ ↑(LinearMap.range (mapIncl M' N'))
⊢ ∃ M' N', M'.FG ∧ N'.FG ∧ insert (x + y) s ⊆ ↑(LinearMap.range (mapIncl M' N'))
tactic: refine TensorProduct.induction_on a ?_ (fun x y ↦ ?_) fun x y hx hy ↦ ?_