Theorem: Module.Flat.exists_factorization_of_isFinitelyPresented
File: Mathlib/RingTheory/Flat/EquationalCriterion.lean

tactic: obtain ⟨L, _, _, K, ϕ, _, _, hK⟩ := FinitePresentation.equiv_quotient R P
state_before: R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
⊢ ∃ κ x h₂ h₃, h₁ = h₃ ∘ₗ h₂
state_after: case intro.intro.intro.intro.intro.intro.intro
R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
⊢ ∃ κ x h₂ h₃, h₁ = h₃ ∘ₗ h₂

tactic: haveI : Finite R ↥K := Module.Finite.iff_fg.mpr hK
state_before: case intro.intro.intro.intro.intro.intro.intro
R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
⊢ ∃ κ x h₂ h₃, h₁ = h₃ ∘ₗ h₂
state_after: case intro.intro.intro.intro.intro.intro.intro
R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
this : Finite R ↥K
⊢ ∃ κ x h₂ h₃, h₁ = h₃ ∘ₗ h₂

tactic: have : (h₁ ∘ₗ ϕ.symm ∘ₗ K.mkQ) ∘ₗ K.subtype = 0 := by
  simp_rw [comp_assoc, (LinearMap.exact_subtype_mkQ K).linearMap_comp_eq_zero, comp_zero]
state_before: case intro.intro.intro.intro.intro.intro.intro
R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
this : Finite R ↥K
⊢ ∃ κ x h₂ h₃, h₁ = h₃ ∘ₗ h₂
state_after: case intro.intro.intro.intro.intro.intro.intro
R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
this✝ : Finite R ↥K
this : (h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ) ∘ₗ K.subtype = 0
⊢ ∃ κ x h₂ h₃, h₁ = h₃ ∘ₗ h₂

tactic: obtain ⟨κ, hκ, a, y, hay, ha⟩ := exists_factorization_of_comp_eq_zero_of_free this
state_before: case intro.intro.intro.intro.intro.intro.intro
R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
this✝ : Finite R ↥K
this : (h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ) ∘ₗ K.subtype = 0
⊢ ∃ κ x h₂ h₃, h₁ = h₃ ∘ₗ h₂
state_after: case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
this✝ : Finite R ↥K
this : (h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ) ∘ₗ K.subtype = 0
κ : Type u
hκ : Fintype κ
a : L →ₗ[R] κ →₀ R
y : (κ →₀ R) →ₗ[R] M
hay : h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ = y ∘ₗ a
ha : a ∘ₗ K.subtype = 0
⊢ ∃ κ x h₂ h₃, h₁ = h₃ ∘ₗ h₂

tactic: use κ, hκ, (K.liftQ a (by rwa [← range_le_ker_iff, Submodule.range_subtype] at ha)) ∘ₗ ϕ, y
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
this✝ : Finite R ↥K
this : (h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ) ∘ₗ K.subtype = 0
κ : Type u
hκ : Fintype κ
a : L →ₗ[R] κ →₀ R
y : (κ →₀ R) →ₗ[R] M
hay : h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ = y ∘ₗ a
ha : a ∘ₗ K.subtype = 0
⊢ ∃ κ x h₂ h₃, h₁ = h₃ ∘ₗ h₂
state_after: case h
R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
this✝ : Finite R ↥K
this : (h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ) ∘ₗ K.subtype = 0
κ : Type u
hκ : Fintype κ
a : L →ₗ[R] κ →₀ R
y : (κ →₀ R) →ₗ[R] M
hay : h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ = y ∘ₗ a
ha : a ∘ₗ K.subtype = 0
⊢ h₁ = y ∘ₗ K.liftQ a ⋯ ∘ₗ ↑ϕ

