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

tactic: obtain ⟨σ, hσ, τ, hτ⟩ := h
state_before: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
h : FinitePresentation R M
g : M →ₗ[R] N'
⊢ ∃ h s, f ∘ₗ h = s • g
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
⊢ ∃ h s, f ∘ₗ h = s • g

tactic: let π := Finsupp.total σ M R Subtype.val
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
⊢ ∃ h s, f ∘ₗ h = s • g
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
⊢ ∃ h s, f ∘ₗ h = s • g

tactic: have hπ : Function.Surjective π :=
  LinearMap.range_eq_top.mp (by rw [Finsupp.range_total, Subtype.range_val, ← hσ]; rfl)
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
⊢ ∃ h s, f ∘ₗ h = s • g
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
⊢ ∃ h s, f ∘ₗ h = s • g

tactic: rw [Finsupp.range_total, Subtype.range_val, ← hσ]
state_before: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
⊢ LinearMap.range π = ⊤
state_after: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
⊢ (Submodule.span R fun x => x ∈ σ.val) = Submodule.span R ↑σ

tactic: rfl
state_before: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
⊢ (Submodule.span R fun x => x ∈ σ.val) = Submodule.span R ↑σ
state_after: no goals

tactic: choose s hs using IsLocalizedModule.surj S f
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
⊢ ∃ h s, f ∘ₗ h = s • g
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
⊢ ∃ h s, f ∘ₗ h = s • g

tactic: let i : σ → N :=
  fun x ↦ (∏ j ∈ σ.erase x.1, (s (g j)).2) • (s (g x)).1
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
⊢ ∃ h s, f ∘ₗ h = s • g
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
⊢ ∃ h s, f ∘ₗ h = s • g

tactic: let s₀ := ∏ j ∈ σ, (s (g j)).2
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
⊢ ∃ h s, f ∘ₗ h = s • g
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
⊢ ∃ h s, f ∘ₗ h = s • g

tactic: have hi : f ∘ₗ Finsupp.total σ N R i = (s₀ • g) ∘ₗ π := by
  ext j
  simp only [LinearMap.coe_comp, Function.comp_apply, Finsupp.lsingle_apply, Finsupp.total_single,
    one_smul, LinearMap.map_smul_of_tower, ← hs, LinearMap.smul_apply, i, s₀, π]
  rw [← mul_smul, Finset.prod_erase_mul]
  exact j.prop
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
⊢ ∃ h s, f ∘ₗ h = s • g
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
⊢ ∃ h s, f ∘ₗ h = s • g

