-- Mathlib/CategoryTheory/Abelian/DiagramLemmas/Four.lean
theorem isIso_of_epi_of_isIso_of_isIso_of_mono (h₀ : Epi (app' φ 0)) (h₁ : IsIso (app' φ 1))
    (h₂ : IsIso (app' φ 3)) (h₃ : Mono (app' φ 4)) : IsIso (app' φ 2)

Proof state:
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Abelian C
R₁ R₂ : ComposableArrows C 4
hR₁ : R₁.Exact
hR₂ : R₂.Exact
φ : R₁ ⟶ R₂
h₀ : Epi (φ.app 0)
h₁ : IsIso (φ.app 1)
h₂ : IsIso (φ.app 3)
h₃ : Mono (φ.app 4)
this : Mono (app' φ 2 ⋯)
⊢ Epi (app' φ 2 ⋯)

Tactic:
apply epi_of_epi_of_epi_of_mono (δ₀Functor.map φ) (R₁.exact_iff_δ₀.1 hR₁).2
  (R₂.exact_iff_δ₀.1 hR₂).2 <;> dsimp <;> infer_instance

Result:
no goals

Proof state:
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Abelian C
R₁ R₂ : ComposableArrows C 4
hR₁ : R₁.Exact
hR₂ : R₂.Exact
φ : R₁ ⟶ R₂
h₀ : Epi (φ.app 0)
h₁ : IsIso (φ.app 1)
h₂ : IsIso (φ.app 3)
h₃ : Mono (φ.app 4)
⊢ Mono (app' φ 2 ⋯)

Tactic:
apply mono_of_epi_of_mono_of_mono (δlastFunctor.map φ) (R₁.exact_iff_δlast.1 hR₁).1
  (R₂.exact_iff_δlast.1 hR₂).1 <;> dsimp <;> infer_instance

Result:
no goals

Proof state:
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Abelian C
R₁ R₂ : ComposableArrows C 4
hR₁ : R₁.Exact
hR₂ : R₂.Exact
φ : R₁ ⟶ R₂
h₀ : Epi (φ.app 0)
h₁ : IsIso (φ.app 1)
h₂ : IsIso (φ.app 3)
h₃ : Mono (φ.app 4)
this : Mono (app' φ 2 ⋯)
⊢ IsIso (app' φ 2 ⋯)

Tactic:
have : Epi (app' φ 2) := by
  apply epi_of_epi_of_epi_of_mono (δ₀Functor.map φ) (R₁.exact_iff_δ₀.1 hR₁).2
    (R₂.exact_iff_δ₀.1 hR₂).2 <;> dsimp <;> infer_instance

Result:
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Abelian C
R₁ R₂ : ComposableArrows C 4
hR₁ : R₁.Exact
hR₂ : R₂.Exact
φ : R₁ ⟶ R₂
h₀ : Epi (φ.app 0)
h₁ : IsIso (φ.app 1)
h₂ : IsIso (φ.app 3)
h₃ : Mono (φ.app 4)
this✝ : Mono (app' φ 2 ⋯)
this : Epi (app' φ 2 ⋯)
⊢ IsIso (app' φ 2 ⋯)

Proof state:
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Abelian C
R₁ R₂ : ComposableArrows C 4
hR₁ : R₁.Exact
hR₂ : R₂.Exact
φ : R₁ ⟶ R₂
h₀ : Epi (φ.app 0)
h₁ : IsIso (φ.app 1)
h₂ : IsIso (φ.app 3)
h₃ : Mono (φ.app 4)
this✝ : Mono (app' φ 2 ⋯)
this : Epi (app' φ 2 ⋯)
⊢ IsIso (app' φ 2 ⋯)

Tactic:
apply isIso_of_mono_of_epi

Result:
no goals

Proof state:
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Abelian C
R₁ R₂ : ComposableArrows C 4
hR₁ : R₁.Exact
hR₂ : R₂.Exact
φ : R₁ ⟶ R₂
h₀ : Epi (app' φ 0 ⋯)
h₁ : IsIso (app' φ 1 ⋯)
h₂ : IsIso (app' φ 3 ⋯)
h₃ : Mono (app' φ 4 ⋯)
⊢ IsIso (app' φ 2 ⋯)

Tactic:
dsimp at h₀ h₁ h₂ h₃

Result:
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Abelian C
R₁ R₂ : ComposableArrows C 4
hR₁ : R₁.Exact
hR₂ : R₂.Exact
φ : R₁ ⟶ R₂
h₀ : Epi (φ.app 0)
h₁ : IsIso (φ.app 1)
h₂ : IsIso (φ.app 3)
h₃ : Mono (φ.app 4)
⊢ IsIso (app' φ 2 ⋯)

Proof state:
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Abelian C
R₁ R₂ : ComposableArrows C 4
hR₁ : R₁.Exact
hR₂ : R₂.Exact
φ : R₁ ⟶ R₂
h₀ : Epi (φ.app 0)
h₁ : IsIso (φ.app 1)
h₂ : IsIso (φ.app 3)
h₃ : Mono (φ.app 4)
⊢ IsIso (app' φ 2 ⋯)

Tactic:
have : Mono (app' φ 2) := by
  apply mono_of_epi_of_mono_of_mono (δlastFunctor.map φ) (R₁.exact_iff_δlast.1 hR₁).1
    (R₂.exact_iff_δlast.1 hR₂).1 <;> dsimp <;> infer_instance

Result:
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Abelian C
R₁ R₂ : ComposableArrows C 4
hR₁ : R₁.Exact
hR₂ : R₂.Exact
φ : R₁ ⟶ R₂
h₀ : Epi (φ.app 0)
h₁ : IsIso (φ.app 1)
h₂ : IsIso (φ.app 3)
h₃ : Mono (φ.app 4)
this : Mono (app' φ 2 ⋯)
⊢ IsIso (app' φ 2 ⋯)