Theorem: CategoryTheory.cokernelOpUnop_inv
File: Mathlib/CategoryTheory/Abelian/Opposite.lean

Proof steps:
state_before: C : Type u_1
inst✝¹ : Category.{?u.6986, u_1} C
inst✝ : Abelian C
X Y : C
f : X ⟶ Y
A B : Cᵒᵖ
g : A ⟶ B
⊢ (cokernel.π f.op).unop ≫ f = 0
state_after: C : Type u_1
inst✝¹ : Category.{?u.6986, u_1} C
inst✝ : Abelian C
X Y : C
f : X ⟶ Y
A B : Cᵒᵖ
g : A ⟶ B
⊢ (f.op ≫ cokernel.π f.op).unop = 0
tactic: rw [← f.unop_op, ← unop_comp, f.unop_op]
state_before: C : Type u_1
inst✝¹ : Category.{?u.6986, u_1} C
inst✝ : Abelian C
X Y : C
f : X ⟶ Y
A B : Cᵒᵖ
g : A ⟶ B
⊢ (f.op ≫ cokernel.π f.op).unop = 0
state_after: no goals
tactic: simp
state_before: C : Type u_1
inst✝¹ : Category.{?u.6986, u_1} C
inst✝ : Abelian C
X Y : C
f : X ⟶ Y
A B : Cᵒᵖ
g : A ⟶ B
⊢ f.op ≫ (kernel.ι f).op = 0
state_after: no goals
tactic: simp [← op_comp]
state_before: C : Type u_1
inst✝¹ : Category.{?u.6986, u_1} C
inst✝ : Abelian C
X Y : C
f : X ⟶ Y
A B : Cᵒᵖ
g : A ⟶ B
⊢ kernel.lift f (cokernel.π f.op).unop ⋯ ≫ (cokernel.desc f.op (kernel.ι f).op ⋯).unop =
    𝟙 (Opposite.unop (cokernel f.op))
state_after: C : Type u_1
inst✝¹ : Category.{?u.6986, u_1} C
inst✝ : Abelian C
X Y : C
f : X ⟶ Y
A B : Cᵒᵖ
g : A ⟶ B
⊢ (cokernel.desc f.op (kernel.ι f).op ⋯ ≫ (kernel.lift f (cokernel.π f.op).unop ⋯).op).unop = (𝟙 (cokernel f.op)).unop
tactic: rw [← unop_id, ← (kernel.lift f _ _).unop_op, ← unop_comp]
state_before: C : Type u_1
inst✝¹ : Category.{?u.6986, u_1} C
inst✝ : Abelian C
X Y : C
f : X ⟶ Y
A B : Cᵒᵖ
g : A ⟶ B
⊢ (cokernel.desc f.op (kernel.ι f).op ⋯ ≫ (kernel.lift f (cokernel.π f.op).unop ⋯).op).unop = (𝟙 (cokernel f.op)).unop
state_after: case e_f
C : Type u_1
inst✝¹ : Category.{?u.6986, u_1} C
inst✝ : Abelian C
X Y : C
f : X ⟶ Y
A B : Cᵒᵖ
g : A ⟶ B
⊢ cokernel.desc f.op (kernel.ι f).op ⋯ ≫ (kernel.lift f (cokernel.π f.op).unop ⋯).op = 𝟙 (cokernel f.op)
tactic: congr 1
state_before: case e_f
C : Type u_1
inst✝¹ : Category.{?u.6986, u_1} C
inst✝ : Abelian C
X Y : C
f : X ⟶ Y
A B : Cᵒᵖ
g : A ⟶ B
⊢ cokernel.desc f.op (kernel.ι f).op ⋯ ≫ (kernel.lift f (cokernel.π f.op).unop ⋯).op = 𝟙 (cokernel f.op)
state_after: case e_f.h
C : Type u_1
inst✝¹ : Category.{?u.6986, u_1} C
inst✝ : Abelian C
X Y : C
f : X ⟶ Y
A B : Cᵒᵖ
g : A ⟶ B
⊢ coequalizer.π f.op 0 ≫ cokernel.desc f.op (kernel.ι f).op ⋯ ≫ (kernel.lift f (cokernel.π f.op).unop ⋯).op =
    coequalizer.π f.op 0 ≫ 𝟙 (cokernel f.op)
tactic: ext
state_before: case e_f.h
C : Type u_1
inst✝¹ : Category.{?u.6986, u_1} C
inst✝ : Abelian C
X Y : C
f : X ⟶ Y
A B : Cᵒᵖ
g : A ⟶ B
⊢ coequalizer.π f.op 0 ≫ cokernel.desc f.op (kernel.ι f).op ⋯ ≫ (kernel.lift f (cokernel.π f.op).unop ⋯).op =
    coequalizer.π f.op 0 ≫ 𝟙 (cokernel f.op)
state_after: no goals
tactic: simp [← op_comp]
state_before: C : Type u_1
inst✝¹ : Category.{?u.6986, u_1} C
inst✝ : Abelian C
X Y : C
f : X ⟶ Y
A B : Cᵒᵖ
g : A ⟶ B
⊢ (cokernel.desc f.op (kernel.ι f).op ⋯).unop ≫ kernel.lift f (cokernel.π f.op).unop ⋯ = 𝟙 (kernel f)
state_after: case h
C : Type u_1
inst✝¹ : Category.{?u.6986, u_1} C
inst✝ : Abelian C
X Y : C
f : X ⟶ Y
A B : Cᵒᵖ
g : A ⟶ B
⊢ ((cokernel.desc f.op (kernel.ι f).op ⋯).unop ≫ kernel.lift f (cokernel.π f.op).unop ⋯) ≫ equalizer.ι f 0 =
    𝟙 (kernel f) ≫ equalizer.ι f 0
tactic: ext
state_before: case h
C : Type u_1
inst✝¹ : Category.{?u.6986, u_1} C
inst✝ : Abelian C
X Y : C
f : X ⟶ Y
A B : Cᵒᵖ
g : A ⟶ B
⊢ ((cokernel.desc f.op (kernel.ι f).op ⋯).unop ≫ kernel.lift f (cokernel.π f.op).unop ⋯) ≫ equalizer.ι f 0 =
    𝟙 (kernel f) ≫ equalizer.ι f 0
state_after: no goals
tactic: simp [← unop_comp]