Theorem: Module.free_of_maximalIdeal_rTensor_injective
File: Mathlib/RingTheory/LocalRing/Module.lean

Proof steps:
state_before: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
⊢ Free R M
state_after: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
⊢ Free R M
tactic: let I := Module.Free.ChooseBasisIndex k (k ⊗[R] M)
state_before: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
⊢ Free R M
state_after: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
⊢ Free R M
tactic: let b : Basis I k _ := Module.Free.chooseBasis k (k ⊗[R] M)
state_before: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
⊢ Free R M
state_after: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
⊢ Free R M
tactic: letI : IsNoetherian k (k ⊗[R] (I →₀ R)) :=
    isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
state_before: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
⊢ Free R M
state_after: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
⊢ Free R M
tactic: choose f hf using TensorProduct.mk_surjective R M k Ideal.Quotient.mk_surjective
state_before: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
⊢ Free R M
state_after: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
⊢ Free R M
tactic: let i := Finsupp.total I M R (f ∘ b)
state_before: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
⊢ Free R M
state_after: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
⊢ Free R M
tactic: have hi : Surjective i := by
    rw [← LinearMap.range_eq_top, Finsupp.range_total]
    exact LocalRing.span_eq_top_of_tmul_eq_basis (R := R) (f := f ∘ b) b (fun _ ↦ hf _)
state_before: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
⊢ Free R M
state_after: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝ : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this : Finite R ↥(LinearMap.ker i)
⊢ Free R M
tactic: have : Module.Finite R (LinearMap.ker i) := by
    constructor
    exact (Submodule.fg_top _).mpr (Module.FinitePresentation.fg_ker i hi)
state_before: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝ : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this : Finite R ↥(LinearMap.ker i)
⊢ Free R M
state_after: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝ : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this : Finite R ↥(LinearMap.ker i)
⊢ Function.Injective ⇑i
tactic: refine Module.Free.of_equiv (LinearEquiv.ofBijective i ⟨?_, hi⟩)
state_before: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝ : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this : Finite R ↥(LinearMap.ker i)
⊢ Function.Injective ⇑i
state_after: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝ : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this : Finite R ↥(LinearMap.ker i)
⊢ ∀ (y : k ⊗[R] ↥(LinearMap.ker i)), y = 0
tactic: rw [← LinearMap.ker_eq_bot, ← Submodule.subsingleton_iff_eq_bot,
    ← LocalRing.subsingleton_tensorProduct (R := R), subsingleton_iff_forall_eq 0]
state_before: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝ : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this : Finite R ↥(LinearMap.ker i)
⊢ ∀ (y : k ⊗[R] ↥(LinearMap.ker i)), y = 0
state_after: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝¹ : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝ : Finite R ↥(LinearMap.ker i)
this : Surjective ⇑(LinearMap.baseChange k i)
⊢ ∀ (y : k ⊗[R] ↥(LinearMap.ker i)), y = 0
tactic: have : Function.Surjective (i.baseChange k) := i.lTensor_surjective _ hi
state_before: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝¹ : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝ : Finite R ↥(LinearMap.ker i)
this : Surjective ⇑(LinearMap.baseChange k i)
⊢ ∀ (y : k ⊗[R] ↥(LinearMap.ker i)), y = 0
state_after: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝¹ : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝ : Finite R ↥(LinearMap.ker i)
this : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
⊢ ∀ (y : k ⊗[R] ↥(LinearMap.ker i)), y = 0
tactic: have hi' : Function.Bijective (i.baseChange k) := by
    refine ⟨?_, this⟩
    rw [← LinearMap.ker_eq_bot (M := k ⊗[R] (I →₀ R)) (f := i.baseChange k),
      ← Submodule.finrank_eq_zero (R := k) (M := k ⊗[R] (I →₀ R)),
      ← Nat.add_right_inj (n := FiniteDimensional.finrank k (LinearMap.range <| i.baseChange k)),
      LinearMap.finrank_range_add_finrank_ker (V := k ⊗[R] (I →₀ R)),
      LinearMap.range_eq_top.mpr this, finrank_top]
    simp only [FiniteDimensional.finrank_tensorProduct, FiniteDimensional.finrank_self,
      FiniteDimensional.finrank_finsupp_self, one_mul, add_zero]
    rw [FiniteDimensional.finrank_eq_card_chooseBasisIndex]