tactic: apply (cancel_right ϕ.symm.surjective).mp
state_before: case h
R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
this✝ : Finite R ↥K
this : (h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ) ∘ₗ K.subtype = 0
κ : Type u
hκ : Fintype κ
a : L →ₗ[R] κ →₀ R
y : (κ →₀ R) →ₗ[R] M
hay : h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ = y ∘ₗ a
ha : a ∘ₗ K.subtype = 0
⊢ h₁ = y ∘ₗ K.liftQ a ⋯ ∘ₗ ↑ϕ
state_after: case h
R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
this✝ : Finite R ↥K
this : (h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ) ∘ₗ K.subtype = 0
κ : Type u
hκ : Fintype κ
a : L →ₗ[R] κ →₀ R
y : (κ →₀ R) →ₗ[R] M
hay : h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ = y ∘ₗ a
ha : a ∘ₗ K.subtype = 0
⊢ h₁ ∘ₗ ↑ϕ.symm = (y ∘ₗ K.liftQ a ⋯ ∘ₗ ↑ϕ) ∘ₗ ↑ϕ.symm

tactic: apply (cancel_right K.mkQ_surjective).mp
state_before: case h
R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
this✝ : Finite R ↥K
this : (h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ) ∘ₗ K.subtype = 0
κ : Type u
hκ : Fintype κ
a : L →ₗ[R] κ →₀ R
y : (κ →₀ R) →ₗ[R] M
hay : h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ = y ∘ₗ a
ha : a ∘ₗ K.subtype = 0
⊢ h₁ ∘ₗ ↑ϕ.symm = (y ∘ₗ K.liftQ a ⋯ ∘ₗ ↑ϕ) ∘ₗ ↑ϕ.symm
state_after: case h
R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
this✝ : Finite R ↥K
this : (h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ) ∘ₗ K.subtype = 0
κ : Type u
hκ : Fintype κ
a : L →ₗ[R] κ →₀ R
y : (κ →₀ R) →ₗ[R] M
hay : h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ = y ∘ₗ a
ha : a ∘ₗ K.subtype = 0
⊢ (h₁ ∘ₗ ↑ϕ.symm) ∘ₗ K.mkQ = ((y ∘ₗ K.liftQ a ⋯ ∘ₗ ↑ϕ) ∘ₗ ↑ϕ.symm) ∘ₗ K.mkQ

tactic: simpa [comp_assoc]
state_before: case h
R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
this✝ : Finite R ↥K
this : (h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ) ∘ₗ K.subtype = 0
κ : Type u
hκ : Fintype κ
a : L →ₗ[R] κ →₀ R
y : (κ →₀ R) →ₗ[R] M
hay : h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ = y ∘ₗ a
ha : a ∘ₗ K.subtype = 0
⊢ (h₁ ∘ₗ ↑ϕ.symm) ∘ₗ K.mkQ = ((y ∘ₗ K.liftQ a ⋯ ∘ₗ ↑ϕ) ∘ₗ ↑ϕ.symm) ∘ₗ K.mkQ
state_after: no goals

tactic: simp_rw [comp_assoc, (LinearMap.exact_subtype_mkQ K).linearMap_comp_eq_zero, comp_zero]
state_before: R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
this : Finite R ↥K
⊢ (h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ) ∘ₗ K.subtype = 0
state_after: no goals

tactic: rwa [← range_le_ker_iff, Submodule.range_subtype] at ha
state_before: R M : Type u
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M
inst✝⁴ : Module R M
inst✝³ : Flat R M
P : Type u
inst✝² : AddCommGroup P
inst✝¹ : Module R P
inst✝ : FinitePresentation R P
h₁ : P →ₗ[R] M
L : Type u
w✝¹ : AddCommGroup L
w✝ : Module R L
K : Submodule R L
ϕ : P ≃ₗ[R] L ⧸ K
left✝¹ : Free R L
left✝ : Finite R L
hK : K.FG
this✝ : Finite R ↥K
this : (h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ) ∘ₗ K.subtype = 0
κ : Type u
hκ : Fintype κ
a : L →ₗ[R] κ →₀ R
y : (κ →₀ R) →ₗ[R] M
hay : h₁ ∘ₗ ↑ϕ.symm ∘ₗ K.mkQ = y ∘ₗ a
ha : a ∘ₗ K.subtype = 0
⊢ K ≤ ker a
state_after: no goals