Theorem: Module.Flat.rTensor_exact
File: Mathlib/RingTheory/Flat/Basic.lean

Proof steps:
state_before: R : Type u
M : Type v
inst✝¹¹ : CommRing R
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
N✝ : Type w
inst✝⁸ : AddCommGroup N✝
inst✝⁷ : Module R N✝
inst✝⁶ : Small.{v, u} R
flat : Flat R M
N N' N'' : Type v
inst✝⁵ : AddCommGroup N
inst✝⁴ : AddCommGroup N'
inst✝³ : AddCommGroup N''
inst✝² : Module R N
inst✝¹ : Module R N'
inst✝ : Module R N''
f : N →ₗ[R] N'
g : N' →ₗ[R] N''
exact : Function.Exact ⇑f ⇑g
⊢ Function.Exact ⇑(rTensor M f) ⇑(rTensor M g)
state_after: R : Type u
M : Type v
inst✝¹¹ : CommRing R
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
N✝ : Type w
inst✝⁸ : AddCommGroup N✝
inst✝⁷ : Module R N✝
inst✝⁶ : Small.{v, u} R
flat : Flat R M
N N' N'' : Type v
inst✝⁵ : AddCommGroup N
inst✝⁴ : AddCommGroup N'
inst✝³ : AddCommGroup N''
inst✝² : Module R N
inst✝¹ : Module R N'
inst✝ : Module R N''
f : N →ₗ[R] N'
g : N' →ₗ[R] N''
exact : Function.Exact ⇑f ⇑g
π : N' →ₗ[R] N' ⧸ range f := (range f).mkQ
⊢ Function.Exact ⇑(rTensor M f) ⇑(rTensor M g)
tactic: let π : N' →ₗ[R] N' ⧸ LinearMap.range f := Submodule.mkQ _
state_before: R : Type u
M : Type v
inst✝¹¹ : CommRing R
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
N✝ : Type w
inst✝⁸ : AddCommGroup N✝
inst✝⁷ : Module R N✝
inst✝⁶ : Small.{v, u} R
flat : Flat R M
N N' N'' : Type v
inst✝⁵ : AddCommGroup N
inst✝⁴ : AddCommGroup N'
inst✝³ : AddCommGroup N''
inst✝² : Module R N
inst✝¹ : Module R N'
inst✝ : Module R N''
f : N →ₗ[R] N'
g : N' →ₗ[R] N''
exact : Function.Exact ⇑f ⇑g
π : N' →ₗ[R] N' ⧸ range f := (range f).mkQ
⊢ Function.Exact ⇑(rTensor M f) ⇑(rTensor M g)
state_after: R : Type u
M : Type v
inst✝¹¹ : CommRing R
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
N✝ : Type w
inst✝⁸ : AddCommGroup N✝
inst✝⁷ : Module R N✝
inst✝⁶ : Small.{v, u} R
flat : Flat R M
N N' N'' : Type v
inst✝⁵ : AddCommGroup N
inst✝⁴ : AddCommGroup N'
inst✝³ : AddCommGroup N''
inst✝² : Module R N
inst✝¹ : Module R N'
inst✝ : Module R N''
f : N →ₗ[R] N'
g : N' →ₗ[R] N''
exact : Function.Exact ⇑f ⇑g
π : N' →ₗ[R] N' ⧸ range f := (range f).mkQ
ι : N' ⧸ range f →ₗ[R] N'' := (range g).subtype ∘ₗ ↑g.quotKerEquivRange ∘ₗ ↑((range f).quotEquivOfEq (ker g) ⋯)
⊢ Function.Exact ⇑(rTensor M f) ⇑(rTensor M g)
tactic: let ι : N' ⧸ LinearMap.range f →ₗ[R] N'' :=
    Submodule.subtype _ ∘ₗ (LinearMap.quotKerEquivRange g).toLinearMap ∘ₗ
      Submodule.quotEquivOfEq (LinearMap.range f) (LinearMap.ker g)
        (LinearMap.exact_iff.mp exact).symm
state_before: R : Type u
M : Type v
inst✝¹¹ : CommRing R
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
N✝ : Type w
inst✝⁸ : AddCommGroup N✝
inst✝⁷ : Module R N✝
inst✝⁶ : Small.{v, u} R
flat : Flat R M
N N' N'' : Type v
inst✝⁵ : AddCommGroup N
inst✝⁴ : AddCommGroup N'
inst✝³ : AddCommGroup N''
inst✝² : Module R N
inst✝¹ : Module R N'
inst✝ : Module R N''
f : N →ₗ[R] N'
g : N' →ₗ[R] N''
exact : Function.Exact ⇑f ⇑g
π : N' →ₗ[R] N' ⧸ range f := (range f).mkQ
ι : N' ⧸ range f →ₗ[R] N'' := (range g).subtype ∘ₗ ↑g.quotKerEquivRange ∘ₗ ↑((range f).quotEquivOfEq (ker g) ⋯)
⊢ Function.Exact ⇑(rTensor M f) ⇑(rTensor M g)
state_after: R : Type u
M : Type v
inst✝¹¹ : CommRing R
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
N✝ : Type w
inst✝⁸ : AddCommGroup N✝
inst✝⁷ : Module R N✝
inst✝⁶ : Small.{v, u} R
flat : Flat R M
N N' N'' : Type v
inst✝⁵ : AddCommGroup N
inst✝⁴ : AddCommGroup N'
inst✝³ : AddCommGroup N''
inst✝² : Module R N
inst✝¹ : Module R N'
inst✝ : Module R N''
f : N →ₗ[R] N'
g : N' →ₗ[R] N''
exact : Function.Exact ⇑f ⇑g
π : N' →ₗ[R] N' ⧸ range f := (range f).mkQ
ι : N' ⧸ range f →ₗ[R] N'' := (range g).subtype ∘ₗ ↑g.quotKerEquivRange ∘ₗ ↑((range f).quotEquivOfEq (ker g) ⋯)
⊢ Function.Exact ⇑(rTensor M f) ⇑(rTensor M π)
tactic: suffices exact1 : Function.Exact (f.rTensor M) (π.rTensor M) by
    rw [show g = ι.comp π by aesop, rTensor_comp]
    exact exact1.comp_injective
      (inj := iff_rTensor_preserves_injective_linearMap R M |>.mp flat _ $ by
        simpa [ι] using Subtype.val_injective)
      (h0 := map_zero _)
state_before: R : Type u
M : Type v
inst✝¹¹ : CommRing R
inst✝¹⁰ : AddCommGroup M
inst✝⁹ : Module R M
N✝ : Type w
inst✝⁸ : AddCommGroup N✝
inst✝⁷ : Module R N✝
inst✝⁶ : Small.{v, u} R
flat : Flat R M
N N' N'' : Type v
inst✝⁵ : AddCommGroup N
inst✝⁴ : AddCommGroup N'
inst✝³ : AddCommGroup N''
inst✝² : Module R N
inst✝¹ : Module R N'
inst✝ : Module R N''
f : N →ₗ[R] N'
g : N' →ₗ[R] N''
exact : Function.Exact ⇑f ⇑g
π : N' →ₗ[R] N' ⧸ range f := (range f).mkQ
ι : N' ⧸ range f →ₗ[R] N'' := (range g).subtype ∘ₗ ↑g.quotKerEquivRange ∘ₗ ↑((range f).quotEquivOfEq (ker g) ⋯)
⊢ Function.Exact ⇑(rTensor M f) ⇑(rTensor M π)
state_after: no goals
tactic: exact _root_.rTensor_exact _ (fun x => by simp [π]) Quotient.surjective_Quotient_mk''