state_before: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝¹ : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝ : Finite R ↥(LinearMap.ker i)
this : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
⊢ ∀ (y : k ⊗[R] ↥(LinearMap.ker i)), y = 0
state_after: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝² : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝¹ : Finite R ↥(LinearMap.ker i)
this✝ : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
this :
  ∀ {g₁ : ↥(LinearMap.ker i) →ₗ[R] I →₀ R} {g₂ : (I →₀ R) →ₗ[R] M},
    Exact ⇑(Submodule.subtype 𝔪) ⇑(Submodule.mkQ 𝔪) →
      Surjective ⇑(Submodule.mkQ 𝔪) →
        Exact ⇑g₁ ⇑g₂ →
          Surjective ⇑g₂ →
            Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪)) →
              Function.Injective ⇑(LinearMap.lTensor R g₁) → Function.Injective ⇑(LinearMap.lTensor (R ⧸ 𝔪) g₁)
⊢ ∀ (y : k ⊗[R] ↥(LinearMap.ker i)), y = 0
tactic: have := @lTensor_injective_of_exact_of_exact_of_rTensor_injective
    (N₁ := LinearMap.ker i) (N₂ := I →₀ R) (N₃ := M)
    (f₁ := (𝔪).subtype) (f₂ := Submodule.mkQ 𝔪) inferInstance inferInstance inferInstance
    inferInstance inferInstance inferInstance
state_before: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝² : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝¹ : Finite R ↥(LinearMap.ker i)
this✝ : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
this :
  ∀ {g₁ : ↥(LinearMap.ker i) →ₗ[R] I →₀ R} {g₂ : (I →₀ R) →ₗ[R] M},
    Exact ⇑(Submodule.subtype 𝔪) ⇑(Submodule.mkQ 𝔪) →
      Surjective ⇑(Submodule.mkQ 𝔪) →
        Exact ⇑g₁ ⇑g₂ →
          Surjective ⇑g₂ →
            Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪)) →
              Function.Injective ⇑(LinearMap.lTensor R g₁) → Function.Injective ⇑(LinearMap.lTensor (R ⧸ 𝔪) g₁)
⊢ ∀ (y : k ⊗[R] ↥(LinearMap.ker i)), y = 0
state_after: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝² : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝¹ : Finite R ↥(LinearMap.ker i)
this✝ : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
this :
  ∀ {g₁ : ↥(LinearMap.ker i) →ₗ[R] I →₀ R} {g₂ : (I →₀ R) →ₗ[R] M},
    Exact ⇑(Submodule.subtype 𝔪) ⇑(Submodule.mkQ 𝔪) →
      Surjective ⇑(Submodule.mkQ 𝔪) →
        Exact ⇑g₁ ⇑g₂ →
          Surjective ⇑g₂ →
            Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪)) →
              Function.Injective ⇑(LinearMap.lTensor R g₁) → Function.Injective ⇑(LinearMap.lTensor (R ⧸ 𝔪) g₁)
x : k ⊗[R] ↥(LinearMap.ker i)
⊢ x = 0
tactic: intro x
state_before: R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝² : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝¹ : Finite R ↥(LinearMap.ker i)
this✝ : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
this :
  ∀ {g₁ : ↥(LinearMap.ker i) →ₗ[R] I →₀ R} {g₂ : (I →₀ R) →ₗ[R] M},
    Exact ⇑(Submodule.subtype 𝔪) ⇑(Submodule.mkQ 𝔪) →
      Surjective ⇑(Submodule.mkQ 𝔪) →
        Exact ⇑g₁ ⇑g₂ →
          Surjective ⇑g₂ →
            Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪)) →
              Function.Injective ⇑(LinearMap.lTensor R g₁) → Function.Injective ⇑(LinearMap.lTensor (R ⧸ 𝔪) g₁)
