Theorem: CategoryTheory.epi_iff_exact_zero_right
File: Mathlib/Algebra/Homology/Exact.lean

tactic: have e₁ := h.epi
state_before: V : Type u
inst✝⁴ : Category.{v, u} V
inst✝³ : HasImages V
A✝ B✝ C D : V
f✝ : A✝ ⟶ B✝
g : B✝ ⟶ C
h✝ : C ⟶ D
inst✝² : HasZeroObject V
inst✝¹ : Preadditive V
inst✝ : HasEqualizers V
A B : V
f : A ⟶ B
h : Exact f 0
⊢ Epi f
state_after: V : Type u
inst✝⁴ : Category.{v, u} V
inst✝³ : HasImages V
A✝ B✝ C D : V
f✝ : A✝ ⟶ B✝
g : B✝ ⟶ C
h✝ : C ⟶ D
inst✝² : HasZeroObject V
inst✝¹ : Preadditive V
inst✝ : HasEqualizers V
A B : V
f : A ⟶ B
h : Exact f 0
e₁ : Epi (imageToKernel f 0 ⋯)
⊢ Epi f

tactic: rw [imageToKernel_zero_right] at e₁
state_before: V : Type u
inst✝⁴ : Category.{v, u} V
inst✝³ : HasImages V
A✝ B✝ C D : V
f✝ : A✝ ⟶ B✝
g : B✝ ⟶ C
h✝ : C ⟶ D
inst✝² : HasZeroObject V
inst✝¹ : Preadditive V
inst✝ : HasEqualizers V
A B : V
f : A ⟶ B
h : Exact f 0
e₁ : Epi (imageToKernel f 0 ⋯)
⊢ Epi f
state_after: V : Type u
inst✝⁴ : Category.{v, u} V
inst✝³ : HasImages V
A✝ B✝ C D : V
f✝ : A✝ ⟶ B✝
g : B✝ ⟶ C
h✝ : C ⟶ D
inst✝² : HasZeroObject V
inst✝¹ : Preadditive V
inst✝ : HasEqualizers V
A B : V
f : A ⟶ B
h : Exact f 0
e₁ : Epi ((imageSubobject f).arrow ≫ inv (kernelSubobject 0).arrow)
⊢ Epi f

tactic: have e₂ : Epi (((imageSubobject f).arrow ≫ inv (kernelSubobject 0).arrow) ≫
      (kernelSubobject 0).arrow) := @epi_comp _ _ _ _ _ _ e₁ _ _
state_before: V : Type u
inst✝⁴ : Category.{v, u} V
inst✝³ : HasImages V
A✝ B✝ C D : V
f✝ : A✝ ⟶ B✝
g : B✝ ⟶ C
h✝ : C ⟶ D
inst✝² : HasZeroObject V
inst✝¹ : Preadditive V
inst✝ : HasEqualizers V
A B : V
f : A ⟶ B
h : Exact f 0
e₁ : Epi ((imageSubobject f).arrow ≫ inv (kernelSubobject 0).arrow)
⊢ Epi f
state_after: V : Type u
inst✝⁴ : Category.{v, u} V
inst✝³ : HasImages V
A✝ B✝ C D : V
f✝ : A✝ ⟶ B✝
g : B✝ ⟶ C
h✝ : C ⟶ D
inst✝² : HasZeroObject V
inst✝¹ : Preadditive V
inst✝ : HasEqualizers V
A B : V
f : A ⟶ B
h : Exact f 0
e₁ : Epi ((imageSubobject f).arrow ≫ inv (kernelSubobject 0).arrow)
e₂ : Epi (((imageSubobject f).arrow ≫ inv (kernelSubobject 0).arrow) ≫ (kernelSubobject 0).arrow)
⊢ Epi f