tactic: choose s' hs' using this
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
this : ∀ (x : { x // x ∈ τ }), ∃ s, s • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
⊢ ∃ h s, f ∘ₗ h = s • g
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
⊢ ∃ h s, f ∘ₗ h = s • g

tactic: let s₁ := ∏ i : τ, s' i
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
⊢ ∃ h s, f ∘ₗ h = s • g
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
⊢ ∃ h s, f ∘ₗ h = s • g

tactic: have : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total σ N R i) := by
  rw [← hτ, Submodule.span_le]
  intro x hxσ
  simp only [s₁]
  rw [SetLike.mem_coe, LinearMap.mem_ker, LinearMap.smul_apply,
    ← Finset.prod_erase_mul _ _ (Finset.mem_univ ⟨x, hxσ⟩), mul_smul]
  convert smul_zero _
  exact hs' ⟨x, hxσ⟩
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
⊢ ∃ h s, f ∘ₗ h = s • g
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
⊢ ∃ h s, f ∘ₗ h = s • g

tactic: refine ⟨Submodule.liftQ _ _ this ∘ₗ
  (LinearMap.quotKerEquivOfSurjective _ hπ).symm.toLinearMap, s₁ * s₀, ?_⟩
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
⊢ ∃ h s, f ∘ₗ h = s • g
state_after: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
⊢ f ∘ₗ (LinearMap.ker π).liftQ (s₁ • Finsupp.total { x // x ∈ σ } N R i) this ∘ₗ ↑(π.quotKerEquivOfSurjective hπ).symm =
    (s₁ * s₀) • g

tactic: ext x
state_before: case mk.intro.intro.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
⊢ f ∘ₗ (LinearMap.ker π).liftQ (s₁ • Finsupp.total { x // x ∈ σ } N R i) this ∘ₗ ↑(π.quotKerEquivOfSurjective hπ).symm =
    (s₁ * s₀) • g
state_after: case mk.intro.intro.intro.h
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
x : M
⊢ (f ∘ₗ (LinearMap.ker π).liftQ (s₁ • Finsupp.total { x // x ∈ σ } N R i) this ∘ₗ ↑(π.quotKerEquivOfSurjective hπ).symm)
      x =
    ((s₁ * s₀) • g) x

tactic: obtain ⟨x, rfl⟩ := hπ x
state_before: case mk.intro.intro.intro.h
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
x : M
⊢ (f ∘ₗ (LinearMap.ker π).liftQ (s₁ • Finsupp.total { x // x ∈ σ } N R i) this ∘ₗ ↑(π.quotKerEquivOfSurjective hπ).symm)
      x =
    ((s₁ * s₀) • g) x
state_after: case mk.intro.intro.intro.h.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
x : { x // x ∈ σ } →₀ R
⊢ (f ∘ₗ (LinearMap.ker π).liftQ (s₁ • Finsupp.total { x // x ∈ σ } N R i) this ∘ₗ ↑(π.quotKerEquivOfSurjective hπ).symm)
      (π x) =
    ((s₁ * s₀) • g) (π x)

tactic: rw [← LinearMap.comp_apply, ← LinearMap.comp_apply, mul_smul, LinearMap.smul_comp, ← hi,
  ← LinearMap.comp_smul, LinearMap.comp_assoc, LinearMap.comp_assoc]
state_before: case mk.intro.intro.intro.h.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
x : { x // x ∈ σ } →₀ R
⊢ (f ∘ₗ (LinearMap.ker π).liftQ (s₁ • Finsupp.total { x // x ∈ σ } N R i) this ∘ₗ ↑(π.quotKerEquivOfSurjective hπ).symm)
      (π x) =
    ((s₁ * s₀) • g) (π x)
state_after: case mk.intro.intro.intro.h.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
x : { x // x ∈ σ } →₀ R
⊢ (f ∘ₗ
        (LinearMap.ker π).liftQ (s₁ • Finsupp.total { x // x ∈ σ } N R i) this ∘ₗ
          ↑(π.quotKerEquivOfSurjective hπ).symm ∘ₗ π)
      x =
    (f ∘ₗ (s₁ • Finsupp.total { x // x ∈ σ } N R i)) x

tactic: congr 2
state_before: case mk.intro.intro.intro.h.intro
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
x : { x // x ∈ σ } →₀ R
⊢ (f ∘ₗ
        (LinearMap.ker π).liftQ (s₁ • Finsupp.total { x // x ∈ σ } N R i) this ∘ₗ
          ↑(π.quotKerEquivOfSurjective hπ).symm ∘ₗ π)
      x =
    (f ∘ₗ (s₁ • Finsupp.total { x // x ∈ σ } N R i)) x
state_after: case mk.intro.intro.intro.h.intro.e_a.e_g
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
x : { x // x ∈ σ } →₀ R
⊢ (LinearMap.ker π).liftQ (s₁ • Finsupp.total { x // x ∈ σ } N R i) this ∘ₗ ↑(π.quotKerEquivOfSurjective hπ).symm ∘ₗ π =
    s₁ • Finsupp.total { x // x ∈ σ } N R i

tactic: convert Submodule.liftQ_mkQ _ _ this using 2
state_before: case mk.intro.intro.intro.h.intro.e_a.e_g
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
x : { x // x ∈ σ } →₀ R
⊢ (LinearMap.ker π).liftQ (s₁ • Finsupp.total { x // x ∈ σ } N R i) this ∘ₗ ↑(π.quotKerEquivOfSurjective hπ).symm ∘ₗ π =
    s₁ • Finsupp.total { x // x ∈ σ } N R i
state_after: case h.e'_2.h.e'_21.h.h.h.h
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
x : { x // x ∈ σ } →₀ R
e_7✝ : CommSemiring.toSemiring = Ring.toSemiring
e_10✝ : Finsupp.instAddCommMonoid = AddCommGroup.toAddCommMonoid
he✝ : RingHom.id R = RingHom.id R
⊢ ↑(π.quotKerEquivOfSurjective hπ).symm ∘ₗ π = (LinearMap.ker π).mkQ

tactic: ext x
state_before: case h.e'_2.h.e'_21.h.h.h.h
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
x : { x // x ∈ σ } →₀ R
e_7✝ : CommSemiring.toSemiring = Ring.toSemiring
e_10✝ : Finsupp.instAddCommMonoid = AddCommGroup.toAddCommMonoid
he✝ : RingHom.id R = RingHom.id R
⊢ ↑(π.quotKerEquivOfSurjective hπ).symm ∘ₗ π = (LinearMap.ker π).mkQ
state_after: case h.e'_2.h.e'_21.h.h.h.h.h.h
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
x✝ : { x // x ∈ σ } →₀ R
e_7✝ : CommSemiring.toSemiring = Ring.toSemiring
e_10✝ : Finsupp.instAddCommMonoid = AddCommGroup.toAddCommMonoid
he✝ : RingHom.id R = RingHom.id R
x : { x // x ∈ σ }
⊢ ((↑(π.quotKerEquivOfSurjective hπ).symm ∘ₗ π) ∘ₗ Finsupp.lsingle x) 1 = ((LinearMap.ker π).mkQ ∘ₗ Finsupp.lsingle x) 1

tactic: apply (LinearMap.quotKerEquivOfSurjective _ hπ).injective
state_before: case h.e'_2.h.e'_21.h.h.h.h.h.h
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
x✝ : { x // x ∈ σ } →₀ R
e_7✝ : CommSemiring.toSemiring = Ring.toSemiring
e_10✝ : Finsupp.instAddCommMonoid = AddCommGroup.toAddCommMonoid
he✝ : RingHom.id R = RingHom.id R
x : { x // x ∈ σ }
⊢ ((↑(π.quotKerEquivOfSurjective hπ).symm ∘ₗ π) ∘ₗ Finsupp.lsingle x) 1 = ((LinearMap.ker π).mkQ ∘ₗ Finsupp.lsingle x) 1
state_after: case h.e'_2.h.e'_21.h.h.h.h.h.h.a
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
x✝ : { x // x ∈ σ } →₀ R
e_7✝ : CommSemiring.toSemiring = Ring.toSemiring
e_10✝ : Finsupp.instAddCommMonoid = AddCommGroup.toAddCommMonoid
he✝ : RingHom.id R = RingHom.id R
x : { x // x ∈ σ }
⊢ (π.quotKerEquivOfSurjective hπ) (((↑(π.quotKerEquivOfSurjective hπ).symm ∘ₗ π) ∘ₗ Finsupp.lsingle x) 1) =
    (π.quotKerEquivOfSurjective hπ) (((LinearMap.ker π).mkQ ∘ₗ Finsupp.lsingle x) 1)

tactic: simp [LinearMap.quotKerEquivOfSurjective]
state_before: case h.e'_2.h.e'_21.h.h.h.h.h.h.a
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
this : LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
x✝ : { x // x ∈ σ } →₀ R
e_7✝ : CommSemiring.toSemiring = Ring.toSemiring
e_10✝ : Finsupp.instAddCommMonoid = AddCommGroup.toAddCommMonoid
he✝ : RingHom.id R = RingHom.id R
x : { x // x ∈ σ }
⊢ (π.quotKerEquivOfSurjective hπ) (((↑(π.quotKerEquivOfSurjective hπ).symm ∘ₗ π) ∘ₗ Finsupp.lsingle x) 1) =
    (π.quotKerEquivOfSurjective hπ) (((LinearMap.ker π).mkQ ∘ₗ Finsupp.lsingle x) 1)
state_after: no goals

tactic: ext j
state_before: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
⊢ f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
state_after: case h.h
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
j : { x // x ∈ σ }
⊢ ((f ∘ₗ Finsupp.total { x // x ∈ σ } N R i) ∘ₗ Finsupp.lsingle j) 1 = (((s₀ • g) ∘ₗ π) ∘ₗ Finsupp.lsingle j) 1

tactic: simp only [LinearMap.coe_comp, Function.comp_apply, Finsupp.lsingle_apply, Finsupp.total_single,
  one_smul, LinearMap.map_smul_of_tower, ← hs, LinearMap.smul_apply, i, s₀, π]
state_before: case h.h
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
j : { x // x ∈ σ }
⊢ ((f ∘ₗ Finsupp.total { x // x ∈ σ } N R i) ∘ₗ Finsupp.lsingle j) 1 = (((s₀ • g) ∘ₗ π) ∘ₗ Finsupp.lsingle j) 1
state_after: case h.h
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
j : { x // x ∈ σ }
⊢ (∏ j ∈ σ.erase ↑j, (s (g j)).2) • (s (g ↑j)).2 • g ↑j = (∏ j ∈ σ, (s (g j)).2) • g ↑j

tactic: rw [← mul_smul, Finset.prod_erase_mul]
state_before: case h.h
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
j : { x // x ∈ σ }
⊢ (∏ j ∈ σ.erase ↑j, (s (g j)).2) • (s (g ↑j)).2 • g ↑j = (∏ j ∈ σ, (s (g j)).2) • g ↑j
state_after: case h.h.h
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
j : { x // x ∈ σ }
⊢ ↑j ∈ σ

tactic: exact j.prop
state_before: case h.h.h
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
j : { x // x ∈ σ }
⊢ ↑j ∈ σ
state_after: no goals

tactic: intros x
state_before: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
⊢ ∀ (x : { x // x ∈ τ }), ∃ s, s • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
state_after: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
x : { x // x ∈ τ }
⊢ ∃ s, s • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0

tactic: convert_to ∃ s : S, s • (Finsupp.total σ N R i x) = s • 0
state_before: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
x : { x // x ∈ τ }
⊢ ∃ s, s • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
state_after: case h.e'_2
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
x : { x // x ∈ τ }
⊢ (fun s => s • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0) = fun s =>
    s • (Finsupp.total { x // x ∈ σ } N R i) ↑x = s • 0

R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
x : { x // x ∈ τ }
⊢ ∃ s, s • (Finsupp.total { x // x ∈ σ } N R i) ↑x = s • 0

tactic: apply IsLocalizedModule.exists_of_eq (S := S) (f := f)
state_before: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
x : { x // x ∈ τ }
⊢ ∃ s, s • (Finsupp.total { x // x ∈ σ } N R i) ↑x = s • 0
state_after: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
x : { x // x ∈ τ }
⊢ f ((Finsupp.total { x // x ∈ σ } N R i) ↑x) = f 0

tactic: rw [← LinearMap.comp_apply, map_zero, hi, LinearMap.comp_apply]
state_before: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
x : { x // x ∈ τ }
⊢ f ((Finsupp.total { x // x ∈ σ } N R i) ↑x) = f 0
state_after: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
x : { x // x ∈ τ }
⊢ (s₀ • g) (π ↑x) = 0

tactic: convert map_zero (s₀ • g)
state_before: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
x : { x // x ∈ τ }
⊢ (s₀ • g) (π ↑x) = 0
state_after: case h.e'_2.h.e'_6
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
x : { x // x ∈ τ }
⊢ π ↑x = 0

tactic: rw [← LinearMap.mem_ker, ← hτ]
state_before: case h.e'_2.h.e'_6
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
x : { x // x ∈ τ }
⊢ π ↑x = 0
state_after: case h.e'_2.h.e'_6
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
x : { x // x ∈ τ }
⊢ ↑x ∈ Submodule.span R ↑τ

tactic: exact Submodule.subset_span x.prop
state_before: case h.e'_2.h.e'_6
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
x : { x // x ∈ τ }
⊢ ↑x ∈ Submodule.span R ↑τ
state_after: no goals

tactic: simp only [smul_zero]
state_before: case h.e'_2
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
x : { x // x ∈ τ }
⊢ (fun s => s • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0) = fun s =>
    s • (Finsupp.total { x // x ∈ σ } N R i) ↑x = s • 0
state_after: no goals

tactic: rw [← hτ, Submodule.span_le]
state_before: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
⊢ LinearMap.ker π ≤ LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i)
state_after: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
⊢ ↑τ ⊆ ↑(LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i))

tactic: intro x hxσ
state_before: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
⊢ ↑τ ⊆ ↑(LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i))
state_after: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
x : { x // x ∈ σ } →₀ R
hxσ : x ∈ ↑τ
⊢ x ∈ ↑(LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i))

tactic: simp only [s₁]
state_before: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
x : { x // x ∈ σ } →₀ R
hxσ : x ∈ ↑τ
⊢ x ∈ ↑(LinearMap.ker (s₁ • Finsupp.total { x // x ∈ σ } N R i))
state_after: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
x : { x // x ∈ σ } →₀ R
hxσ : x ∈ ↑τ
⊢ x ∈ ↑(LinearMap.ker ((∏ i : { x // x ∈ τ }, s' i) • Finsupp.total { x // x ∈ σ } N R i))

tactic: rw [SetLike.mem_coe, LinearMap.mem_ker, LinearMap.smul_apply,
  ← Finset.prod_erase_mul _ _ (Finset.mem_univ ⟨x, hxσ⟩), mul_smul]
state_before: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
x : { x // x ∈ σ } →₀ R
hxσ : x ∈ ↑τ
⊢ x ∈ ↑(LinearMap.ker ((∏ i : { x // x ∈ τ }, s' i) • Finsupp.total { x // x ∈ σ } N R i))
state_after: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
x : { x // x ∈ σ } →₀ R
hxσ : x ∈ ↑τ
⊢ (∏ x ∈ Finset.univ.erase ⟨x, hxσ⟩, s' x) • s' ⟨x, hxσ⟩ • (Finsupp.total { x // x ∈ σ } N R i) x = 0

tactic: convert smul_zero _
state_before: R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
x : { x // x ∈ σ } →₀ R
hxσ : x ∈ ↑τ
⊢ (∏ x ∈ Finset.univ.erase ⟨x, hxσ⟩, s' x) • s' ⟨x, hxσ⟩ • (Finsupp.total { x // x ∈ σ } N R i) x = 0
state_after: case h.e'_2.h.e'_1
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
x : { x // x ∈ σ } →₀ R
hxσ : x ∈ ↑τ
⊢ s' ⟨x, hxσ⟩ • (Finsupp.total { x // x ∈ σ } N R i) x = 0

tactic: exact hs' ⟨x, hxσ⟩
state_before: case h.e'_2.h.e'_1
R : Type u_1
M : Type u_2
N : Type u_4
N' : Type u_3
inst✝⁷ : CommRing R
inst✝⁶ : AddCommGroup M
inst✝⁵ : Module R M
inst✝⁴ : AddCommGroup N
inst✝³ : Module R N
inst✝² : AddCommGroup N'
inst✝¹ : Module R N'
S : Submonoid R
f : N →ₗ[R] N'
inst✝ : IsLocalizedModule S f
g : M →ₗ[R] N'
σ : Finset M
hσ : Submodule.span R ↑σ = ⊤
τ : Finset ({ x // x ∈ σ } →₀ R)
hτ : Submodule.span R ↑τ = LinearMap.ker (Finsupp.total { x // x ∈ σ } M R Subtype.val)
π : ({ x // x ∈ σ } →₀ R) →ₗ[R] M := Finsupp.total { x // x ∈ σ } M R Subtype.val
hπ : Function.Surjective ⇑π
s : N' → N × ↥S
hs : ∀ (y : N'), (s y).2 • y = f (s y).1
i : { x // x ∈ σ } → N := fun x => (∏ j ∈ σ.erase ↑x, (s (g j)).2) • (s (g ↑x)).1
s₀ : ↥S := ∏ j ∈ σ, (s (g j)).2
hi : f ∘ₗ Finsupp.total { x // x ∈ σ } N R i = (s₀ • g) ∘ₗ π
s' : { x // x ∈ τ } → ↥S
hs' : ∀ (x : { x // x ∈ τ }), s' x • (Finsupp.total { x // x ∈ σ } N R i) ↑x = 0
s₁ : ↥S := ∏ i : { x // x ∈ τ }, s' i
x : { x // x ∈ σ } →₀ R
hxσ : x ∈ ↑τ
⊢ s' ⟨x, hxσ⟩ • (Finsupp.total { x // x ∈ σ } N R i) x = 0
state_after: no goals