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

tactic: classical
obtain ⟨s, hs, hs'⟩ := h
obtain ⟨t, ht⟩ := hl'
have H : Function.Surjective (Finsupp.total s M R Subtype.val) :=
  LinearMap.range_eq_top.mp (by rw [Finsupp.range_total, Subtype.range_val, ← hs]; rfl)
apply Module.finitePresentation_of_free_of_surjective (l ∘ₗ Finsupp.total s M R Subtype.val)
  (hl.comp H)
choose σ hσ using (show _ from H)
have : Finsupp.total s M R Subtype.val '' (σ '' t) = t := by
  simp only [Set.image_image, hσ, Set.image_id']
rw [LinearMap.ker_comp, ← ht, ← this, ← Submodule.map_span, Submodule.comap_map_eq,
  ← Finset.coe_image]
exact Submodule.FG.sup ⟨_, rfl⟩ hs'
state_before: R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
h : FinitePresentation R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
hl' : (LinearMap.ker l).FG
⊢ FinitePresentation R N
state_after: no goals

tactic: obtain ⟨s, hs, hs'⟩ := h
state_before: R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
h : FinitePresentation R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
hl' : (LinearMap.ker l).FG
⊢ FinitePresentation R N
state_after: case mk.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
hl' : (LinearMap.ker l).FG
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
⊢ FinitePresentation R N

tactic: obtain ⟨t, ht⟩ := hl'
state_before: case mk.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
hl' : (LinearMap.ker l).FG
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
⊢ FinitePresentation R N
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
⊢ FinitePresentation R N

tactic: have H : Function.Surjective (Finsupp.total s M R Subtype.val) :=
  LinearMap.range_eq_top.mp (by rw [Finsupp.range_total, Subtype.range_val, ← hs]; rfl)
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
⊢ FinitePresentation R N
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val)
⊢ FinitePresentation R N

tactic: apply Module.finitePresentation_of_free_of_surjective (l ∘ₗ Finsupp.total s M R Subtype.val)
  (hl.comp H)
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val)
⊢ FinitePresentation R N
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val)
⊢ (LinearMap.ker (l ∘ₗ Finsupp.total { x // x ∈ s } M R Subtype.val)).FG

tactic: choose σ hσ using (show _ from H)
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val)
⊢ (LinearMap.ker (l ∘ₗ Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val)
σ : M → { x // x ∈ s } →₀ R
hσ : ∀ (b : M), (Finsupp.total { x // x ∈ s } M R Subtype.val) (σ b) = b
⊢ (LinearMap.ker (l ∘ₗ Finsupp.total { x // x ∈ s } M R Subtype.val)).FG

tactic: have : Finsupp.total s M R Subtype.val '' (σ '' t) = t := by
  simp only [Set.image_image, hσ, Set.image_id']
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val)
σ : M → { x // x ∈ s } →₀ R
hσ : ∀ (b : M), (Finsupp.total { x // x ∈ s } M R Subtype.val) (σ b) = b
⊢ (LinearMap.ker (l ∘ₗ Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val)
σ : M → { x // x ∈ s } →₀ R
hσ : ∀ (b : M), (Finsupp.total { x // x ∈ s } M R Subtype.val) (σ b) = b
this : ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val) '' (σ '' ↑t) = ↑t
⊢ (LinearMap.ker (l ∘ₗ Finsupp.total { x // x ∈ s } M R Subtype.val)).FG

tactic: rw [LinearMap.ker_comp, ← ht, ← this, ← Submodule.map_span, Submodule.comap_map_eq,
  ← Finset.coe_image]
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val)
σ : M → { x // x ∈ s } →₀ R
hσ : ∀ (b : M), (Finsupp.total { x // x ∈ s } M R Subtype.val) (σ b) = b
this : ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val) '' (σ '' ↑t) = ↑t
⊢ (LinearMap.ker (l ∘ₗ Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val)
σ : M → { x // x ∈ s } →₀ R
hσ : ∀ (b : M), (Finsupp.total { x // x ∈ s } M R Subtype.val) (σ b) = b
this : ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val) '' (σ '' ↑t) = ↑t
⊢ (Submodule.span R ↑(Finset.image σ t) ⊔ LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG

tactic: exact Submodule.FG.sup ⟨_, rfl⟩ hs'
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val)
σ : M → { x // x ∈ s } →₀ R
hσ : ∀ (b : M), (Finsupp.total { x // x ∈ s } M R Subtype.val) (σ b) = b
this : ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val) '' (σ '' ↑t) = ↑t
⊢ (Submodule.span R ↑(Finset.image σ t) ⊔ LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
state_after: no goals

tactic: rw [Finsupp.range_total, Subtype.range_val, ← hs]
state_before: R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
⊢ LinearMap.range (Finsupp.total { x // x ∈ s } M R Subtype.val) = ⊤
state_after: R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
⊢ (Submodule.span R fun x => x ∈ s.val) = Submodule.span R ↑s

tactic: rfl
state_before: R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
⊢ (Submodule.span R fun x => x ∈ s.val) = Submodule.span R ↑s
state_after: no goals

tactic: simp only [Set.image_image, hσ, Set.image_id']
state_before: R : Type u_1
M : Type u_2
N : Type u_3
inst✝⁵ : Ring R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : AddCommGroup N
inst✝¹ : Module R N
ι : Sort ?u.95498
inst✝ : _root_.Finite ι
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset M
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } M R Subtype.val)).FG
t : Finset M
ht : Submodule.span R ↑t = LinearMap.ker l
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val)
σ : M → { x // x ∈ s } →₀ R
hσ : ∀ (b : M), (Finsupp.total { x // x ∈ s } M R Subtype.val) (σ b) = b
⊢ ⇑(Finsupp.total { x // x ∈ s } M R Subtype.val) '' (σ '' ↑t) = ↑t
state_after: no goals