tactic: rw [Category.assoc, IsIso.inv_hom_id, Category.comp_id] at e₂
state_before: V : Type u
inst✝⁴ : Category.{v, u} V
inst✝³ : HasImages V
A✝ B✝ C D : V
f✝ : A✝ ⟶ B✝
g : B✝ ⟶ C
h✝ : C ⟶ D
inst✝² : HasZeroObject V
inst✝¹ : Preadditive V
inst✝ : HasEqualizers V
A B : V
f : A ⟶ B
h : Exact f 0
e₁ : Epi ((imageSubobject f).arrow ≫ inv (kernelSubobject 0).arrow)
e₂ : Epi (((imageSubobject f).arrow ≫ inv (kernelSubobject 0).arrow) ≫ (kernelSubobject 0).arrow)
⊢ Epi f
state_after: V : Type u
inst✝⁴ : Category.{v, u} V
inst✝³ : HasImages V
A✝ B✝ C D : V
f✝ : A✝ ⟶ B✝
g : B✝ ⟶ C
h✝ : C ⟶ D
inst✝² : HasZeroObject V
inst✝¹ : Preadditive V
inst✝ : HasEqualizers V
A B : V
f : A ⟶ B
h : Exact f 0
e₁ : Epi ((imageSubobject f).arrow ≫ inv (kernelSubobject 0).arrow)
e₂ : Epi (imageSubobject f).arrow
⊢ Epi f

tactic: rw [← imageSubobject_arrow] at e₂
state_before: V : Type u
inst✝⁴ : Category.{v, u} V
inst✝³ : HasImages V
A✝ B✝ C D : V
f✝ : A✝ ⟶ B✝
g : B✝ ⟶ C
h✝ : C ⟶ D
inst✝² : HasZeroObject V
inst✝¹ : Preadditive V
inst✝ : HasEqualizers V
A B : V
f : A ⟶ B
h : Exact f 0
e₁ : Epi ((imageSubobject f).arrow ≫ inv (kernelSubobject 0).arrow)
e₂ : Epi (imageSubobject f).arrow
⊢ Epi f
state_after: V : Type u
inst✝⁴ : Category.{v, u} V
inst✝³ : HasImages V
A✝ B✝ C D : V
f✝ : A✝ ⟶ B✝
g : B✝ ⟶ C
h✝ : C ⟶ D
inst✝² : HasZeroObject V
inst✝¹ : Preadditive V
inst✝ : HasEqualizers V
A B : V
f : A ⟶ B
h : Exact f 0
e₁ : Epi ((imageSubobject f).arrow ≫ inv (kernelSubobject 0).arrow)
e₂ : Epi ((imageSubobjectIso f).hom ≫ image.ι f)
⊢ Epi f

tactic: haveI : Epi (image.ι f) := epi_of_epi (imageSubobjectIso f).hom (image.ι f)
state_before: V : Type u
inst✝⁴ : Category.{v, u} V
inst✝³ : HasImages V
A✝ B✝ C D : V
f✝ : A✝ ⟶ B✝
g : B✝ ⟶ C
h✝ : C ⟶ D
inst✝² : HasZeroObject V
inst✝¹ : Preadditive V
inst✝ : HasEqualizers V
A B : V
f : A ⟶ B
h : Exact f 0
e₁ : Epi ((imageSubobject f).arrow ≫ inv (kernelSubobject 0).arrow)
e₂ : Epi ((imageSubobjectIso f).hom ≫ image.ι f)
⊢ Epi f
state_after: V : Type u
inst✝⁴ : Category.{v, u} V
inst✝³ : HasImages V
A✝ B✝ C D : V
f✝ : A✝ ⟶ B✝
g : B✝ ⟶ C
h✝ : C ⟶ D
inst✝² : HasZeroObject V
inst✝¹ : Preadditive V
inst✝ : HasEqualizers V
A B : V
f : A ⟶ B
h : Exact f 0
e₁ : Epi ((imageSubobject f).arrow ≫ inv (kernelSubobject 0).arrow)
e₂ : Epi ((imageSubobjectIso f).hom ≫ image.ι f)
this : Epi (image.ι f)
⊢ Epi f

tactic: apply epi_of_epi_image
state_before: V : Type u
inst✝⁴ : Category.{v, u} V
inst✝³ : HasImages V
A✝ B✝ C D : V
f✝ : A✝ ⟶ B✝
g : B✝ ⟶ C
h✝ : C ⟶ D
inst✝² : HasZeroObject V
inst✝¹ : Preadditive V
inst✝ : HasEqualizers V
A B : V
f : A ⟶ B
h : Exact f 0
e₁ : Epi ((imageSubobject f).arrow ≫ inv (kernelSubobject 0).arrow)
e₂ : Epi ((imageSubobjectIso f).hom ≫ image.ι f)
this : Epi (image.ι f)
⊢ Epi f
state_after: no goals