theorem isNoetherian_of_fg_of_noetherian {R M} [Ring R] [AddCommGroup M] [Module R M]
    (N : Submodule R M) [I : IsNoetherianRing R] (hN : N.FG) : IsNoetherian R N := by
  let ⟨s, hs⟩ := hN
  haveI := Classical.decEq M
  haveI := Classical.decEq R
  have : ∀ x ∈ s, x ∈ N := fun x hx => hs ▸ Submodule.subset_span hx
  refine
    @isNoetherian_of_surjective
      R ((↑s : Set M) → R) N _ _ _ (Pi.module _ _ _) _ ?_ ?_ isNoetherian_pi
  · fapply LinearMap.mk
    · fapply AddHom.mk
      · exact fun f => ⟨∑ i in s.attach, f i • i.1, N.sum_mem fun c _ => N.smul_mem _ <| this _ c.2⟩
      · intro f g
        apply Subtype.eq
        change (∑ i in s.attach, (f i + g i) • _) = _
        simp only [add_smul, Finset.sum_add_distrib]
        rfl
    · intro c f
      apply Subtype.eq
      change (∑ i in s.attach, (c • f i) • _) = _
      simp only [smul_eq_mul, mul_smul]
      exact Finset.smul_sum.symm
  · rw [LinearMap.range_eq_top]
    rintro ⟨n, hn⟩
    change n ∈ N at hn
    

Proof state:
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 : FG N
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,
    {
          toAddHom :=
            {
              toFun := fun f =>
                { val := ∑ i in Finset.attach s, f i • ↑i, property := (_ : ∑ i in Finset.attach s, f i • ↑i ∈ N) },
              map_add' :=
                (_ :
                  ∀ (f g : ↑↑s → R),
                    { val := ∑ i in Finset.attach s, (f + g) i • ↑i,
                        property := (_ : ∑ i in Finset.attach s, (f + g) i • ↑i ∈ N) } =
                      { val := ∑ i in Finset.attach s, f i • ↑i,
                          property := (_ : ∑ i in Finset.attach s, f i • ↑i ∈ N) } +
                        { val := ∑ i in Finset.attach s, g i • ↑i,
                          property := (_ : ∑ i in Finset.attach s, g i • ↑i ∈ N) }) },
          map_smul' :=
            (_ :
              ∀ (c : R) (f : ↑↑s → R),
                AddHom.toFun
                    {
                      toFun := fun f =>
                        { val := ∑ i in Finset.attach s, f i • ↑i,
                          property := (_ : ∑ i in Finset.attach s, f i • ↑i ∈ N) },
                      map_add' :=
                        (_ :
                          ∀ (f g : ↑↑s → R),
                            { val := ∑ i in Finset.attach s, (f + g) i • ↑i,
                                property := (_ : ∑ i in Finset.attach s, (f + g) i • ↑i ∈ N) } =
                              { val := ∑ i in Finset.attach s, f i • ↑i,
                                  property := (_ : ∑ i in Finset.attach s, f i • ↑i ∈ N) } +
                                { val := ∑ i in Finset.attach s, g i • ↑i,
                                  property := (_ : ∑ i in Finset.attach s, g i • ↑i ∈ N) }) }
                    (c • f) =
                  (RingHom.id R) c •
                    AddHom.toFun
                      {
                        toFun := fun f =>
                          { val := ∑ i in Finset.attach s, f i • ↑i,
                            property := (_ : ∑ i in Finset.attach s, f i • ↑i ∈ N) },
                        map_add' :=
                          (_ :
                            ∀ (f g : ↑↑s → R),
                              { val := ∑ i in Finset.attach s, (f + g) i • ↑i,
                                  property := (_ : ∑ i in Finset.attach s, (f + g) i • ↑i ∈ N) } =
                                { val := ∑ i in Finset.attach s, f i • ↑i,
                                    property := (_ : ∑ i in Finset.attach s, f i • ↑i ∈ N) } +
                                  { val := ∑ i in Finset.attach s, g i • ↑i,
                                    property := (_ : ∑ i in Finset.attach s, g i • ↑i ∈ N) }) }
                      f) }
        a =
      { val := n, property := hn }

Next tactic:
rw [← hs, ← Set.image_id (s : Set M), Finsupp.mem_span_image_iff_total] at hn