x : k ⊗[R] ↥(LinearMap.ker i)
⊢ x = 0
state_after: case a
R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝² : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝¹ : Finite R ↥(LinearMap.ker i)
this✝ : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
this :
  ∀ {g₁ : ↥(LinearMap.ker i) →ₗ[R] I →₀ R} {g₂ : (I →₀ R) →ₗ[R] M},
    Exact ⇑(Submodule.subtype 𝔪) ⇑(Submodule.mkQ 𝔪) →
      Surjective ⇑(Submodule.mkQ 𝔪) →
        Exact ⇑g₁ ⇑g₂ →
          Surjective ⇑g₂ →
            Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪)) →
              Function.Injective ⇑(LinearMap.lTensor R g₁) → Function.Injective ⇑(LinearMap.lTensor (R ⧸ 𝔪) g₁)
x : k ⊗[R] ↥(LinearMap.ker i)
⊢ (LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) x = (LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) 0
tactic: apply @this (LinearMap.ker i).subtype i (LinearMap.exact_subtype_mkQ 𝔪)
    (Submodule.mkQ_surjective _) (LinearMap.exact_subtype_ker_map i) hi H
    (Module.Flat.lTensor_preserves_injective_linearMap _ Subtype.val_injective)
state_before: case a
R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝² : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝¹ : Finite R ↥(LinearMap.ker i)
this✝ : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
this :
  ∀ {g₁ : ↥(LinearMap.ker i) →ₗ[R] I →₀ R} {g₂ : (I →₀ R) →ₗ[R] M},
    Exact ⇑(Submodule.subtype 𝔪) ⇑(Submodule.mkQ 𝔪) →
      Surjective ⇑(Submodule.mkQ 𝔪) →
        Exact ⇑g₁ ⇑g₂ →
          Surjective ⇑g₂ →
            Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪)) →
              Function.Injective ⇑(LinearMap.lTensor R g₁) → Function.Injective ⇑(LinearMap.lTensor (R ⧸ 𝔪) g₁)
x : k ⊗[R] ↥(LinearMap.ker i)
⊢ (LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) x = (LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) 0
state_after: case a.a
R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝² : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝¹ : Finite R ↥(LinearMap.ker i)
this✝ : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
this :
  ∀ {g₁ : ↥(LinearMap.ker i) →ₗ[R] I →₀ R} {g₂ : (I →₀ R) →ₗ[R] M},
    Exact ⇑(Submodule.subtype 𝔪) ⇑(Submodule.mkQ 𝔪) →
      Surjective ⇑(Submodule.mkQ 𝔪) →
        Exact ⇑g₁ ⇑g₂ →
          Surjective ⇑g₂ →
            Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪)) →
              Function.Injective ⇑(LinearMap.lTensor R g₁) → Function.Injective ⇑(LinearMap.lTensor (R ⧸ 𝔪) g₁)
x : k ⊗[R] ↥(LinearMap.ker i)
⊢ (LinearMap.baseChange k i) ((LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) x) =
    (LinearMap.baseChange k i) ((LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) 0)
tactic: apply hi'.injective
state_before: case a.a
R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝² : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝¹ : Finite R ↥(LinearMap.ker i)
this✝ : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
this :
  ∀ {g₁ : ↥(LinearMap.ker i) →ₗ[R] I →₀ R} {g₂ : (I →₀ R) →ₗ[R] M},
    Exact ⇑(Submodule.subtype 𝔪) ⇑(Submodule.mkQ 𝔪) →
      Surjective ⇑(Submodule.mkQ 𝔪) →
        Exact ⇑g₁ ⇑g₂ →
          Surjective ⇑g₂ →
            Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪)) →
              Function.Injective ⇑(LinearMap.lTensor R g₁) → Function.Injective ⇑(LinearMap.lTensor (R ⧸ 𝔪) g₁)
