-- 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 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, Submodule.span R ↑(sf x)

Tactic:
rintro x -

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
⊢ 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
⊢ x ∈ ⨆ x, Submodule.span R ↑(sf x)

Tactic:
refine Submodule.mem_of_span_eq_top_of_smul_pow_mem _ (t : Set R) ht _ (fun r ↦ ?_)

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
⊢ ∃ n, ↑r ^ n • x ∈ ⨆ x, Submodule.span R ↑(sf x)

Proof state:
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)
⊢ Module.Finite R M

Tactic:
classical
constructor
choose s₁ s₂ using (fun g ↦ (H g).1)
let sf := fun x : t ↦
  IsLocalizedModule.finsetIntegerMultiple (Submonoid.powers x.val) (f x) (s₁ x)
use t.attach.biUnion sf
rw [Submodule.span_attach_biUnion, eq_top_iff]
rintro x -
refine Submodule.mem_of_span_eq_top_of_smul_pow_mem _ (t : Set R) ht _ (fun r ↦ ?_)
set S : Submonoid R := Submonoid.powers r.val
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)
rw [Submonoid.smul_def, ← IsLocalizedModule.mk'_smul, IsLocalizedModule.mk'_one] at hn₁
obtain ⟨⟨_, n₂, rfl⟩, hn₂⟩ := IsLocalizedModule.smul_mem_finsetIntegerMultiple_span
  S (f r) _ (s₁ r) hn₁
rw [Submonoid.smul_def] at hn₂
use n₂ + n₁
apply le_iSup (fun x : t ↦ Submodule.span R (sf x : Set M)) r
rw [pow_add, mul_smul]
exact hn₂

Result:
no goals

Proof state:
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
⊢ IsLocalizedModule.mk' (f r) x 1 ∈ ⊤

Tactic:
trivial

Result:
no goals