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

Proof steps:
state_before: R : Type u_1
M : Type u_2
P : Type u_3
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid P
inst✝¹ : Module R M
inst✝ : Module R P
N : Submodule R M
⊢ IsNoetherian R ↥N ↔ ∀ s ≤ N, s.FG
state_after: R : Type u_1
M : Type u_2
P : Type u_3
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid P
inst✝¹ : Module R M
inst✝ : Module R P
N : Submodule R M
h : ∀ s ≤ N, s.FG
s : Submodule R ↥N
⊢ s.FG
tactic: refine ⟨fun ⟨hn⟩ => fun s hs =>
    have : s ≤ LinearMap.range N.subtype := N.range_subtype.symm ▸ hs
    Submodule.map_comap_eq_self this ▸ (hn _).map _,
    fun h => ⟨fun s => ?_⟩⟩
state_before: R : Type u_1
M : Type u_2
P : Type u_3
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid P
inst✝¹ : Module R M
inst✝ : Module R P
N : Submodule R M
h : ∀ s ≤ N, s.FG
s : Submodule R ↥N
⊢ s.FG
state_after: R : Type u_1
M : Type u_2
P : Type u_3
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid P
inst✝¹ : Module R M
inst✝ : Module R P
N : Submodule R M
h : ∀ s ≤ N, s.FG
s : Submodule R ↥N
f : ↥(Submodule.map N.subtype s) ≃ₗ[R] ↥s
⊢ s.FG
tactic: have f := (Submodule.equivMapOfInjective N.subtype Subtype.val_injective s).symm
state_before: R : Type u_1
M : Type u_2
P : Type u_3
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid P
inst✝¹ : Module R M
inst✝ : Module R P
N : Submodule R M
h : ∀ s ≤ N, s.FG
s : Submodule R ↥N
f : ↥(Submodule.map N.subtype s) ≃ₗ[R] ↥s
⊢ s.FG
state_after: R : Type u_1
M : Type u_2
P : Type u_3
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid P
inst✝¹ : Module R M
inst✝ : Module R P
N : Submodule R M
h : ∀ s ≤ N, s.FG
s : Submodule R ↥N
f : ↥(Submodule.map N.subtype s) ≃ₗ[R] ↥s
h₁ : (Submodule.map N.subtype s).FG
⊢ s.FG
tactic: have h₁ := h (s.map N.subtype) (Submodule.map_subtype_le N s)
state_before: R : Type u_1
M : Type u_2
P : Type u_3
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid P
inst✝¹ : Module R M
inst✝ : Module R P
N : Submodule R M
h : ∀ s ≤ N, s.FG
s : Submodule R ↥N
f : ↥(Submodule.map N.subtype s) ≃ₗ[R] ↥s
h₁ : (Submodule.map N.subtype s).FG
⊢ s.FG
state_after: R : Type u_1
M : Type u_2
P : Type u_3
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid P
inst✝¹ : Module R M
inst✝ : Module R P
N : Submodule R M
h : ∀ s ≤ N, s.FG
s : Submodule R ↥N
f : ↥(Submodule.map N.subtype s) ≃ₗ[R] ↥s
h₁ : (Submodule.map N.subtype s).FG
h₂ : Submodule.map f ⊤ = ⊤
⊢ s.FG
tactic: have h₂ : (⊤ : Submodule R (s.map N.subtype)).map f = ⊤ := by simp
state_before: R : Type u_1
M : Type u_2
P : Type u_3
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid P
inst✝¹ : Module R M
inst✝ : Module R P
N : Submodule R M
h : ∀ s ≤ N, s.FG
s : Submodule R ↥N
f : ↥(Submodule.map N.subtype s) ≃ₗ[R] ↥s
h₁ : (Submodule.map N.subtype s).FG
h₂ : Submodule.map f ⊤ = ⊤
⊢ s.FG
state_after: R : Type u_1
M : Type u_2
P : Type u_3
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid P
inst✝¹ : Module R M
inst✝ : Module R P
N : Submodule R M
h : ∀ s ≤ N, s.FG
s : Submodule R ↥N
f : ↥(Submodule.map N.subtype s) ≃ₗ[R] ↥s
h₁ : (Submodule.map N.subtype s).FG
h₂ : Submodule.map f ⊤ = ⊤
h₃ : (Submodule.map ↑f ⊤).FG
⊢ s.FG
tactic: have h₃ := ((Submodule.fg_top _).2 h₁).map (↑f : _ →ₗ[R] s)
state_before: R : Type u_1
M : Type u_2
P : Type u_3
inst✝⁴ : Semiring R
inst✝³ : AddCommMonoid M
inst✝² : AddCommMonoid P
inst✝¹ : Module R M
inst✝ : Module R P
N : Submodule R M
h : ∀ s ≤ N, s.FG
s : Submodule R ↥N
f : ↥(Submodule.map N.subtype s) ≃ₗ[R] ↥s
h₁ : (Submodule.map N.subtype s).FG
h₂ : Submodule.map f ⊤ = ⊤
h₃ : (Submodule.map ↑f ⊤).FG
⊢ s.FG
state_after: no goals
tactic: exact (Submodule.fg_top _).1 (h₂ ▸ h₃)