x : k ⊗[R] ↥(LinearMap.ker i)
⊢ (LinearMap.baseChange k i) ((LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) x) =
    (LinearMap.baseChange k i) ((LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) 0)
state_after: case a.a
R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝² : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝¹ : Finite R ↥(LinearMap.ker i)
this✝ : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
this :
  ∀ {g₁ : ↥(LinearMap.ker i) →ₗ[R] I →₀ R} {g₂ : (I →₀ R) →ₗ[R] M},
    Exact ⇑(Submodule.subtype 𝔪) ⇑(Submodule.mkQ 𝔪) →
      Surjective ⇑(Submodule.mkQ 𝔪) →
        Exact ⇑g₁ ⇑g₂ →
          Surjective ⇑g₂ →
            Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪)) →
              Function.Injective ⇑(LinearMap.lTensor R g₁) → Function.Injective ⇑(LinearMap.lTensor (R ⧸ 𝔪) g₁)
x : k ⊗[R] ↥(LinearMap.ker i)
⊢ (LinearMap.lTensor k i) ((LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) x) =
    (LinearMap.lTensor k i) ((LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) 0)
tactic: rw [LinearMap.baseChange_eq_ltensor]
state_before: case a.a
R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝² : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝¹ : Finite R ↥(LinearMap.ker i)
this✝ : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
this :
  ∀ {g₁ : ↥(LinearMap.ker i) →ₗ[R] I →₀ R} {g₂ : (I →₀ R) →ₗ[R] M},
    Exact ⇑(Submodule.subtype 𝔪) ⇑(Submodule.mkQ 𝔪) →
      Surjective ⇑(Submodule.mkQ 𝔪) →
        Exact ⇑g₁ ⇑g₂ →
          Surjective ⇑g₂ →
            Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪)) →
              Function.Injective ⇑(LinearMap.lTensor R g₁) → Function.Injective ⇑(LinearMap.lTensor (R ⧸ 𝔪) g₁)
x : k ⊗[R] ↥(LinearMap.ker i)
⊢ (LinearMap.lTensor k i) ((LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) x) =
    (LinearMap.lTensor k i) ((LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) 0)
state_after: case a.a
R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝² : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝¹ : Finite R ↥(LinearMap.ker i)
this✝ : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
this :
  ∀ {g₁ : ↥(LinearMap.ker i) →ₗ[R] I →₀ R} {g₂ : (I →₀ R) →ₗ[R] M},
    Exact ⇑(Submodule.subtype 𝔪) ⇑(Submodule.mkQ 𝔪) →
      Surjective ⇑(Submodule.mkQ 𝔪) →
        Exact ⇑g₁ ⇑g₂ →
          Surjective ⇑g₂ →
            Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪)) →
              Function.Injective ⇑(LinearMap.lTensor R g₁) → Function.Injective ⇑(LinearMap.lTensor (R ⧸ 𝔪) g₁)
x : k ⊗[R] ↥(LinearMap.ker i)
⊢ (LinearMap.lTensor k (i ∘ₗ (LinearMap.ker i).subtype)) x =
    (LinearMap.lTensor k i) ((LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) 0)
tactic: erw [← LinearMap.comp_apply (i.lTensor k), ← LinearMap.lTensor_comp]
state_before: case a.a
R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝² : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝¹ : Finite R ↥(LinearMap.ker i)
this✝ : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
this :
  ∀ {g₁ : ↥(LinearMap.ker i) →ₗ[R] I →₀ R} {g₂ : (I →₀ R) →ₗ[R] M},
    Exact ⇑(Submodule.subtype 𝔪) ⇑(Submodule.mkQ 𝔪) →
      Surjective ⇑(Submodule.mkQ 𝔪) →
        Exact ⇑g₁ ⇑g₂ →
          Surjective ⇑g₂ →
            Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪)) →
              Function.Injective ⇑(LinearMap.lTensor R g₁) → Function.Injective ⇑(LinearMap.lTensor (R ⧸ 𝔪) g₁)
