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

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