Theorem: isNoetherian_of_fg_of_noetherian
File: Mathlib/RingTheory/Noetherian.lean

tactic: let ⟨s, hs⟩ := hN
state_before: R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
⊢ IsNoetherian R ↥N
state_after: R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
⊢ IsNoetherian R ↥N

tactic: haveI := Classical.decEq M
state_before: R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
⊢ IsNoetherian R ↥N
state_after: R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this : DecidableEq M
⊢ IsNoetherian R ↥N

tactic: haveI := Classical.decEq R
state_before: R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this : DecidableEq M
⊢ IsNoetherian R ↥N
state_after: R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝ : DecidableEq M
this : DecidableEq R
⊢ IsNoetherian R ↥N

tactic: have : ∀ x ∈ s, x ∈ N := fun x hx => hs ▸ Submodule.subset_span hx
state_before: R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝ : DecidableEq M
this : DecidableEq R
⊢ IsNoetherian R ↥N
state_after: R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ IsNoetherian R ↥N

tactic: refine
  @isNoetherian_of_surjective
    R ((↑s : Set M) → R) N _ _ _ (Pi.module _ _ _) _ ?_ ?_ isNoetherian_pi
state_before: R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ IsNoetherian R ↥N
state_after: case refine_1
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ (↑↑s → R) →ₗ[R] ↥N

case refine_2
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ LinearMap.range ?refine_1 = ⊤

tactic: fapply LinearMap.mk
state_before: case refine_1
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ (↑↑s → R) →ₗ[R] ↥N
state_after: case refine_1.toAddHom
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ AddHom (↑↑s → R) ↥N

case refine_1.map_smul'
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ ∀ (m : R) (x : ↑↑s → R), ?refine_1.toAddHom.toFun (m • x) = (RingHom.id R) m • ?refine_1.toAddHom.toFun x

tactic: fapply AddHom.mk
state_before: case refine_1.toAddHom
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ AddHom (↑↑s → R) ↥N
state_after: case refine_1.toAddHom.toFun
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ (↑↑s → R) → ↥N

case refine_1.toAddHom.map_add'
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ ∀ (x y : ↑↑s → R), ?refine_1.toAddHom.toFun (x + y) = ?refine_1.toAddHom.toFun x + ?refine_1.toAddHom.toFun y

tactic: exact fun f => ⟨∑ i ∈ s.attach, f i • i.1, N.sum_mem fun c _ => N.smul_mem _ <| this _ c.2⟩
state_before: case refine_1.toAddHom.toFun
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ (↑↑s → R) → ↥N
state_after: no goals

tactic: intro f g
state_before: case refine_1.toAddHom.map_add'
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ ∀ (x y : ↑↑s → R), ⟨∑ i ∈ s.attach, (x + y) i • ↑i, ⋯⟩ = ⟨∑ i ∈ s.attach, x i • ↑i, ⋯⟩ + ⟨∑ i ∈ s.attach, y i • ↑i, ⋯⟩
state_after: case refine_1.toAddHom.map_add'
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
f g : ↑↑s → R
⊢ ⟨∑ i ∈ s.attach, (f + g) i • ↑i, ⋯⟩ = ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩ + ⟨∑ i ∈ s.attach, g i • ↑i, ⋯⟩

tactic: apply Subtype.eq
state_before: case refine_1.toAddHom.map_add'
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
f g : ↑↑s → R
⊢ ⟨∑ i ∈ s.attach, (f + g) i • ↑i, ⋯⟩ = ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩ + ⟨∑ i ∈ s.attach, g i • ↑i, ⋯⟩
state_after: case refine_1.toAddHom.map_add'.a
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
f g : ↑↑s → R
⊢ ↑⟨∑ i ∈ s.attach, (f + g) i • ↑i, ⋯⟩ = ↑(⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩ + ⟨∑ i ∈ s.attach, g i • ↑i, ⋯⟩)

tactic: change (∑ i ∈ s.attach, (f i + g i) • _) = _
state_before: case refine_1.toAddHom.map_add'.a
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
f g : ↑↑s → R
⊢ ↑⟨∑ i ∈ s.attach, (f + g) i • ↑i, ⋯⟩ = ↑(⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩ + ⟨∑ i ∈ s.attach, g i • ↑i, ⋯⟩)
state_after: case refine_1.toAddHom.map_add'.a
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
f g : ↑↑s → R
⊢ ∑ i ∈ s.attach, (f i + g i) • ↑i = ↑(⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩ + ⟨∑ i ∈ s.attach, g i • ↑i, ⋯⟩)

