Theorem: isArtinian_of_fg_of_artinian
File: Mathlib/RingTheory/Artinian.lean

tactic: let ⟨s, hs⟩ := hN
state_before: R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
N : Submodule R M
inst✝ : IsArtinianRing R
hN : N.FG
⊢ IsArtinian R ↥N
state_after: R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
N : Submodule R M
inst✝ : IsArtinianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
⊢ IsArtinian R ↥N

tactic: haveI := Classical.decEq M
state_before: R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
N : Submodule R M
inst✝ : IsArtinianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
⊢ IsArtinian R ↥N
state_after: R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
N : Submodule R M
inst✝ : IsArtinianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this : DecidableEq M
⊢ IsArtinian R ↥N

tactic: haveI := Classical.decEq R
state_before: R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
N : Submodule R M
inst✝ : IsArtinianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this : DecidableEq M
⊢ IsArtinian R ↥N
state_after: R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
N : Submodule R M
inst✝ : IsArtinianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝ : DecidableEq M
this : DecidableEq R
⊢ IsArtinian R ↥N

tactic: have : ∀ x ∈ s, x ∈ N := fun x hx => hs ▸ Submodule.subset_span hx
state_before: R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
N : Submodule R M
inst✝ : IsArtinianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝ : DecidableEq M
this : DecidableEq R
⊢ IsArtinian R ↥N
state_after: R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
N : Submodule R M
inst✝ : IsArtinianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ IsArtinian R ↥N

tactic: refine @isArtinian_of_surjective _ ((↑s : Set M) →₀ R) N _ _ _ _ _ ?_ ?_ isArtinian_finsupp
state_before: R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
N : Submodule R M
inst✝ : IsArtinianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ IsArtinian R ↥N
state_after: case refine_1
R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
N : Submodule R M
inst✝ : IsArtinianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ (↑↑s →₀ R) →ₗ[R] ↥N

case refine_2
R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
N : Submodule R M
inst✝ : IsArtinianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ Surjective ⇑?refine_1

tactic: exact Finsupp.total (↑s : Set M) N R (fun i => ⟨i, hs ▸ subset_span i.2⟩)
state_before: case refine_1
R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
N : Submodule R M
inst✝ : IsArtinianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ (↑↑s →₀ R) →ₗ[R] ↥N
state_after: no goals

tactic: rw [← LinearMap.range_eq_top, eq_top_iff,
   ← map_le_map_iff_of_injective (show Injective (Submodule.subtype N)
     from Subtype.val_injective), Submodule.map_top, range_subtype,
     ← Submodule.map_top, ← Submodule.map_comp, Submodule.map_top]
state_before: case refine_2
R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
N : Submodule R M
inst✝ : IsArtinianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ Surjective ⇑(Finsupp.total (↑↑s) (↥N) R fun i => ⟨↑i, ⋯⟩)
state_after: case refine_2
R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
N : Submodule R M
inst✝ : IsArtinianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ N ≤ LinearMap.range (N.subtype ∘ₗ Finsupp.total (↑↑s) (↥N) R fun i => ⟨↑i, ⋯⟩)

tactic: subst N
state_before: case refine_2
R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
N : Submodule R M
inst✝ : IsArtinianRing R
hN : N.FG
s : Finset M
hs : span R ↑s = N
this✝¹ : DecidableEq M
this✝ : DecidableEq R
this : ∀ x ∈ s, x ∈ N
⊢ N ≤ LinearMap.range (N.subtype ∘ₗ Finsupp.total (↑↑s) (↥N) R fun i => ⟨↑i, ⋯⟩)
state_after: case refine_2
R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : IsArtinianRing R
s : Finset M
this✝¹ : DecidableEq M
this✝ : DecidableEq R
hN : (span R ↑s).FG
this : ∀ x ∈ s, x ∈ span R ↑s
⊢ span R ↑s ≤ LinearMap.range ((span R ↑s).subtype ∘ₗ Finsupp.total (↑↑s) (↥(span R ↑s)) R fun i => ⟨↑i, ⋯⟩)

tactic: refine span_le.2 (fun i hi => ?_)
state_before: case refine_2
R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : IsArtinianRing R
s : Finset M
this✝¹ : DecidableEq M
this✝ : DecidableEq R
hN : (span R ↑s).FG
this : ∀ x ∈ s, x ∈ span R ↑s
⊢ span R ↑s ≤ LinearMap.range ((span R ↑s).subtype ∘ₗ Finsupp.total (↑↑s) (↥(span R ↑s)) R fun i => ⟨↑i, ⋯⟩)
state_after: case refine_2
R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : IsArtinianRing R
s : Finset M
this✝¹ : DecidableEq M
this✝ : DecidableEq R
hN : (span R ↑s).FG
this : ∀ x ∈ s, x ∈ span R ↑s
i : M
hi : i ∈ ↑s
⊢ i ∈ ↑(LinearMap.range ((span R ↑s).subtype ∘ₗ Finsupp.total (↑↑s) (↥(span R ↑s)) R fun i => ⟨↑i, ⋯⟩))

tactic: use Finsupp.single ⟨i, hi⟩ 1
state_before: case refine_2
R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : IsArtinianRing R
s : Finset M
this✝¹ : DecidableEq M
this✝ : DecidableEq R
hN : (span R ↑s).FG
this : ∀ x ∈ s, x ∈ span R ↑s
i : M
hi : i ∈ ↑s
⊢ i ∈ ↑(LinearMap.range ((span R ↑s).subtype ∘ₗ Finsupp.total (↑↑s) (↥(span R ↑s)) R fun i => ⟨↑i, ⋯⟩))
state_after: case h
R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : IsArtinianRing R
s : Finset M
this✝¹ : DecidableEq M
this✝ : DecidableEq R
hN : (span R ↑s).FG
this : ∀ x ∈ s, x ∈ span R ↑s
i : M
hi : i ∈ ↑s
⊢ ((span R ↑s).subtype ∘ₗ Finsupp.total (↑↑s) (↥(span R ↑s)) R fun i => ⟨↑i, ⋯⟩) (Finsupp.single ⟨i, hi⟩ 1) = i

tactic: simp
state_before: case h
R : Type u_1
M : Type u_2
inst✝³ : Ring R
inst✝² : AddCommGroup M
inst✝¹ : Module R M
inst✝ : IsArtinianRing R
s : Finset M
this✝¹ : DecidableEq M
this✝ : DecidableEq R
hN : (span R ↑s).FG
this : ∀ x ∈ s, x ∈ span R ↑s
i : M
hi : i ∈ ↑s
⊢ ((span R ↑s).subtype ∘ₗ Finsupp.total (↑↑s) (↥(span R ↑s)) R fun i => ⟨↑i, ⋯⟩) (Finsupp.single ⟨i, hi⟩ 1) = i
state_after: no goals