x : k ⊗[R] ↥(LinearMap.ker i)
⊢ (LinearMap.lTensor k (i ∘ₗ (LinearMap.ker i).subtype)) x =
    (LinearMap.lTensor k i) ((LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) 0)
state_after: case a.a
R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝² : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝¹ : Finite R ↥(LinearMap.ker i)
this✝ : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
this :
  ∀ {g₁ : ↥(LinearMap.ker i) →ₗ[R] I →₀ R} {g₂ : (I →₀ R) →ₗ[R] M},
    Exact ⇑(Submodule.subtype 𝔪) ⇑(Submodule.mkQ 𝔪) →
      Surjective ⇑(Submodule.mkQ 𝔪) →
        Exact ⇑g₁ ⇑g₂ →
          Surjective ⇑g₂ →
            Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪)) →
              Function.Injective ⇑(LinearMap.lTensor R g₁) → Function.Injective ⇑(LinearMap.lTensor (R ⧸ 𝔪) g₁)
x : k ⊗[R] ↥(LinearMap.ker i)
⊢ (LinearMap.lTensor k 0) x = (LinearMap.lTensor k i) ((LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) 0)
tactic: rw [(LinearMap.exact_subtype_ker_map i).linearMap_comp_eq_zero]
state_before: case a.a
R : Type u_1
S : Type ?u.189967
inst✝¹⁰ : CommRing R
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
inst✝⁷ : LocalRing R
M : Type u_2
N : Type ?u.190432
inst✝⁶ : AddCommGroup M
inst✝⁵ : AddCommGroup N
inst✝⁴ : Module R M
inst✝³ : Module R N
P : Type ?u.191572
inst✝² : AddCommGroup P
inst✝¹ : Module R P
f✝ : M →ₗ[R] N
g : N →ₗ[R] P
hg : Surjective ⇑g
h : Exact ⇑f✝ ⇑g
inst✝ : FinitePresentation R M
H : Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪))
I : Type (max u_2 u_1) := Free.ChooseBasisIndex k (k ⊗[R] M)
b : Basis I k (k ⊗[R] M) := Free.chooseBasis k (k ⊗[R] M)
this✝² : IsNoetherian k (k ⊗[R] (I →₀ R)) := isNoetherian_of_isNoetherianRing_of_finite k (k ⊗[R] (I →₀ R))
f : k ⊗[R] M → M
hf : ∀ (b : k ⊗[R] M), ((TensorProduct.mk R k M) 1) (f b) = b
i : (I →₀ R) →ₗ[R] M := Finsupp.total I M R (f ∘ ⇑b)
hi : Surjective ⇑i
this✝¹ : Finite R ↥(LinearMap.ker i)
this✝ : Surjective ⇑(LinearMap.baseChange k i)
hi' : Function.Bijective ⇑(LinearMap.baseChange k i)
this :
  ∀ {g₁ : ↥(LinearMap.ker i) →ₗ[R] I →₀ R} {g₂ : (I →₀ R) →ₗ[R] M},
    Exact ⇑(Submodule.subtype 𝔪) ⇑(Submodule.mkQ 𝔪) →
      Surjective ⇑(Submodule.mkQ 𝔪) →
        Exact ⇑g₁ ⇑g₂ →
          Surjective ⇑g₂ →
            Function.Injective ⇑(LinearMap.rTensor M (Submodule.subtype 𝔪)) →
              Function.Injective ⇑(LinearMap.lTensor R g₁) → Function.Injective ⇑(LinearMap.lTensor (R ⧸ 𝔪) g₁)
x : k ⊗[R] ↥(LinearMap.ker i)
⊢ (LinearMap.lTensor k 0) x = (LinearMap.lTensor k i) ((LinearMap.lTensor (R ⧸ 𝔪) (LinearMap.ker i).subtype) 0)
state_after: no goals
tactic: simp only [LinearMap.lTensor_zero, LinearMap.zero_apply, map_zero]