tactic: simp only [add_smul, Finset.sum_add_distrib]
state_before: case refine_1.toAddHom.map_add'.a
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
f g : ↑↑s → R
⊢ ∑ i ∈ s.attach, (f i + g i) • ↑i = ↑(⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩ + ⟨∑ i ∈ s.attach, g i • ↑i, ⋯⟩)
state_after: case refine_1.toAddHom.map_add'.a
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
f g : ↑↑s → R
⊢ ∑ x ∈ s.attach, f x • ↑x + ∑ x ∈ s.attach, g x • ↑x = ↑(⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩ + ⟨∑ i ∈ s.attach, g i • ↑i, ⋯⟩)

tactic: rfl
state_before: case refine_1.toAddHom.map_add'.a
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
f g : ↑↑s → R
⊢ ∑ x ∈ s.attach, f x • ↑x + ∑ x ∈ s.attach, g x • ↑x = ↑(⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩ + ⟨∑ i ∈ s.attach, g i • ↑i, ⋯⟩)
state_after: no goals

tactic: intro c f
state_before: case refine_1.map_smul'
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ ∀ (m : R) (x : ↑↑s → R),
    { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯ }.toFun (m • x) =
      (RingHom.id R) m • { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯ }.toFun x
state_after: case refine_1.map_smul'
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
c : R
f : ↑↑s → R
⊢ { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯ }.toFun (c • f) =
    (RingHom.id R) c • { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯ }.toFun f

tactic: apply Subtype.eq
state_before: case refine_1.map_smul'
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
c : R
f : ↑↑s → R
⊢ { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯ }.toFun (c • f) =
    (RingHom.id R) c • { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯ }.toFun f
state_after: case refine_1.map_smul'.a
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
c : R
f : ↑↑s → R
⊢ ↑({ toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯ }.toFun (c • f)) =
    ↑((RingHom.id R) c • { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯ }.toFun f)

tactic: change (∑ i ∈ s.attach, (c • f i) • _) = _
state_before: case refine_1.map_smul'.a
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
c : R
f : ↑↑s → R
⊢ ↑({ toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯ }.toFun (c • f)) =
    ↑((RingHom.id R) c • { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯ }.toFun f)
state_after: case refine_1.map_smul'.a
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
c : R
f : ↑↑s → R
⊢ ∑ i ∈ s.attach, (c • f i) • ↑i =
    ↑((RingHom.id R) c • { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯ }.toFun f)

tactic: simp only [smul_eq_mul, mul_smul]
state_before: case refine_1.map_smul'.a
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
c : R
f : ↑↑s → R
⊢ ∑ i ∈ s.attach, (c • f i) • ↑i =
    ↑((RingHom.id R) c • { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯ }.toFun f)
state_after: case refine_1.map_smul'.a
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
c : R
f : ↑↑s → R
⊢ ∑ x ∈ s.attach, c • f x • ↑x = ↑((RingHom.id R) c • ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩)

tactic: exact Finset.smul_sum.symm
state_before: case refine_1.map_smul'.a
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
c : R
f : ↑↑s → R
⊢ ∑ x ∈ s.attach, c • f x • ↑x = ↑((RingHom.id R) c • ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩)
state_after: no goals

