Theorem: CategoryTheory.exact_of_split
File: Mathlib/Algebra/Homology/ShortExact/Preadditive.lean

tactic: set ψ : (kernelSubobject g : 𝒜) ⟶ imageSubobject f :=
  Subobject.arrow _ ≫ φ ≫ factorThruImageSubobject f
state_before: 𝒜 : Type u_2
inst✝³ : Category 𝒜
A✝ B✝ C✝ A' B' C' : 𝒜
f✝ : A✝ ⟶ B✝
g✝ : B✝ ⟶ C✝
f' : A' ⟶ B'
g' : B' ⟶ C'
inst✝² : Preadditive 𝒜
inst✝¹ : HasKernels 𝒜
inst✝ : HasImages 𝒜
A B C : 𝒜
f : A ⟶ B
g : B ⟶ C
χ : C ⟶ B
φ : B ⟶ A
hfg : f ≫ g = 0
H : φ ≫ f + g ≫ χ = 𝟙 B
⊢ Epi (imageToKernel f g hfg)

tactic: suffices : ψ ≫ imageToKernel f g hfg = 𝟙 _
state_before: 𝒜 : Type u_2
inst✝³ : Category 𝒜
A✝ B✝ C✝ A' B' C' : 𝒜
f✝ : A✝ ⟶ B✝
g✝ : B✝ ⟶ C✝
f' : A' ⟶ B'
g' : B' ⟶ C'
inst✝² : Preadditive 𝒜
inst✝¹ : HasKernels 𝒜
inst✝ : HasImages 𝒜
A B C : 𝒜
f : A ⟶ B
g : B ⟶ C
χ : C ⟶ B
φ : B ⟶ A
hfg : f ≫ g = 0
H : φ ≫ f + g ≫ χ = 𝟙 B
ψ : Subobject.underlying.obj (kernelSubobject g) ⟶ Subobject.underlying.obj (imageSubobject f) :=
  Subobject.arrow (kernelSubobject g) ≫ φ ≫ factorThruImageSubobject f
⊢ Epi (imageToKernel f g hfg)

tactic: rw [← cancel_mono (Subobject.arrow _)]
state_before: case this
𝒜 : Type u_2
inst✝³ : Category 𝒜
A✝ B✝ C✝ A' B' C' : 𝒜
f✝ : A✝ ⟶ B✝
g✝ : B✝ ⟶ C✝
f' : A' ⟶ B'
g' : B' ⟶ C'
inst✝² : Preadditive 𝒜
inst✝¹ : HasKernels 𝒜
inst✝ : HasImages 𝒜
A B C : 𝒜
f : A ⟶ B
g : B ⟶ C
χ : C ⟶ B
φ : B ⟶ A
hfg : f ≫ g = 0
H : φ ≫ f + g ≫ χ = 𝟙 B
ψ : Subobject.underlying.obj (kernelSubobject g) ⟶ Subobject.underlying.obj (imageSubobject f) :=
  Subobject.arrow (kernelSubobject g) ≫ φ ≫ factorThruImageSubobject f
⊢ ψ ≫ imageToKernel f g hfg = 𝟙 (Subobject.underlying.obj (kernelSubobject g))

tactic: simp only [imageToKernel_arrow, imageSubobject_arrow_comp, Category.id_comp, Category.assoc]
state_before: case this
𝒜 : Type u_2
inst✝³ : Category 𝒜
A✝ B✝ C✝ A' B' C' : 𝒜
f✝ : A✝ ⟶ B✝
g✝ : B✝ ⟶ C✝
f' : A' ⟶ B'
g' : B' ⟶ C'
inst✝² : Preadditive 𝒜
inst✝¹ : HasKernels 𝒜
inst✝ : HasImages 𝒜
A B C : 𝒜
f : A ⟶ B
g : B ⟶ C
χ : C ⟶ B
φ : B ⟶ A
hfg : f ≫ g = 0
H : φ ≫ f + g ≫ χ = 𝟙 B
ψ : Subobject.underlying.obj (kernelSubobject g) ⟶ Subobject.underlying.obj (imageSubobject f) :=
  Subobject.arrow (kernelSubobject g) ≫ φ ≫ factorThruImageSubobject f
⊢ (ψ ≫ imageToKernel f g hfg) ≫ Subobject.arrow (kernelSubobject g) =
    𝟙 (Subobject.underlying.obj (kernelSubobject g)) ≫ Subobject.arrow (kernelSubobject g)

tactic: calc
  (kernelSubobject g).arrow ≫ φ ≫ f = (kernelSubobject g).arrow ≫ 𝟙 B := by
    rw [← H, Preadditive.comp_add]
    simp only [add_zero, zero_comp, kernelSubobject_arrow_comp_assoc]
  _ = (kernelSubobject g).arrow := Category.comp_id _
