𝒜 : 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)
𝒜 : 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)
set ψ : (kernelSubobject g : 𝒜) ⟶ imageSubobject f :=
  Subobject.arrow _ ≫ φ ≫ factorThruImageSubobject f
𝒜 : 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)

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))
𝒜 : 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)
suffices : ψ ≫ imageToKernel f g hfg = 𝟙 _
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)
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))
rw [← cancel_mono (Subobject.arrow _)]
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)
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)
simp only [imageToKernel_arrow, imageSubobject_arrow_comp, Category.id_comp, Category.assoc]
no goals
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)
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 _
no goals
𝒜 : 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)
exact epi_of_epi_fac 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) ≫ φ ≫ f + Subobject.arrow (kernelSubobject g) ≫ g ≫ χ
𝒜 : 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
rw [← H, Preadditive.comp_add]
no goals
𝒜 : 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 ≫ χ
simp only [add_zero, zero_comp, kernelSubobject_arrow_comp_assoc]