-- Mathlib/RingTheory/Localization/Finiteness.lean
theorem of_localizationSpan_finite' (t : Finset R) (ht : Ideal.span (t : Set R) = ⊤)
    {Mₚ : ∀ (_ : t), Type*} [∀ (g : t), AddCommMonoid (Mₚ g)] [∀ (g : t), Module R (Mₚ g)]
    {Rₚ : ∀ (_ : t), Type u} [∀ (g : t), CommRing (Rₚ g)] [∀ (g : t), Algebra R (Rₚ g)]
    [∀ (g : t), IsLocalization.Away g.val (Rₚ g)]
    [∀ (g : t), Module (Rₚ g) (Mₚ g)] [∀ (g : t), IsScalarTower R (Rₚ g) (Mₚ g)]
    (f : ∀ (g : t), M →ₗ[R] Mₚ g) [∀ (g : t), IsLocalizedModule (Submonoid.powers g.val) (f g)]
    (H : ∀ (g : t), Module.Finite (Rₚ g) (Mₚ g)) :
    Module.Finite R M

Proof state:
case fg_top
R : Type u
inst✝¹⁰ : CommRing R
M : Type w
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
t : Finset R
ht : Ideal.span ↑t = ⊤
Mₚ : { x // x ∈ t } → Type u_1
inst✝⁷ : (g : { x // x ∈ t }) → AddCommMonoid (Mₚ g)
inst✝⁶ : (g : { x // x ∈ t }) → Module R (Mₚ g)
Rₚ : { x // x ∈ t } → Type u
inst✝⁵ : (g : { x // x ∈ t }) → CommRing (Rₚ g)
inst✝⁴ : (g : { x // x ∈ t }) → Algebra R (Rₚ g)
inst✝³ : ∀ (g : { x // x ∈ t }), IsLocalization.Away (↑g) (Rₚ g)
inst✝² : (g : { x // x ∈ t }) → Module (Rₚ g) (Mₚ g)
inst✝¹ : ∀ (g : { x // x ∈ t }), IsScalarTower R (Rₚ g) (Mₚ g)
f : (g : { x // x ∈ t }) → M →ₗ[R] Mₚ g
inst✝ : ∀ (g : { x // x ∈ t }), IsLocalizedModule (Submonoid.powers ↑g) (f g)
H : ∀ (g : { x // x ∈ t }), Module.Finite (Rₚ g) (Mₚ g)
s₁ : (g : { x // x ∈ t }) → Finset (Mₚ g)
s₂ : ∀ (g : { x // x ∈ t }), Submodule.span (Rₚ g) ↑(s₁ g) = ⊤
sf : { x // x ∈ t } → Finset M := fun x => IsLocalizedModule.finsetIntegerMultiple (Submonoid.powers ↑x) (f x) (s₁ x)
⊢ ⊤.FG

Tactic:
use t.attach.biUnion sf

Result:
case h
R : Type u
inst✝¹⁰ : CommRing R
M : Type w
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
t : Finset R
ht : Ideal.span ↑t = ⊤
Mₚ : { x // x ∈ t } → Type u_1
inst✝⁷ : (g : { x // x ∈ t }) → AddCommMonoid (Mₚ g)
inst✝⁶ : (g : { x // x ∈ t }) → Module R (Mₚ g)
Rₚ : { x // x ∈ t } → Type u
inst✝⁵ : (g : { x // x ∈ t }) → CommRing (Rₚ g)
inst✝⁴ : (g : { x // x ∈ t }) → Algebra R (Rₚ g)
inst✝³ : ∀ (g : { x // x ∈ t }), IsLocalization.Away (↑g) (Rₚ g)
inst✝² : (g : { x // x ∈ t }) → Module (Rₚ g) (Mₚ g)
inst✝¹ : ∀ (g : { x // x ∈ t }), IsScalarTower R (Rₚ g) (Mₚ g)
f : (g : { x // x ∈ t }) → M →ₗ[R] Mₚ g
inst✝ : ∀ (g : { x // x ∈ t }), IsLocalizedModule (Submonoid.powers ↑g) (f g)
H : ∀ (g : { x // x ∈ t }), Module.Finite (Rₚ g) (Mₚ g)
s₁ : (g : { x // x ∈ t }) → Finset (Mₚ g)
s₂ : ∀ (g : { x // x ∈ t }), Submodule.span (Rₚ g) ↑(s₁ g) = ⊤
sf : { x // x ∈ t } → Finset M := fun x => IsLocalizedModule.finsetIntegerMultiple (Submonoid.powers ↑x) (f x) (s₁ x)
⊢ Submodule.span R ↑(t.attach.biUnion sf) = ⊤

Proof state:
case h.intro.mk.intro.intro.mk.intro
R : Type u
inst✝¹⁰ : CommRing R
M : Type w
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
t : Finset R
ht : Ideal.span ↑t = ⊤
Mₚ : { x // x ∈ t } → Type u_1
inst✝⁷ : (g : { x // x ∈ t }) → AddCommMonoid (Mₚ g)
inst✝⁶ : (g : { x // x ∈ t }) → Module R (Mₚ g)
Rₚ : { x // x ∈ t } → Type u
inst✝⁵ : (g : { x // x ∈ t }) → CommRing (Rₚ g)
inst✝⁴ : (g : { x // x ∈ t }) → Algebra R (Rₚ g)
inst✝³ : ∀ (g : { x // x ∈ t }), IsLocalization.Away (↑g) (Rₚ g)
inst✝² : (g : { x // x ∈ t }) → Module (Rₚ g) (Mₚ g)
inst✝¹ : ∀ (g : { x // x ∈ t }), IsScalarTower R (Rₚ g) (Mₚ g)
f : (g : { x // x ∈ t }) → M →ₗ[R] Mₚ g
inst✝ : ∀ (g : { x // x ∈ t }), IsLocalizedModule (Submonoid.powers ↑g) (f g)
H : ∀ (g : { x // x ∈ t }), Module.Finite (Rₚ g) (Mₚ g)
s₁ : (g : { x // x ∈ t }) → Finset (Mₚ g)
s₂ : ∀ (g : { x // x ∈ t }), Submodule.span (Rₚ g) ↑(s₁ g) = ⊤
sf : { x // x ∈ t } → Finset M := fun x => IsLocalizedModule.finsetIntegerMultiple (Submonoid.powers ↑x) (f x) (s₁ x)
x : M
r : ↑↑t
S : Submonoid R := Submonoid.powers ↑r
n₁ : ℕ
hn₁ : (f r) (↑⟨(fun x => ↑r ^ x) n₁, ⋯⟩ • x) ∈ Submodule.span R ↑(s₁ r)
n₂ : ℕ
hn₂ :
  ↑⟨(fun x => ↑r ^ x) n₂, ⋯⟩ • ↑⟨(fun x => ↑r ^ x) n₁, ⋯⟩ • x ∈
    Submodule.span R ↑(IsLocalizedModule.finsetIntegerMultiple S (f r) (s₁ r))
⊢ ∃ n, ↑r ^ n • x ∈ ⨆ x, Submodule.span R ↑(sf x)

Tactic:
use n₂ + n₁

Result:
case h
R : Type u
inst✝¹⁰ : CommRing R
M : Type w
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
t : Finset R
ht : Ideal.span ↑t = ⊤
Mₚ : { x // x ∈ t } → Type u_1
inst✝⁷ : (g : { x // x ∈ t }) → AddCommMonoid (Mₚ g)
inst✝⁶ : (g : { x // x ∈ t }) → Module R (Mₚ g)
Rₚ : { x // x ∈ t } → Type u
inst✝⁵ : (g : { x // x ∈ t }) → CommRing (Rₚ g)
inst✝⁴ : (g : { x // x ∈ t }) → Algebra R (Rₚ g)
inst✝³ : ∀ (g : { x // x ∈ t }), IsLocalization.Away (↑g) (Rₚ g)
inst✝² : (g : { x // x ∈ t }) → Module (Rₚ g) (Mₚ g)
inst✝¹ : ∀ (g : { x // x ∈ t }), IsScalarTower R (Rₚ g) (Mₚ g)
f : (g : { x // x ∈ t }) → M →ₗ[R] Mₚ g
inst✝ : ∀ (g : { x // x ∈ t }), IsLocalizedModule (Submonoid.powers ↑g) (f g)
H : ∀ (g : { x // x ∈ t }), Module.Finite (Rₚ g) (Mₚ g)
s₁ : (g : { x // x ∈ t }) → Finset (Mₚ g)
s₂ : ∀ (g : { x // x ∈ t }), Submodule.span (Rₚ g) ↑(s₁ g) = ⊤
sf : { x // x ∈ t } → Finset M := fun x => IsLocalizedModule.finsetIntegerMultiple (Submonoid.powers ↑x) (f x) (s₁ x)
x : M
r : ↑↑t
S : Submonoid R := Submonoid.powers ↑r
n₁ : ℕ
hn₁ : (f r) (↑⟨(fun x => ↑r ^ x) n₁, ⋯⟩ • x) ∈ Submodule.span R ↑(s₁ r)
n₂ : ℕ
hn₂ :
  ↑⟨(fun x => ↑r ^ x) n₂, ⋯⟩ • ↑⟨(fun x => ↑r ^ x) n₁, ⋯⟩ • x ∈
    Submodule.span R ↑(IsLocalizedModule.finsetIntegerMultiple S (f r) (s₁ r))
⊢ ↑r ^ (n₂ + n₁) • x ∈ ⨆ x, Submodule.span R ↑(sf x)

Proof state:
case h
R : Type u
inst✝¹⁰ : CommRing R
M : Type w
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
t : Finset R
ht : Ideal.span ↑t = ⊤
Mₚ : { x // x ∈ t } → Type u_1
inst✝⁷ : (g : { x // x ∈ t }) → AddCommMonoid (Mₚ g)
inst✝⁶ : (g : { x // x ∈ t }) → Module R (Mₚ g)
Rₚ : { x // x ∈ t } → Type u
inst✝⁵ : (g : { x // x ∈ t }) → CommRing (Rₚ g)
inst✝⁴ : (g : { x // x ∈ t }) → Algebra R (Rₚ g)
inst✝³ : ∀ (g : { x // x ∈ t }), IsLocalization.Away (↑g) (Rₚ g)
inst✝² : (g : { x // x ∈ t }) → Module (Rₚ g) (Mₚ g)
inst✝¹ : ∀ (g : { x // x ∈ t }), IsScalarTower R (Rₚ g) (Mₚ g)
f : (g : { x // x ∈ t }) → M →ₗ[R] Mₚ g
inst✝ : ∀ (g : { x // x ∈ t }), IsLocalizedModule (Submonoid.powers ↑g) (f g)
H : ∀ (g : { x // x ∈ t }), Module.Finite (Rₚ g) (Mₚ g)
s₁ : (g : { x // x ∈ t }) → Finset (Mₚ g)
s₂ : ∀ (g : { x // x ∈ t }), Submodule.span (Rₚ g) ↑(s₁ g) = ⊤
sf : { x // x ∈ t } → Finset M := fun x => IsLocalizedModule.finsetIntegerMultiple (Submonoid.powers ↑x) (f x) (s₁ x)
x : M
r : ↑↑t
S : Submonoid R := Submonoid.powers ↑r
⊢ ∃ n, ↑r ^ n • x ∈ ⨆ x, Submodule.span R ↑(sf x)

Tactic:
obtain ⟨⟨_, n₁, rfl⟩, hn₁⟩ := multiple_mem_span_of_mem_localization_span S (Rₚ r)
  (s₁ r : Set (Mₚ r)) (IsLocalizedModule.mk' (f r) x (1 : S)) (by rw [s₂ r]; trivial)

Result:
case h.intro.mk.intro
R : Type u
inst✝¹⁰ : CommRing R
M : Type w
inst✝⁹ : AddCommMonoid M
inst✝⁸ : Module R M
t : Finset R
ht : Ideal.span ↑t = ⊤
Mₚ : { x // x ∈ t } → Type u_1
inst✝⁷ : (g : { x // x ∈ t }) → AddCommMonoid (Mₚ g)
inst✝⁶ : (g : { x // x ∈ t }) → Module R (Mₚ g)
Rₚ : { x // x ∈ t } → Type u
inst✝⁵ : (g : { x // x ∈ t }) → CommRing (Rₚ g)
inst✝⁴ : (g : { x // x ∈ t }) → Algebra R (Rₚ g)
inst✝³ : ∀ (g : { x // x ∈ t }), IsLocalization.Away (↑g) (Rₚ g)
inst✝² : (g : { x // x ∈ t }) → Module (Rₚ g) (Mₚ g)
inst✝¹ : ∀ (g : { x // x ∈ t }), IsScalarTower R (Rₚ g) (Mₚ g)
f : (g : { x // x ∈ t }) → M →ₗ[R] Mₚ g
inst✝ : ∀ (g : { x // x ∈ t }), IsLocalizedModule (Submonoid.powers ↑g) (f g)
H : ∀ (g : { x // x ∈ t }), Module.Finite (Rₚ g) (Mₚ g)
s₁ : (g : { x // x ∈ t }) → Finset (Mₚ g)
s₂ : ∀ (g : { x // x ∈ t }), Submodule.span (Rₚ g) ↑(s₁ g) = ⊤
sf : { x // x ∈ t } → Finset M := fun x => IsLocalizedModule.finsetIntegerMultiple (Submonoid.powers ↑x) (f x) (s₁ x)
x : M
r : ↑↑t
S : Submonoid R := Submonoid.powers ↑r
n₁ : ℕ
hn₁ : ⟨(fun x => ↑r ^ x) n₁, ⋯⟩ • IsLocalizedModule.mk' (f r) x 1 ∈ Submodule.span R ↑(s₁ r)
⊢ ∃ n, ↑r ^ n • x ∈ ⨆ x, Submodule.span R ↑(sf x)