state_before: case this
𝒜 : Type u_2
inst✝³ : Category 𝒜
A✝ B✝ C✝ A' B' C' : 𝒜
f✝ : A✝ ⟶ B✝
g✝ : B✝ ⟶ C✝
f' : A' ⟶ B'
g' : B' ⟶ C'
inst✝² : Preadditive 𝒜
inst✝¹ : HasKernels 𝒜
inst✝ : HasImages 𝒜
A B C : 𝒜
f : A ⟶ B
g : B ⟶ C
χ : C ⟶ B
φ : B ⟶ A
hfg : f ≫ g = 0
H : φ ≫ f + g ≫ χ = 𝟙 B
ψ : Subobject.underlying.obj (kernelSubobject g) ⟶ Subobject.underlying.obj (imageSubobject f) :=
  Subobject.arrow (kernelSubobject g) ≫ φ ≫ factorThruImageSubobject f
⊢ Subobject.arrow (kernelSubobject g) ≫ φ ≫ f = Subobject.arrow (kernelSubobject g)

tactic: exact epi_of_epi_fac this
state_before: 𝒜 : Type u_2
inst✝³ : Category 𝒜
A✝ B✝ C✝ A' B' C' : 𝒜
f✝ : A✝ ⟶ B✝
g✝ : B✝ ⟶ C✝
f' : A' ⟶ B'
g' : B' ⟶ C'
inst✝² : Preadditive 𝒜
inst✝¹ : HasKernels 𝒜
inst✝ : HasImages 𝒜
A B C : 𝒜
f : A ⟶ B
g : B ⟶ C
χ : C ⟶ B
φ : B ⟶ A
hfg : f ≫ g = 0
H : φ ≫ f + g ≫ χ = 𝟙 B
ψ : Subobject.underlying.obj (kernelSubobject g) ⟶ Subobject.underlying.obj (imageSubobject f) :=
  Subobject.arrow (kernelSubobject g) ≫ φ ≫ factorThruImageSubobject f
this : ψ ≫ imageToKernel f g hfg = 𝟙 (Subobject.underlying.obj (kernelSubobject g))
⊢ Epi (imageToKernel f g hfg)

tactic: rw [← H, Preadditive.comp_add]
state_before: 𝒜 : Type u_2
inst✝³ : Category 𝒜
A✝ B✝ C✝ A' B' C' : 𝒜
f✝ : A✝ ⟶ B✝
g✝ : B✝ ⟶ C✝
f' : A' ⟶ B'
g' : B' ⟶ C'
inst✝² : Preadditive 𝒜
inst✝¹ : HasKernels 𝒜
inst✝ : HasImages 𝒜
A B C : 𝒜
f : A ⟶ B
g : B ⟶ C
χ : C ⟶ B
φ : B ⟶ A
hfg : f ≫ g = 0
H : φ ≫ f + g ≫ χ = 𝟙 B
ψ : Subobject.underlying.obj (kernelSubobject g) ⟶ Subobject.underlying.obj (imageSubobject f) :=
  Subobject.arrow (kernelSubobject g) ≫ φ ≫ factorThruImageSubobject f
⊢ Subobject.arrow (kernelSubobject g) ≫ φ ≫ f = Subobject.arrow (kernelSubobject g) ≫ 𝟙 B

tactic: simp only [add_zero, zero_comp, kernelSubobject_arrow_comp_assoc]
state_before: 𝒜 : Type u_2
inst✝³ : Category 𝒜
A✝ B✝ C✝ A' B' C' : 𝒜
f✝ : A✝ ⟶ B✝
g✝ : B✝ ⟶ C✝
f' : A' ⟶ B'
g' : B' ⟶ C'
inst✝² : Preadditive 𝒜
inst✝¹ : HasKernels 𝒜
inst✝ : HasImages 𝒜
A B C : 𝒜
f : A ⟶ B
g : B ⟶ C
χ : C ⟶ B
φ : B ⟶ A
hfg : f ≫ g = 0
H : φ ≫ f + g ≫ χ = 𝟙 B
ψ : Subobject.underlying.obj (kernelSubobject g) ⟶ Subobject.underlying.obj (imageSubobject f) :=
  Subobject.arrow (kernelSubobject g) ≫ φ ≫ factorThruImageSubobject f
⊢ Subobject.arrow (kernelSubobject g) ≫ φ ≫ f =
    Subobject.arrow (kernelSubobject g) ≫ φ ≫ f + Subobject.arrow (kernelSubobject g) ≫ g ≫ χ