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

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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
h : FinitePresentation R N
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
⊢ (LinearMap.ker l).FG
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
⊢ (LinearMap.ker l).FG

tactic: have H : Function.Surjective (Finsupp.total s N R Subtype.val) :=
  LinearMap.range_eq_top.mp (by rw [Finsupp.range_total, Subtype.range_val, ← hs]; rfl)
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
⊢ (LinearMap.ker l).FG
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
⊢ (LinearMap.ker l).FG

tactic: obtain ⟨f, hf⟩ : ∃ f : (s →₀ R) →ₗ[R] M, l ∘ₗ f = (Finsupp.total s N R Subtype.val) := by
  choose f hf using show _ from hl
  exact ⟨Finsupp.total s M R (fun i ↦ f i), by ext; simp [hf]⟩
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
⊢ (LinearMap.ker l).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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
⊢ (LinearMap.ker l).FG

tactic: have : (LinearMap.ker l).map (LinearMap.range f).mkQ = ⊤ := by
  rw [← top_le_iff]
  rintro x -
  obtain ⟨x, rfl⟩ := Submodule.mkQ_surjective _ x
  obtain ⟨y, hy⟩ := H (l x)
  rw [← hf, LinearMap.comp_apply, eq_comm, ← sub_eq_zero, ← map_sub] at hy
  exact ⟨_, hy, by simp⟩
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
⊢ (LinearMap.ker l).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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
this : Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l) = ⊤
⊢ (LinearMap.ker l).FG

tactic: apply Submodule.fg_of_fg_map_of_fg_inf_ker f.range.mkQ
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
this : Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l) = ⊤
⊢ (LinearMap.ker l).FG
state_after: case mk.intro.intro.intro.hs1
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
this : Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l) = ⊤
⊢ (Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l)).FG

case mk.intro.intro.intro.hs2
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
this : Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l) = ⊤
⊢ (LinearMap.ker l ⊓ LinearMap.ker (LinearMap.range f).mkQ).FG

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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
⊢ LinearMap.range (Finsupp.total { x // x ∈ s } N 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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
⊢ (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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
⊢ (Submodule.span R fun x => x ∈ s.val) = Submodule.span R ↑s
state_after: no goals

tactic: choose f hf using show _ from hl
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
⊢ ∃ f, l ∘ₗ f = Finsupp.total { x // x ∈ s } N 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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : N → M
hf : ∀ (b : N), l (f b) = b
⊢ ∃ f, l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val

tactic: exact ⟨Finsupp.total s M R (fun i ↦ f i), by ext; simp [hf]⟩
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : N → M
hf : ∀ (b : N), l (f b) = b
⊢ ∃ f, l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
state_after: no goals

tactic: ext
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : N → M
hf : ∀ (b : N), l (f b) = b
⊢ (l ∘ₗ Finsupp.total { x // x ∈ s } M R fun i => f ↑i) = Finsupp.total { x // x ∈ s } N R Subtype.val
state_after: case h.h
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : N → M
hf : ∀ (b : N), l (f b) = b
a✝ : { x // x ∈ s }
⊢ ((l ∘ₗ Finsupp.total { x // x ∈ s } M R fun i => f ↑i) ∘ₗ Finsupp.lsingle a✝) 1 =
    (Finsupp.total { x // x ∈ s } N R Subtype.val ∘ₗ Finsupp.lsingle a✝) 1

tactic: simp [hf]
state_before: case h.h
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : N → M
hf : ∀ (b : N), l (f b) = b
a✝ : { x // x ∈ s }
⊢ ((l ∘ₗ Finsupp.total { x // x ∈ s } M R fun i => f ↑i) ∘ₗ Finsupp.lsingle a✝) 1 =
    (Finsupp.total { x // x ∈ s } N R Subtype.val ∘ₗ Finsupp.lsingle a✝) 1
state_after: no goals

tactic: rw [← top_le_iff]
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
⊢ Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l) = ⊤
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
⊢ ⊤ ≤ Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l)

tactic: rintro x -
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
⊢ ⊤ ≤ Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l)
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
x : M ⧸ LinearMap.range f
⊢ x ∈ Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l)

tactic: obtain ⟨x, rfl⟩ := Submodule.mkQ_surjective _ x
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
x : M ⧸ LinearMap.range f
⊢ x ∈ Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l)
state_after: case 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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
x : M
⊢ (LinearMap.range f).mkQ x ∈ Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l)

tactic: obtain ⟨y, hy⟩ := H (l x)
state_before: case 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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
x : M
⊢ (LinearMap.range f).mkQ x ∈ Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l)
state_after: case 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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
x : M
y : { x // x ∈ s } →₀ R
hy : (Finsupp.total { x // x ∈ s } N R Subtype.val) y = l x
⊢ (LinearMap.range f).mkQ x ∈ Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l)

tactic: rw [← hf, LinearMap.comp_apply, eq_comm, ← sub_eq_zero, ← map_sub] at hy
state_before: case 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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
x : M
y : { x // x ∈ s } →₀ R
hy : (Finsupp.total { x // x ∈ s } N R Subtype.val) y = l x
⊢ (LinearMap.range f).mkQ x ∈ Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l)
state_after: case 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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
x : M
y : { x // x ∈ s } →₀ R
hy : l (x - f y) = 0
⊢ (LinearMap.range f).mkQ x ∈ Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l)

tactic: exact ⟨_, hy, by simp⟩
state_before: case 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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
x : M
y : { x // x ∈ s } →₀ R
hy : l (x - f y) = 0
⊢ (LinearMap.range f).mkQ x ∈ Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l)
state_after: no goals

tactic: simp
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
x : M
y : { x // x ∈ s } →₀ R
hy : l (x - f y) = 0
⊢ (LinearMap.range f).mkQ (x - f y) = (LinearMap.range f).mkQ x
state_after: no goals

tactic: rw [this]
state_before: case mk.intro.intro.intro.hs1
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
this : Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l) = ⊤
⊢ (Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l)).FG
state_after: case mk.intro.intro.intro.hs1
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
this : Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l) = ⊤
⊢ ⊤.FG

tactic: exact Module.Finite.out
state_before: case mk.intro.intro.intro.hs1
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
this : Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l) = ⊤
⊢ ⊤.FG
state_after: no goals

tactic: rw [Submodule.ker_mkQ, inf_comm, ← Submodule.map_comap_eq, ← LinearMap.ker_comp, hf]
state_before: case mk.intro.intro.intro.hs2
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
this : Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l) = ⊤
⊢ (LinearMap.ker l ⊓ LinearMap.ker (LinearMap.range f).mkQ).FG
state_after: case mk.intro.intro.intro.hs2
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
this : Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l) = ⊤
⊢ (Submodule.map f (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val))).FG

tactic: exact hs'.map f
state_before: case mk.intro.intro.intro.hs2
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.111805
inst✝¹ : _root_.Finite ι
inst✝ : Finite R M
l : M →ₗ[R] N
hl : Function.Surjective ⇑l
s : Finset N
hs : Submodule.span R ↑s = ⊤
hs' : (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val)).FG
H : Function.Surjective ⇑(Finsupp.total { x // x ∈ s } N R Subtype.val)
f : ({ x // x ∈ s } →₀ R) →ₗ[R] M
hf : l ∘ₗ f = Finsupp.total { x // x ∈ s } N R Subtype.val
this : Submodule.map (LinearMap.range f).mkQ (LinearMap.ker l) = ⊤
⊢ (Submodule.map f (LinearMap.ker (Finsupp.total { x // x ∈ s } N R Subtype.val))).FG
state_after: no goals