-- Mathlib/CategoryTheory/Abelian/Refinements.lean
lemma ShortComplex.eq_liftCycles_homologyπ_up_to_refinements {A : C} (γ : A ⟶ S.homology) :
    ∃ (A' : C) (π : A' ⟶ A) (_ : Epi π) (z : A' ⟶ S.X₂) (hz : z ≫ S.g = 0),
      π ≫ γ = S.liftCycles z hz ≫ S.homologyπ

Proof state:
C : Type u_2
inst✝¹ : Category.{u_1, u_2} C
inst✝ : Abelian C
S : ShortComplex C
A : C
γ : A ⟶ S.homology
⊢ ∃ A' π, ∃ (_ : Epi π), ∃ z, ∃ (hz : z ≫ S.g = 0), π ≫ γ = S.liftCycles z hz ≫ S.homologyπ

Tactic:
obtain ⟨A', π, hπ, z, hz⟩ := surjective_up_to_refinements_of_epi S.homologyπ γ

Result:
case intro.intro.intro.intro
C : Type u_2
inst✝¹ : Category.{u_1, u_2} C
inst✝ : Abelian C
S : ShortComplex C
A : C
γ : A ⟶ S.homology
A' : C
π : A' ⟶ A
hπ : Epi π
z : A' ⟶ S.cycles
hz : π ≫ γ = z ≫ S.homologyπ
⊢ ∃ A' π, ∃ (_ : Epi π), ∃ z, ∃ (hz : z ≫ S.g = 0), π ≫ γ = S.liftCycles z hz ≫ S.homologyπ

Proof state:
C : Type u_2
inst✝¹ : Category.{u_1, u_2} C
inst✝ : Abelian C
S : ShortComplex C
A : C
γ : A ⟶ S.homology
A' : C
π : A' ⟶ A
hπ : Epi π
z : A' ⟶ S.cycles
hz : π ≫ γ = z ≫ S.homologyπ
⊢ (z ≫ S.iCycles) ≫ S.g = 0

Tactic:
simp

Result:
no goals

Proof state:
case intro.intro.intro.intro.e_a
C : Type u_2
inst✝¹ : Category.{u_1, u_2} C
inst✝ : Abelian C
S : ShortComplex C
A : C
γ : A ⟶ S.homology
A' : C
π : A' ⟶ A
hπ : Epi π
z : A' ⟶ S.cycles
hz : π ≫ γ = z ≫ S.homologyπ
⊢ z = S.liftCycles (z ≫ S.iCycles) ⋯

Tactic:
rw [← cancel_mono S.iCycles, liftCycles_i]

Result:
no goals

Proof state:
case intro.intro.intro.intro
C : Type u_2
inst✝¹ : Category.{u_1, u_2} C
inst✝ : Abelian C
S : ShortComplex C
A : C
γ : A ⟶ S.homology
A' : C
π : A' ⟶ A
hπ : Epi π
z : A' ⟶ S.cycles
hz : π ≫ γ = z ≫ S.homologyπ
⊢ π ≫ γ = S.liftCycles (z ≫ S.iCycles) ⋯ ≫ S.homologyπ

Tactic:
rw [hz]

Result:
case intro.intro.intro.intro
C : Type u_2
inst✝¹ : Category.{u_1, u_2} C
inst✝ : Abelian C
S : ShortComplex C
A : C
γ : A ⟶ S.homology
A' : C
π : A' ⟶ A
hπ : Epi π
z : A' ⟶ S.cycles
hz : π ≫ γ = z ≫ S.homologyπ
⊢ z ≫ S.homologyπ = S.liftCycles (z ≫ S.iCycles) ⋯ ≫ S.homologyπ

Proof state:
case intro.intro.intro.intro
C : Type u_2
inst✝¹ : Category.{u_1, u_2} C
inst✝ : Abelian C
S : ShortComplex C
A : C
γ : A ⟶ S.homology
A' : C
π : A' ⟶ A
hπ : Epi π
z : A' ⟶ S.cycles
hz : π ≫ γ = z ≫ S.homologyπ
⊢ ∃ A' π, ∃ (_ : Epi π), ∃ z, ∃ (hz : z ≫ S.g = 0), π ≫ γ = S.liftCycles z hz ≫ S.homologyπ

Tactic:
refine ⟨A', π, hπ, z ≫ S.iCycles, by simp, ?_⟩

Result:
case intro.intro.intro.intro
C : Type u_2
inst✝¹ : Category.{u_1, u_2} C
inst✝ : Abelian C
S : ShortComplex C
A : C
γ : A ⟶ S.homology
A' : C
π : A' ⟶ A
hπ : Epi π
z : A' ⟶ S.cycles
hz : π ≫ γ = z ≫ S.homologyπ
⊢ π ≫ γ = S.liftCycles (z ≫ S.iCycles) ⋯ ≫ S.homologyπ

Proof state:
case intro.intro.intro.intro
C : Type u_2
inst✝¹ : Category.{u_1, u_2} C
inst✝ : Abelian C
S : ShortComplex C
A : C
γ : A ⟶ S.homology
A' : C
π : A' ⟶ A
hπ : Epi π
z : A' ⟶ S.cycles
hz : π ≫ γ = z ≫ S.homologyπ
⊢ z ≫ S.homologyπ = S.liftCycles (z ≫ S.iCycles) ⋯ ≫ S.homologyπ

Tactic:
congr 1

Result:
case intro.intro.intro.intro.e_a
C : Type u_2
inst✝¹ : Category.{u_1, u_2} C
inst✝ : Abelian C
S : ShortComplex C
A : C
γ : A ⟶ S.homology
A' : C
π : A' ⟶ A
hπ : Epi π
z : A' ⟶ S.cycles
hz : π ≫ γ = z ≫ S.homologyπ
⊢ z = S.liftCycles (z ≫ S.iCycles) ⋯