Theorem: Submodule.FG.stablizes_of_iSup_eq
File: Mathlib/RingTheory/Finiteness.lean

tactic: obtain ⟨S, hS⟩ := hM'
state_before: R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.311147
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
M' : Submodule R M
hM' : FG M'
N : ℕ →o Submodule R M
H : iSup ↑N = M'
⊢ ∃ n, M' = ↑N n

tactic: have : ∀ s : S, ∃ n, (s : M) ∈ N n := fun s =>
  (Submodule.mem_iSup_of_chain N s).mp
    (by
      rw [H, ← hS]
      exact Submodule.subset_span s.2)
state_before: case intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.311147
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
⊢ ∃ n, M' = ↑N n

tactic: choose f hf using this
state_before: case intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.311147
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
this : ∀ (s : { x // x ∈ S }), ∃ n, ↑s ∈ ↑N n
⊢ ∃ n, M' = ↑N n

tactic: use S.attach.sup f
state_before: case intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.311147
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
⊢ ∃ n, M' = ↑N n

tactic: apply le_antisymm
state_before: case intro
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.311147
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
⊢ M' = ↑N (Finset.sup (Finset.attach S) f)

tactic: rw [H, ← hS]
state_before: R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.311147
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
s : { x // x ∈ S }
⊢ ↑s ∈ ⨆ (k : ℕ), ↑N k

tactic: exact Submodule.subset_span s.2
state_before: R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.311147
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
s : { x // x ∈ S }
⊢ ↑s ∈ span R ↑S

tactic: conv_lhs => rw [← hS]
state_before: case intro.a
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.311147
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
⊢ M' ≤ ↑N (Finset.sup (Finset.attach S) f)

tactic: rw [Submodule.span_le]
state_before: case intro.a
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.311147
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
⊢ span R ↑S ≤ ↑N (Finset.sup (Finset.attach S) f)

tactic: intro s hs
state_before: case intro.a
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.311147
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
⊢ ↑S ⊆ ↑(↑N (Finset.sup (Finset.attach S) f))

tactic: exact N.2 (Finset.le_sup <| S.mem_attach ⟨s, hs⟩) (hf _)
state_before: case intro.a
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.311147
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
s : M
hs : s ∈ ↑S
⊢ s ∈ ↑(↑N (Finset.sup (Finset.attach S) f))

tactic: rw [← H]
state_before: case intro.a
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.311147
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
⊢ ↑N (Finset.sup (Finset.attach S) f) ≤ M'

tactic: exact le_iSup _ _
state_before: case intro.a
R : Type u_1
M : Type u_2
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : Module R M
P : Type ?u.311147
inst✝¹ : AddCommMonoid P
inst✝ : Module R P
f✝ : M →ₗ[R] P
M' : Submodule R M
N : ℕ →o Submodule R M
H : iSup ↑N = M'
S : Finset M
hS : span R ↑S = M'
f : { x // x ∈ S } → ℕ
hf : ∀ (s : { x // x ∈ S }), ↑s ∈ ↑N (f s)
⊢ ↑N (Finset.sup (Finset.attach S) f) ≤ iSup ↑N