Theorem: Module.FinitePresentation.equiv_quotient
File: Mathlib/Algebra/Module/FinitePresentation.lean

Proof steps:
state_before: R✝ : Type ?u.4933
M✝ : Type ?u.4936
N : Type ?u.5555
inst✝⁷ : Ring R✝
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
inst✝⁴ : AddCommGroup N
inst✝³ : Module R✝ N
R M : Type u
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
fp : FinitePresentation R M
⊢ ∃ L x x_1 K x_2, Free R L ∧ Finite R L ∧ K.FG
state_after: case mk.intro.intro
R✝ : Type ?u.4933
M✝ : Type ?u.4936
N : Type ?u.5555
inst✝⁷ : Ring R✝
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
inst✝⁴ : AddCommGroup N
inst✝³ : Module R✝ N
R M : Type u
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Finset M
hι₁ : Submodule.span R ↑ι = ⊤
hι₂ : (LinearMap.ker (Finsupp.total { x // x ∈ ι } M R Subtype.val)).FG
⊢ ∃ L x x_1 K x_2, Free R L ∧ Finite R L ∧ K.FG
tactic: obtain ⟨ι, ⟨hι₁, hι₂⟩⟩ := fp
state_before: case mk.intro.intro
R✝ : Type ?u.4933
M✝ : Type ?u.4936
N : Type ?u.5555
inst✝⁷ : Ring R✝
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
inst✝⁴ : AddCommGroup N
inst✝³ : Module R✝ N
R M : Type u
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Finset M
hι₁ : Submodule.span R ↑ι = ⊤
hι₂ : (LinearMap.ker (Finsupp.total { x // x ∈ ι } M R Subtype.val)).FG
⊢ ∃ L x x_1 K x_2, Free R L ∧ Finite R L ∧ K.FG
state_after: case h
R✝ : Type ?u.4933
M✝ : Type ?u.4936
N : Type ?u.5555
inst✝⁷ : Ring R✝
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
inst✝⁴ : AddCommGroup N
inst✝³ : Module R✝ N
R M : Type u
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Finset M
hι₁ : Submodule.span R ↑ι = ⊤
hι₂ : (LinearMap.ker (Finsupp.total { x // x ∈ ι } M R Subtype.val)).FG
⊢ ∃ K x, Free R ({ x // x ∈ ι } →₀ R) ∧ Finite R ({ x // x ∈ ι } →₀ R) ∧ K.FG
tactic: use ι →₀ R, inferInstance, inferInstance
state_before: case h
R✝ : Type ?u.4933
M✝ : Type ?u.4936
N : Type ?u.5555
inst✝⁷ : Ring R✝
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
inst✝⁴ : AddCommGroup N
inst✝³ : Module R✝ N
R M : Type u
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Finset M
hι₁ : Submodule.span R ↑ι = ⊤
hι₂ : (LinearMap.ker (Finsupp.total { x // x ∈ ι } M R Subtype.val)).FG
⊢ ∃ K x, Free R ({ x // x ∈ ι } →₀ R) ∧ Finite R ({ x // x ∈ ι } →₀ R) ∧ K.FG
state_after: case h
R✝ : Type ?u.4933
M✝ : Type ?u.4936
N : Type ?u.5555
inst✝⁷ : Ring R✝
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
inst✝⁴ : AddCommGroup N
inst✝³ : Module R✝ N
R M : Type u
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Finset M
hι₁ : Submodule.span R ↑ι = ⊤
hι₂ : (LinearMap.ker (Finsupp.total { x // x ∈ ι } M R Subtype.val)).FG
⊢ ∃ x,
    Free R ({ x // x ∈ ι } →₀ R) ∧
      Finite R ({ x // x ∈ ι } →₀ R) ∧ (LinearMap.ker (Finsupp.total { x // x ∈ ι } M R Subtype.val)).FG
tactic: use LinearMap.ker (Finsupp.total { x // x ∈ ι } M R Subtype.val)
state_before: case h
R✝ : Type ?u.4933
M✝ : Type ?u.4936
N : Type ?u.5555
inst✝⁷ : Ring R✝
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
inst✝⁴ : AddCommGroup N
inst✝³ : Module R✝ N
R M : Type u
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Finset M
hι₁ : Submodule.span R ↑ι = ⊤
hι₂ : (LinearMap.ker (Finsupp.total { x // x ∈ ι } M R Subtype.val)).FG
⊢ ∃ x,
    Free R ({ x // x ∈ ι } →₀ R) ∧
      Finite R ({ x // x ∈ ι } →₀ R) ∧ (LinearMap.ker (Finsupp.total { x // x ∈ ι } M R Subtype.val)).FG
state_after: case h
R✝ : Type ?u.4933
M✝ : Type ?u.4936
N : Type ?u.5555
inst✝⁷ : Ring R✝
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
inst✝⁴ : AddCommGroup N
inst✝³ : Module R✝ N
R M : Type u
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Finset M
hι₁ : Submodule.span R ↑ι = ⊤
hι₂ : (LinearMap.ker (Finsupp.total { x // x ∈ ι } M R Subtype.val)).FG
⊢ Function.Surjective ⇑(Finsupp.total { x // x ∈ ι } M R Subtype.val)
tactic: refine ⟨(LinearMap.quotKerEquivOfSurjective _ ?_).symm, inferInstance, inferInstance, hι₂⟩
state_before: case h
R✝ : Type ?u.4933
M✝ : Type ?u.4936
N : Type ?u.5555
inst✝⁷ : Ring R✝
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
inst✝⁴ : AddCommGroup N
inst✝³ : Module R✝ N
R M : Type u
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Finset M
hι₁ : Submodule.span R ↑ι = ⊤
hι₂ : (LinearMap.ker (Finsupp.total { x // x ∈ ι } M R Subtype.val)).FG
⊢ Function.Surjective ⇑(Finsupp.total { x // x ∈ ι } M R Subtype.val)
state_after: case h
R✝ : Type ?u.4933
M✝ : Type ?u.4936
N : Type ?u.5555
inst✝⁷ : Ring R✝
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
inst✝⁴ : AddCommGroup N
inst✝³ : Module R✝ N
R M : Type u
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Finset M
hι₁ : Submodule.span R ↑ι = ⊤
hι₂ : (LinearMap.ker (Finsupp.total { x // x ∈ ι } M R Subtype.val)).FG
⊢ LinearMap.range (Finsupp.total { x // x ∈ ι } M R Subtype.val) = ⊤
tactic: apply LinearMap.range_eq_top.mp
state_before: case h
R✝ : Type ?u.4933
M✝ : Type ?u.4936
N : Type ?u.5555
inst✝⁷ : Ring R✝
inst✝⁶ : AddCommGroup M✝
inst✝⁵ : Module R✝ M✝
inst✝⁴ : AddCommGroup N
inst✝³ : Module R✝ N
R M : Type u
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
ι : Finset M
hι₁ : Submodule.span R ↑ι = ⊤
hι₂ : (LinearMap.ker (Finsupp.total { x // x ∈ ι } M R Subtype.val)).FG
⊢ LinearMap.range (Finsupp.total { x // x ∈ ι } M R Subtype.val) = ⊤
state_after: no goals
tactic: simpa only [Finsupp.range_total, Subtype.range_coe_subtype, Finset.setOf_mem]