Theorem: CategoryTheory.Abelian.tfae_epi
File: Mathlib/CategoryTheory/Abelian/Exact.lean

tactic: tfae_have 3 → 2
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
⊢ [Epi f, cokernel.π f = 0, Exact f 0].TFAE
state_after: case tfae_3_to_2
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
⊢ Exact f 0 → cokernel.π f = 0

C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
⊢ [Epi f, cokernel.π f = 0, Exact f 0].TFAE

tactic: tfae_have 1 → 3
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
⊢ [Epi f, cokernel.π f = 0, Exact f 0].TFAE
state_after: case tfae_1_to_3
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
⊢ Epi f → Exact f 0

C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
tfae_1_to_3 : Epi f → Exact f 0
⊢ [Epi f, cokernel.π f = 0, Exact f 0].TFAE

tactic: tfae_have 2 → 1
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
tfae_1_to_3 : Epi f → Exact f 0
⊢ [Epi f, cokernel.π f = 0, Exact f 0].TFAE
state_after: case tfae_2_to_1
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
tfae_1_to_3 : Epi f → Exact f 0
⊢ cokernel.π f = 0 → Epi f

C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
tfae_1_to_3 : Epi f → Exact f 0
tfae_2_to_1 : cokernel.π f = 0 → Epi f
⊢ [Epi f, cokernel.π f = 0, Exact f 0].TFAE

tactic: tfae_finish
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
tfae_1_to_3 : Epi f → Exact f 0
tfae_2_to_1 : cokernel.π f = 0 → Epi f
⊢ [Epi f, cokernel.π f = 0, Exact f 0].TFAE
state_after: no goals

tactic: rw [exact_iff]
state_before: case tfae_3_to_2
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
⊢ Exact f 0 → cokernel.π f = 0
state_after: case tfae_3_to_2
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
⊢ f ≫ 0 = 0 ∧ kernel.ι 0 ≫ cokernel.π f = 0 → cokernel.π f = 0

tactic: rintro ⟨-, h⟩
state_before: case tfae_3_to_2
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
⊢ f ≫ 0 = 0 ∧ kernel.ι 0 ≫ cokernel.π f = 0 → cokernel.π f = 0
state_after: case tfae_3_to_2.intro
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
h : kernel.ι 0 ≫ cokernel.π f = 0
⊢ cokernel.π f = 0

tactic: exact zero_of_epi_comp _ h
state_before: case tfae_3_to_2.intro
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
h : kernel.ι 0 ≫ cokernel.π f = 0
⊢ cokernel.π f = 0
state_after: no goals

tactic: rw [exact_iff]
state_before: case tfae_1_to_3
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
⊢ Epi f → Exact f 0
state_after: case tfae_1_to_3
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
⊢ Epi f → f ≫ 0 = 0 ∧ kernel.ι 0 ≫ cokernel.π f = 0

tactic: intro
state_before: case tfae_1_to_3
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
⊢ Epi f → f ≫ 0 = 0 ∧ kernel.ι 0 ≫ cokernel.π f = 0
state_after: case tfae_1_to_3
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
a✝ : Epi f
⊢ f ≫ 0 = 0 ∧ kernel.ι 0 ≫ cokernel.π f = 0

tactic: exact ⟨by simp, by simp [cokernel.π_of_epi]⟩
state_before: case tfae_1_to_3
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
a✝ : Epi f
⊢ f ≫ 0 = 0 ∧ kernel.ι 0 ≫ cokernel.π f = 0
state_after: no goals

tactic: simp
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
a✝ : Epi f
⊢ f ≫ 0 = 0
state_after: no goals

tactic: simp [cokernel.π_of_epi]
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
a✝ : Epi f
⊢ kernel.ι 0 ≫ cokernel.π f = 0
state_after: no goals

tactic: exact epi_of_cokernel_π_eq_zero _
state_before: case tfae_2_to_1
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
inst✝ : Abelian C
X Y Z : C
f : X ⟶ Y
g : Y ⟶ Z
tfae_3_to_2 : Exact f 0 → cokernel.π f = 0
tfae_1_to_3 : Epi f → Exact f 0
⊢ cokernel.π f = 0 → Epi f
state_after: no goals