tactic: rw [LinearMap.range_eq_top]
state_before: case refine_2
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ LinearMap.range { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯, map_smul' := ⋯ } = ⊤
state_after: case refine_2
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ Surjective ⇑{ toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯, map_smul' := ⋯ }

tactic: rintro ⟨n, hn⟩
state_before: case refine_2
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ Surjective ⇑{ toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯, map_smul' := ⋯ }
state_after: case refine_2.mk
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
n : M
hn : n ∈ N
⊢ ∃ a, { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯, map_smul' := ⋯ } a = ⟨n, hn⟩

tactic: rw [← hs, ← Set.image_id (s : Set M), Finsupp.mem_span_image_iff_total] at hn
state_before: case refine_2.mk
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
n : M
hn : n ∈ N
⊢ ∃ a, { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯, map_smul' := ⋯ } a = ⟨n, hn⟩
state_after: case refine_2.mk
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
n : M
hn✝ : n ∈ N
hn : ∃ l ∈ Finsupp.supported R R ↑s, (Finsupp.total M M R id) l = n
⊢ ∃ a, { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯, map_smul' := ⋯ } a = ⟨n, hn✝⟩

tactic: rcases hn with ⟨l, hl1, hl2⟩
state_before: case refine_2.mk
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
n : M
hn✝ : n ∈ N
hn : ∃ l ∈ Finsupp.supported R R ↑s, (Finsupp.total M M R id) l = n
⊢ ∃ a, { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯, map_smul' := ⋯ } a = ⟨n, hn✝⟩
state_after: case refine_2.mk.intro.intro
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
n : M
hn : n ∈ N
l : M →₀ R
hl1 : l ∈ Finsupp.supported R R ↑s
hl2 : (Finsupp.total M M R id) l = n
⊢ ∃ a, { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯, map_smul' := ⋯ } a = ⟨n, hn⟩

tactic: refine ⟨fun x => l x, Subtype.ext ?_⟩
state_before: case refine_2.mk.intro.intro
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
n : M
hn : n ∈ N
l : M →₀ R
hl1 : l ∈ Finsupp.supported R R ↑s
hl2 : (Finsupp.total M M R id) l = n
⊢ ∃ a, { toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯, map_smul' := ⋯ } a = ⟨n, hn⟩
state_after: case refine_2.mk.intro.intro
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
n : M
hn : n ∈ N
l : M →₀ R
hl1 : l ∈ Finsupp.supported R R ↑s
hl2 : (Finsupp.total M M R id) l = n
⊢ ↑({ toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯, map_smul' := ⋯ } fun x => l ↑x) = ↑⟨n, hn⟩

tactic: change (∑ i ∈ s.attach, l i • (i : M)) = n
state_before: case refine_2.mk.intro.intro
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
n : M
hn : n ∈ N
l : M →₀ R
hl1 : l ∈ Finsupp.supported R R ↑s
hl2 : (Finsupp.total M M R id) l = n
⊢ ↑({ toFun := fun f => ⟨∑ i ∈ s.attach, f i • ↑i, ⋯⟩, map_add' := ⋯, map_smul' := ⋯ } fun x => l ↑x) = ↑⟨n, hn⟩
state_after: case refine_2.mk.intro.intro
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
n : M
hn : n ∈ N
l : M →₀ R
hl1 : l ∈ Finsupp.supported R R ↑s
hl2 : (Finsupp.total M M R id) l = n
⊢ ∑ i ∈ s.attach, l ↑i • ↑i = n

tactic: rw [s.sum_attach fun i ↦ l i • i, ← hl2,
  Finsupp.total_apply, Finsupp.sum, eq_comm]
state_before: case refine_2.mk.intro.intro
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
n : M
hn : n ∈ N
l : M →₀ R
hl1 : l ∈ Finsupp.supported R R ↑s
hl2 : (Finsupp.total M M R id) l = n
⊢ ∑ i ∈ s.attach, l ↑i • ↑i = n
state_after: case refine_2.mk.intro.intro
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
n : M
hn : n ∈ N
l : M →₀ R
hl1 : l ∈ Finsupp.supported R R ↑s
hl2 : (Finsupp.total M M R id) l = n
⊢ ∑ a ∈ l.support, l a • id a = ∑ x ∈ s, l x • x

tactic: refine Finset.sum_subset hl1 fun x _ hx => ?_
state_before: case refine_2.mk.intro.intro
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
n : M
hn : n ∈ N
l : M →₀ R
hl1 : l ∈ Finsupp.supported R R ↑s
hl2 : (Finsupp.total M M R id) l = n
⊢ ∑ a ∈ l.support, l a • id a = ∑ x ∈ s, l x • x
state_after: case refine_2.mk.intro.intro
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
n : M
hn : n ∈ N
l : M →₀ R
hl1 : l ∈ Finsupp.supported R R ↑s
hl2 : (Finsupp.total M M R id) l = n
x : M
x✝ : x ∈ s
hx : x ∉ l.support
⊢ l x • id x = 0

tactic: rw [Finsupp.not_mem_support_iff.1 hx, zero_smul]
state_before: case refine_2.mk.intro.intro
R : Type u_1
M : Type u_2
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
N : Submodule R M
I : IsNoetherianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
n : M
hn : n ∈ N
l : M →₀ R
hl1 : l ∈ Finsupp.supported R R ↑s
hl2 : (Finsupp.total M M R id) l = n
x : M
x✝ : x ∈ s
hx : x ∉ l.support
⊢ l x • id x = 0
state_after: no goals