[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
⊢ kernel.ι (prod.lift f g) ≫ f = kernel.ι (prod.lift f g) ≫ prod.lift f g ≫ prod.fst
[PROOFSTEP]
rw [prod.lift_fst]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
⊢ kernel.ι (prod.lift f g) ≫ prod.lift f g ≫ prod.fst = 0 ≫ prod.fst
[PROOFSTEP]
rw [kernel.condition_assoc]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
⊢ kernel.ι (prod.lift f g) ≫ g = kernel.ι (prod.lift f g) ≫ prod.lift f g ≫ prod.snd
[PROOFSTEP]
rw [prod.lift_snd]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
⊢ kernel.ι (prod.lift f g) ≫ prod.lift f g ≫ prod.snd = 0 ≫ prod.snd
[PROOFSTEP]
rw [kernel.condition_assoc]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ Fork.ι (KernelFork.ofι b hbg) = kernel.ι (prod.lift f g)
⊢ a' ≫ a = b' ≫ b
[PROOFSTEP]
simp at ha' hb' 
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ a = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ b = kernel.ι (prod.lift f g)
⊢ a' ≫ a = b' ≫ b
[PROOFSTEP]
rw [ha', hb']
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ Fork.ι (KernelFork.ofι b hbg) = kernel.ι (prod.lift f g)
s : PullbackCone a b
⊢ ((PullbackCone.snd s ≫ b) ≫ prod.lift f g) ≫ prod.fst = PullbackCone.snd s ≫ b ≫ f
[PROOFSTEP]
simp only [prod.lift_fst, Category.assoc]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ Fork.ι (KernelFork.ofι b hbg) = kernel.ι (prod.lift f g)
s : PullbackCone a b
⊢ PullbackCone.snd s ≫ b ≫ f = PullbackCone.fst s ≫ a ≫ f
[PROOFSTEP]
rw [PullbackCone.condition_assoc]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ Fork.ι (KernelFork.ofι b hbg) = kernel.ι (prod.lift f g)
s : PullbackCone a b
⊢ PullbackCone.fst s ≫ a ≫ f = PullbackCone.fst s ≫ 0
[PROOFSTEP]
rw [haf]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ Fork.ι (KernelFork.ofι b hbg) = kernel.ι (prod.lift f g)
s : PullbackCone a b
⊢ PullbackCone.fst s ≫ 0 = 0 ≫ prod.fst
[PROOFSTEP]
rw [comp_zero, zero_comp]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ Fork.ι (KernelFork.ofι b hbg) = kernel.ι (prod.lift f g)
s : PullbackCone a b
⊢ ((PullbackCone.snd s ≫ b) ≫ prod.lift f g) ≫ prod.snd = PullbackCone.snd s ≫ b ≫ g
[PROOFSTEP]
simp only [prod.lift_snd, Category.assoc]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ Fork.ι (KernelFork.ofι b hbg) = kernel.ι (prod.lift f g)
s : PullbackCone a b
⊢ PullbackCone.snd s ≫ b ≫ g = PullbackCone.snd s ≫ 0
[PROOFSTEP]
rw [hbg]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ Fork.ι (KernelFork.ofι b hbg) = kernel.ι (prod.lift f g)
s : PullbackCone a b
⊢ PullbackCone.snd s ≫ 0 = 0 ≫ prod.snd
[PROOFSTEP]
rw [comp_zero, zero_comp]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ Fork.ι (KernelFork.ofι b hbg) = kernel.ι (prod.lift f g)
s : PullbackCone a b
⊢ ((fun s => kernel.lift (prod.lift f g) (PullbackCone.snd s ≫ b) (_ : (PullbackCone.snd s ≫ b) ≫ prod.lift f g = 0))
          s ≫
        a') ≫
      a =
    PullbackCone.fst s ≫ a
[PROOFSTEP]
rw [KernelFork.ι_ofι] at ha' 
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ a = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ Fork.ι (KernelFork.ofι b hbg) = kernel.ι (prod.lift f g)
s : PullbackCone a b
⊢ ((fun s => kernel.lift (prod.lift f g) (PullbackCone.snd s ≫ b) (_ : (PullbackCone.snd s ≫ b) ≫ prod.lift f g = 0))
          s ≫
        a') ≫
      a =
    PullbackCone.fst s ≫ a
[PROOFSTEP]
simp [ha', PullbackCone.condition s]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ Fork.ι (KernelFork.ofι b hbg) = kernel.ι (prod.lift f g)
s : PullbackCone a b
⊢ ((fun s => kernel.lift (prod.lift f g) (PullbackCone.snd s ≫ b) (_ : (PullbackCone.snd s ≫ b) ≫ prod.lift f g = 0))
          s ≫
        b') ≫
      b =
    PullbackCone.snd s ≫ b
[PROOFSTEP]
rw [KernelFork.ι_ofι] at hb' 
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ b = kernel.ι (prod.lift f g)
s : PullbackCone a b
⊢ ((fun s => kernel.lift (prod.lift f g) (PullbackCone.snd s ≫ b) (_ : (PullbackCone.snd s ≫ b) ≫ prod.lift f g = 0))
          s ≫
        b') ≫
      b =
    PullbackCone.snd s ≫ b
[PROOFSTEP]
simp [hb']
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ Fork.ι (KernelFork.ofι b hbg) = kernel.ι (prod.lift f g)
s : PullbackCone a b
m : s.pt ⟶ kernel (prod.lift f g)
h₁ : m ≫ a' = PullbackCone.fst s
x✝ : m ≫ b' = PullbackCone.snd s
⊢ m ≫ kernel.ι (prod.lift f g) = m ≫ a' ≫ a
[PROOFSTEP]
congr
[GOAL]
case e_a
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ Fork.ι (KernelFork.ofι b hbg) = kernel.ι (prod.lift f g)
s : PullbackCone a b
m : s.pt ⟶ kernel (prod.lift f g)
h₁ : m ≫ a' = PullbackCone.fst s
x✝ : m ≫ b' = PullbackCone.snd s
⊢ kernel.ι (prod.lift f g) = a' ≫ a
[PROOFSTEP]
exact ha'.symm
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ Fork.ι (KernelFork.ofι b hbg) = kernel.ι (prod.lift f g)
s : PullbackCone a b
m : s.pt ⟶ kernel (prod.lift f g)
h₁ : m ≫ a' = PullbackCone.fst s
x✝ : m ≫ b' = PullbackCone.snd s
⊢ m ≫ a' ≫ a = PullbackCone.fst s ≫ a
[PROOFSTEP]
rw [← Category.assoc, h₁]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.100, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteProducts C
inst✝³ : HasKernels C
inst✝² : NormalMonoCategory C
X Y Z : C
a : X ⟶ Z
b : Y ⟶ Z
inst✝¹ : Mono a
inst✝ : Mono b
P : C
f : Z ⟶ P
haf : a ≫ f = 0
i : IsLimit (KernelFork.ofι a haf)
Q : C
g : Z ⟶ Q
hbg : b ≫ g = 0
i' : IsLimit (KernelFork.ofι b hbg)
a' : kernel (prod.lift f g) ⟶ (KernelFork.ofι a haf).pt
ha' : a' ≫ Fork.ι (KernelFork.ofι a haf) = kernel.ι (prod.lift f g)
b' : kernel (prod.lift f g) ⟶ (KernelFork.ofι b hbg).pt
hb' : b' ≫ Fork.ι (KernelFork.ofι b hbg) = kernel.ι (prod.lift f g)
s : PullbackCone a b
m : s.pt ⟶ kernel (prod.lift f g)
h₁ : m ≫ a' = PullbackCone.fst s
x✝ : m ≫ b' = PullbackCone.snd s
⊢ PullbackCone.snd s ≫ b =
    kernel.lift (prod.lift f g) (PullbackCone.snd s ≫ b) (_ : (PullbackCone.snd s ≫ b) ≫ prod.lift f g = 0) ≫
      kernel.ι (prod.lift f g)
[PROOFSTEP]
rw [kernel.lift_ι]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.45510, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f g : X ⟶ Y
⊢ pullback.fst ≫ 𝟙 X = pullback.fst ≫ prod.lift (𝟙 X) f ≫ prod.fst
[PROOFSTEP]
rw [prod.lift_fst]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.45510, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f g : X ⟶ Y
⊢ pullback.fst ≫ prod.lift (𝟙 X) f ≫ prod.fst = pullback.snd ≫ prod.lift (𝟙 X) g ≫ prod.fst
[PROOFSTEP]
rw [pullback.condition_assoc]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.45510, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f g : X ⟶ Y
⊢ pullback.snd ≫ prod.lift (𝟙 X) g ≫ prod.fst = pullback.snd
[PROOFSTEP]
rw [prod.lift_fst, Category.comp_id]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.45510, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f g : X ⟶ Y
huv : pullback.fst = pullback.snd
⊢ pullback.fst ≫ f = pullback.fst ≫ prod.lift (𝟙 X) f ≫ prod.snd
[PROOFSTEP]
rw [prod.lift_snd]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.45510, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f g : X ⟶ Y
huv : pullback.fst = pullback.snd
⊢ pullback.fst ≫ prod.lift (𝟙 X) f ≫ prod.snd = pullback.snd ≫ prod.lift (𝟙 X) g ≫ prod.snd
[PROOFSTEP]
rw [pullback.condition_assoc]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.45510, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f g : X ⟶ Y
huv : pullback.fst = pullback.snd
⊢ pullback.snd ≫ prod.lift (𝟙 X) g ≫ prod.snd = pullback.snd ≫ g
[PROOFSTEP]
rw [prod.lift_snd]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.45510, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f g : X ⟶ Y
huv : pullback.fst = pullback.snd
hvu : pullback.fst ≫ f = pullback.snd ≫ g
⊢ pullback.fst ≫ f = pullback.fst ≫ g
[PROOFSTEP]
rw [hvu, ← huv]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.45510, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f g : X ⟶ Y
huv : pullback.fst = pullback.snd
hvu : pullback.fst ≫ f = pullback.snd ≫ g
huu : pullback.fst ≫ f = pullback.fst ≫ g
s : Fork f g
⊢ (Fork.ι s ≫ prod.lift (𝟙 X) f) ≫ prod.fst = (Fork.ι s ≫ prod.lift (𝟙 X) g) ≫ prod.fst
[PROOFSTEP]
simp only [prod.lift_fst, Category.assoc]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.45510, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f g : X ⟶ Y
huv : pullback.fst = pullback.snd
hvu : pullback.fst ≫ f = pullback.snd ≫ g
huu : pullback.fst ≫ f = pullback.fst ≫ g
s : Fork f g
⊢ (Fork.ι s ≫ prod.lift (𝟙 X) f) ≫ prod.snd = (Fork.ι s ≫ prod.lift (𝟙 X) g) ≫ prod.snd
[PROOFSTEP]
simp only [prod.comp_lift, Fork.condition s]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.45510, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f g : X ⟶ Y
huv : pullback.fst = pullback.snd
hvu : pullback.fst ≫ f = pullback.snd ≫ g
huu : pullback.fst ≫ f = pullback.fst ≫ g
s : Fork f g
⊢ (fun s => pullback.lift (Fork.ι s) (Fork.ι s) (_ : Fork.ι s ≫ prod.lift (𝟙 X) f = Fork.ι s ≫ prod.lift (𝟙 X) g)) s ≫
      Fork.ι (Fork.ofι pullback.fst huu) =
    Fork.ι s
[PROOFSTEP]
simp
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.45510, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f g : X ⟶ Y
huv : pullback.fst = pullback.snd
hvu : pullback.fst ≫ f = pullback.snd ≫ g
huu : pullback.fst ≫ f = pullback.fst ≫ g
s : Fork f g
m : s.pt ⟶ (Fork.ofι pullback.fst huu).pt
h : m ≫ Fork.ι (Fork.ofι pullback.fst huu) = Fork.ι s
⊢ m ≫ pullback.fst =
    (fun s => pullback.lift (Fork.ι s) (Fork.ι s) (_ : Fork.ι s ≫ prod.lift (𝟙 X) f = Fork.ι s ≫ prod.lift (𝟙 X) g)) s ≫
      pullback.fst
[PROOFSTEP]
simpa only [pullback.lift_fst] using h
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.45510, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f g : X ⟶ Y
huv : pullback.fst = pullback.snd
hvu : pullback.fst ≫ f = pullback.snd ≫ g
huu : pullback.fst ≫ f = pullback.fst ≫ g
s : Fork f g
m : s.pt ⟶ (Fork.ofι pullback.fst huu).pt
h : m ≫ Fork.ι (Fork.ofι pullback.fst huu) = Fork.ι s
⊢ m ≫ pullback.snd =
    (fun s => pullback.lift (Fork.ι s) (Fork.ι s) (_ : Fork.ι s ≫ prod.lift (𝟙 X) f = Fork.ι s ≫ prod.lift (𝟙 X) g)) s ≫
      pullback.snd
[PROOFSTEP]
simpa only [huv.symm, pullback.lift_fst] using h
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.76598, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f : X ⟶ Y
Z : C
⊢ f ≫ 0 = 0
[PROOFSTEP]
simp
[GOAL]
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsColimit (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0))
Z✝ : C
u v : Y ⟶ Z✝
huv : f ≫ u = f ≫ v
⊢ u = v
[PROOFSTEP]
obtain ⟨W, w, hw, hl⟩ := normalMonoOfMono (equalizer.ι u v)
[GOAL]
case mk
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsColimit (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0))
Z✝ : C
u v : Y ⟶ Z✝
huv : f ≫ u = f ≫ v
W : C
w : Y ⟶ W
hw : equalizer.ι u v ≫ w = 0
hl : IsLimit (KernelFork.ofι (equalizer.ι u v) hw)
⊢ u = v
[PROOFSTEP]
obtain ⟨m, hm⟩ := equalizer.lift' f huv
[GOAL]
case mk.mk
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsColimit (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0))
Z✝ : C
u v : Y ⟶ Z✝
huv : f ≫ u = f ≫ v
W : C
w : Y ⟶ W
hw : equalizer.ι u v ≫ w = 0
hl : IsLimit (KernelFork.ofι (equalizer.ι u v) hw)
m : X ⟶ equalizer u v
hm : m ≫ equalizer.ι u v = f
⊢ u = v
[PROOFSTEP]
have hwf : f ≫ w = 0 := by rw [← hm, Category.assoc, hw, comp_zero]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsColimit (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0))
Z✝ : C
u v : Y ⟶ Z✝
huv : f ≫ u = f ≫ v
W : C
w : Y ⟶ W
hw : equalizer.ι u v ≫ w = 0
hl : IsLimit (KernelFork.ofι (equalizer.ι u v) hw)
m : X ⟶ equalizer u v
hm : m ≫ equalizer.ι u v = f
⊢ f ≫ w = 0
[PROOFSTEP]
rw [← hm, Category.assoc, hw, comp_zero]
[GOAL]
case mk.mk
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsColimit (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0))
Z✝ : C
u v : Y ⟶ Z✝
huv : f ≫ u = f ≫ v
W : C
w : Y ⟶ W
hw : equalizer.ι u v ≫ w = 0
hl : IsLimit (KernelFork.ofι (equalizer.ι u v) hw)
m : X ⟶ equalizer u v
hm : m ≫ equalizer.ι u v = f
hwf : f ≫ w = 0
⊢ u = v
[PROOFSTEP]
obtain ⟨n, hn⟩ := CokernelCofork.IsColimit.desc' l _ hwf
[GOAL]
case mk.mk.mk
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsColimit (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0))
Z✝ : C
u v : Y ⟶ Z✝
huv : f ≫ u = f ≫ v
W : C
w : Y ⟶ W
hw : equalizer.ι u v ≫ w = 0
hl : IsLimit (KernelFork.ofι (equalizer.ι u v) hw)
m : X ⟶ equalizer u v
hm : m ≫ equalizer.ι u v = f
hwf : f ≫ w = 0
n : (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0)).pt ⟶ W
hn : Cofork.π (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0)) ≫ n = w
⊢ u = v
[PROOFSTEP]
rw [Cofork.π_ofπ, zero_comp] at hn 
[GOAL]
case mk.mk.mk
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsColimit (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0))
Z✝ : C
u v : Y ⟶ Z✝
huv : f ≫ u = f ≫ v
W : C
w : Y ⟶ W
hw : equalizer.ι u v ≫ w = 0
hl : IsLimit (KernelFork.ofι (equalizer.ι u v) hw)
m : X ⟶ equalizer u v
hm : m ≫ equalizer.ι u v = f
hwf : f ≫ w = 0
n : (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0)).pt ⟶ W
hn : 0 = w
⊢ u = v
[PROOFSTEP]
have : IsIso (equalizer.ι u v) := by apply isIso_limit_cone_parallelPair_of_eq hn.symm hl
[GOAL]
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsColimit (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0))
Z✝ : C
u v : Y ⟶ Z✝
huv : f ≫ u = f ≫ v
W : C
w : Y ⟶ W
hw : equalizer.ι u v ≫ w = 0
hl : IsLimit (KernelFork.ofι (equalizer.ι u v) hw)
m : X ⟶ equalizer u v
hm : m ≫ equalizer.ι u v = f
hwf : f ≫ w = 0
n : (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0)).pt ⟶ W
hn : 0 = w
⊢ IsIso (equalizer.ι u v)
[PROOFSTEP]
apply isIso_limit_cone_parallelPair_of_eq hn.symm hl
[GOAL]
case mk.mk.mk
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsColimit (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0))
Z✝ : C
u v : Y ⟶ Z✝
huv : f ≫ u = f ≫ v
W : C
w : Y ⟶ W
hw : equalizer.ι u v ≫ w = 0
hl : IsLimit (KernelFork.ofι (equalizer.ι u v) hw)
m : X ⟶ equalizer u v
hm : m ≫ equalizer.ι u v = f
hwf : f ≫ w = 0
n : (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0)).pt ⟶ W
hn : 0 = w
this : IsIso (equalizer.ι u v)
⊢ u = v
[PROOFSTEP]
apply (cancel_epi (equalizer.ι u v)).1
[GOAL]
case mk.mk.mk
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteProducts C
inst✝¹ : HasKernels C
inst✝ : NormalMonoCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsColimit (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0))
Z✝ : C
u v : Y ⟶ Z✝
huv : f ≫ u = f ≫ v
W : C
w : Y ⟶ W
hw : equalizer.ι u v ≫ w = 0
hl : IsLimit (KernelFork.ofι (equalizer.ι u v) hw)
m : X ⟶ equalizer u v
hm : m ≫ equalizer.ι u v = f
hwf : f ≫ w = 0
n : (CokernelCofork.ofπ 0 (_ : f ≫ 0 = 0)).pt ⟶ W
hn : 0 = w
this : IsIso (equalizer.ι u v)
⊢ equalizer.ι u v ≫ u = equalizer.ι u v ≫ v
[PROOFSTEP]
exact equalizer.condition _ _
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
⊢ f ≫ cokernel.π (coprod.desc f g) = coprod.inl ≫ coprod.desc f g ≫ cokernel.π (coprod.desc f g)
[PROOFSTEP]
rw [coprod.inl_desc_assoc]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
⊢ coprod.inl ≫ coprod.desc f g ≫ cokernel.π (coprod.desc f g) = coprod.inl ≫ 0
[PROOFSTEP]
rw [cokernel.condition]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
⊢ g ≫ cokernel.π (coprod.desc f g) = coprod.inr ≫ coprod.desc f g ≫ cokernel.π (coprod.desc f g)
[PROOFSTEP]
rw [coprod.inr_desc_assoc]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
⊢ coprod.inr ≫ coprod.desc f g ≫ cokernel.π (coprod.desc f g) = coprod.inr ≫ 0
[PROOFSTEP]
rw [cokernel.condition]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
⊢ a ≫ a' = b ≫ b'
[PROOFSTEP]
simp only [Cofork.π_ofπ] at ha' hb' 
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : a ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : b ≫ b' = cokernel.π (coprod.desc f g)
⊢ a ≫ a' = b ≫ b'
[PROOFSTEP]
rw [ha', hb']
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
⊢ coprod.inl ≫ coprod.desc f g ≫ b ≫ PushoutCocone.inr s = f ≫ b ≫ PushoutCocone.inr s
[PROOFSTEP]
rw [coprod.inl_desc_assoc]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
⊢ f ≫ b ≫ PushoutCocone.inr s = f ≫ a ≫ PushoutCocone.inl s
[PROOFSTEP]
rw [PushoutCocone.condition]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
⊢ f ≫ a ≫ PushoutCocone.inl s = 0 ≫ PushoutCocone.inl s
[PROOFSTEP]
rw [← Category.assoc, eq_whisker hfa]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
⊢ 0 ≫ PushoutCocone.inl s = coprod.inl ≫ 0
[PROOFSTEP]
rw [comp_zero, zero_comp]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
⊢ coprod.inr ≫ coprod.desc f g ≫ b ≫ PushoutCocone.inr s = g ≫ b ≫ PushoutCocone.inr s
[PROOFSTEP]
rw [coprod.inr_desc_assoc]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
⊢ g ≫ b ≫ PushoutCocone.inr s = 0 ≫ PushoutCocone.inr s
[PROOFSTEP]
rw [← Category.assoc, eq_whisker hgb]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
⊢ 0 ≫ PushoutCocone.inr s = coprod.inr ≫ 0
[PROOFSTEP]
rw [comp_zero, zero_comp]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
⊢ a ≫
      a' ≫
        (fun s =>
            cokernel.desc (coprod.desc f g) (b ≫ PushoutCocone.inr s)
              (_ : coprod.desc f g ≫ b ≫ PushoutCocone.inr s = 0))
          s =
    a ≫ PushoutCocone.inl s
[PROOFSTEP]
rw [CokernelCofork.π_ofπ] at ha' 
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : a ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
⊢ a ≫
      a' ≫
        (fun s =>
            cokernel.desc (coprod.desc f g) (b ≫ PushoutCocone.inr s)
              (_ : coprod.desc f g ≫ b ≫ PushoutCocone.inr s = 0))
          s =
    a ≫ PushoutCocone.inl s
[PROOFSTEP]
have reassoced {W : C} (h : cokernel (coprod.desc f g) ⟶ W) : a ≫ a' ≫ h = cokernel.π (coprod.desc f g) ≫ h := by
  rw [← Category.assoc, eq_whisker ha']
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : a ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
W : C
h : cokernel (coprod.desc f g) ⟶ W
⊢ a ≫ a' ≫ h = cokernel.π (coprod.desc f g) ≫ h
[PROOFSTEP]
rw [← Category.assoc, eq_whisker ha']
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : a ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
reassoced : ∀ {W : C} (h : cokernel (coprod.desc f g) ⟶ W), a ≫ a' ≫ h = cokernel.π (coprod.desc f g) ≫ h
⊢ a ≫
      a' ≫
        (fun s =>
            cokernel.desc (coprod.desc f g) (b ≫ PushoutCocone.inr s)
              (_ : coprod.desc f g ≫ b ≫ PushoutCocone.inr s = 0))
          s =
    a ≫ PushoutCocone.inl s
[PROOFSTEP]
simp [reassoced, PushoutCocone.condition s]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
⊢ b ≫
      b' ≫
        (fun s =>
            cokernel.desc (coprod.desc f g) (b ≫ PushoutCocone.inr s)
              (_ : coprod.desc f g ≫ b ≫ PushoutCocone.inr s = 0))
          s =
    b ≫ PushoutCocone.inr s
[PROOFSTEP]
rw [CokernelCofork.π_ofπ] at hb' 
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : b ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
⊢ b ≫
      b' ≫
        (fun s =>
            cokernel.desc (coprod.desc f g) (b ≫ PushoutCocone.inr s)
              (_ : coprod.desc f g ≫ b ≫ PushoutCocone.inr s = 0))
          s =
    b ≫ PushoutCocone.inr s
[PROOFSTEP]
have reassoced' {W : C} (h : cokernel (coprod.desc f g) ⟶ W) : b ≫ b' ≫ h = cokernel.π (coprod.desc f g) ≫ h := by
  rw [← Category.assoc, eq_whisker hb']
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : b ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
W : C
h : cokernel (coprod.desc f g) ⟶ W
⊢ b ≫ b' ≫ h = cokernel.π (coprod.desc f g) ≫ h
[PROOFSTEP]
rw [← Category.assoc, eq_whisker hb']
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : b ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
reassoced' : ∀ {W : C} (h : cokernel (coprod.desc f g) ⟶ W), b ≫ b' ≫ h = cokernel.π (coprod.desc f g) ≫ h
⊢ b ≫
      b' ≫
        (fun s =>
            cokernel.desc (coprod.desc f g) (b ≫ PushoutCocone.inr s)
              (_ : coprod.desc f g ≫ b ≫ PushoutCocone.inr s = 0))
          s =
    b ≫ PushoutCocone.inr s
[PROOFSTEP]
simp [reassoced']
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
m : cokernel (coprod.desc f g) ⟶ s.pt
h₁ : a' ≫ m = PushoutCocone.inl s
x✝ : b' ≫ m = PushoutCocone.inr s
⊢ cokernel.π (coprod.desc f g) ≫ m = (a ≫ a') ≫ m
[PROOFSTEP]
congr
[GOAL]
case e_a
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
m : cokernel (coprod.desc f g) ⟶ s.pt
h₁ : a' ≫ m = PushoutCocone.inl s
x✝ : b' ≫ m = PushoutCocone.inr s
⊢ cokernel.π (coprod.desc f g) = a ≫ a'
[PROOFSTEP]
exact ha'.symm
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
m : cokernel (coprod.desc f g) ⟶ s.pt
h₁ : a' ≫ m = PushoutCocone.inl s
x✝ : b' ≫ m = PushoutCocone.inr s
⊢ (a ≫ a') ≫ m = a ≫ PushoutCocone.inl s
[PROOFSTEP]
rw [Category.assoc, h₁]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.80661, u_1} C
inst✝⁵ : HasZeroMorphisms C
inst✝⁴ : HasFiniteCoproducts C
inst✝³ : HasCokernels C
inst✝² : NormalEpiCategory C
X Y Z : C
a : X ⟶ Y
b : X ⟶ Z
inst✝¹ : Epi a
inst✝ : Epi b
P : C
f : P ⟶ X
hfa : f ≫ a = 0
i : IsColimit (CokernelCofork.ofπ a hfa)
Q : C
g : Q ⟶ X
hgb : g ≫ b = 0
i' : IsColimit (CokernelCofork.ofπ b hgb)
a' : (CokernelCofork.ofπ a hfa).pt ⟶ cokernel (coprod.desc f g)
ha' : Cofork.π (CokernelCofork.ofπ a hfa) ≫ a' = cokernel.π (coprod.desc f g)
b' : (CokernelCofork.ofπ b hgb).pt ⟶ cokernel (coprod.desc f g)
hb' : Cofork.π (CokernelCofork.ofπ b hgb) ≫ b' = cokernel.π (coprod.desc f g)
s : PushoutCocone a b
m : cokernel (coprod.desc f g) ⟶ s.pt
h₁ : a' ≫ m = PushoutCocone.inl s
x✝ : b' ≫ m = PushoutCocone.inr s
⊢ b ≫ PushoutCocone.inr s =
    cokernel.π (coprod.desc f g) ≫
      cokernel.desc (coprod.desc f g) (b ≫ PushoutCocone.inr s) (_ : coprod.desc f g ≫ b ≫ PushoutCocone.inr s = 0)
[PROOFSTEP]
rw [cokernel.π_desc]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.141722, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f g : X ⟶ Y
⊢ 𝟙 Y ≫ pushout.inl = (coprod.inl ≫ coprod.desc (𝟙 Y) f) ≫ pushout.inl
[PROOFSTEP]
rw [coprod.inl_desc]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.141722, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f g : X ⟶ Y
⊢ (coprod.inl ≫ coprod.desc (𝟙 Y) f) ≫ pushout.inl = (coprod.inl ≫ coprod.desc (𝟙 Y) g) ≫ pushout.inr
[PROOFSTEP]
simp only [Category.assoc, pushout.condition]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.141722, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f g : X ⟶ Y
⊢ (coprod.inl ≫ coprod.desc (𝟙 Y) g) ≫ pushout.inr = pushout.inr
[PROOFSTEP]
rw [coprod.inl_desc, Category.id_comp]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.141722, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f g : X ⟶ Y
huv : pushout.inl = pushout.inr
⊢ f ≫ pushout.inl = (coprod.inr ≫ coprod.desc (𝟙 Y) f) ≫ pushout.inl
[PROOFSTEP]
rw [coprod.inr_desc]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.141722, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f g : X ⟶ Y
huv : pushout.inl = pushout.inr
⊢ (coprod.inr ≫ coprod.desc (𝟙 Y) f) ≫ pushout.inl = (coprod.inr ≫ coprod.desc (𝟙 Y) g) ≫ pushout.inr
[PROOFSTEP]
simp only [Category.assoc, pushout.condition]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.141722, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f g : X ⟶ Y
huv : pushout.inl = pushout.inr
⊢ (coprod.inr ≫ coprod.desc (𝟙 Y) g) ≫ pushout.inr = g ≫ pushout.inr
[PROOFSTEP]
rw [coprod.inr_desc]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.141722, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f g : X ⟶ Y
huv : pushout.inl = pushout.inr
hvu : f ≫ pushout.inl = g ≫ pushout.inr
⊢ f ≫ pushout.inl = g ≫ pushout.inl
[PROOFSTEP]
rw [hvu, huv]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.141722, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f g : X ⟶ Y
huv : pushout.inl = pushout.inr
hvu : f ≫ pushout.inl = g ≫ pushout.inr
huu : f ≫ pushout.inl = g ≫ pushout.inl
s : Cofork f g
⊢ coprod.inl ≫ coprod.desc (𝟙 Y) f ≫ Cofork.π s = coprod.inl ≫ coprod.desc (𝟙 Y) g ≫ Cofork.π s
[PROOFSTEP]
simp only [coprod.inl_desc_assoc]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.141722, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f g : X ⟶ Y
huv : pushout.inl = pushout.inr
hvu : f ≫ pushout.inl = g ≫ pushout.inr
huu : f ≫ pushout.inl = g ≫ pushout.inl
s : Cofork f g
⊢ coprod.inr ≫ coprod.desc (𝟙 Y) f ≫ Cofork.π s = coprod.inr ≫ coprod.desc (𝟙 Y) g ≫ Cofork.π s
[PROOFSTEP]
simp only [coprod.desc_comp, Cofork.condition s]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.141722, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f g : X ⟶ Y
huv : pushout.inl = pushout.inr
hvu : f ≫ pushout.inl = g ≫ pushout.inr
huu : f ≫ pushout.inl = g ≫ pushout.inl
s : Cofork f g
⊢ Cofork.π (Cofork.ofπ pushout.inl huu) ≫
      (fun s =>
          pushout.desc (Cofork.π s) (Cofork.π s)
            (_ : coprod.desc (𝟙 Y) f ≫ Cofork.π s = coprod.desc (𝟙 Y) g ≫ Cofork.π s))
        s =
    Cofork.π s
[PROOFSTEP]
simp only [pushout.inl_desc, Cofork.π_ofπ]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.141722, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f g : X ⟶ Y
huv : pushout.inl = pushout.inr
hvu : f ≫ pushout.inl = g ≫ pushout.inr
huu : f ≫ pushout.inl = g ≫ pushout.inl
s : Cofork f g
m : (Cofork.ofπ pushout.inl huu).pt ⟶ s.pt
h : Cofork.π (Cofork.ofπ pushout.inl huu) ≫ m = Cofork.π s
⊢ pushout.inl ≫ m =
    pushout.inl ≫
      (fun s =>
          pushout.desc (Cofork.π s) (Cofork.π s)
            (_ : coprod.desc (𝟙 Y) f ≫ Cofork.π s = coprod.desc (𝟙 Y) g ≫ Cofork.π s))
        s
[PROOFSTEP]
simpa only [pushout.inl_desc] using h
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.141722, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f g : X ⟶ Y
huv : pushout.inl = pushout.inr
hvu : f ≫ pushout.inl = g ≫ pushout.inr
huu : f ≫ pushout.inl = g ≫ pushout.inl
s : Cofork f g
m : (Cofork.ofπ pushout.inl huu).pt ⟶ s.pt
h : Cofork.π (Cofork.ofπ pushout.inl huu) ≫ m = Cofork.π s
⊢ pushout.inr ≫ m =
    pushout.inr ≫
      (fun s =>
          pushout.desc (Cofork.π s) (Cofork.π s)
            (_ : coprod.desc (𝟙 Y) f ≫ Cofork.π s = coprod.desc (𝟙 Y) g ≫ Cofork.π s))
        s
[PROOFSTEP]
simpa only [huv.symm, pushout.inl_desc] using h
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.173668, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f : X ⟶ Y
Z : C
⊢ 0 ≫ f = 0
[PROOFSTEP]
simp
[GOAL]
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsLimit (KernelFork.ofι 0 (_ : 0 ≫ f = 0))
Z✝ : C
u v : Z✝ ⟶ X
huv : u ≫ f = v ≫ f
⊢ u = v
[PROOFSTEP]
obtain ⟨W, w, hw, hl⟩ := normalEpiOfEpi (coequalizer.π u v)
[GOAL]
case mk
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsLimit (KernelFork.ofι 0 (_ : 0 ≫ f = 0))
Z✝ : C
u v : Z✝ ⟶ X
huv : u ≫ f = v ≫ f
W : C
w : W ⟶ X
hw : w ≫ coequalizer.π u v = 0
hl : IsColimit (CokernelCofork.ofπ (coequalizer.π u v) hw)
⊢ u = v
[PROOFSTEP]
obtain ⟨m, hm⟩ := coequalizer.desc' f huv
[GOAL]
case mk.mk
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsLimit (KernelFork.ofι 0 (_ : 0 ≫ f = 0))
Z✝ : C
u v : Z✝ ⟶ X
huv : u ≫ f = v ≫ f
W : C
w : W ⟶ X
hw : w ≫ coequalizer.π u v = 0
hl : IsColimit (CokernelCofork.ofπ (coequalizer.π u v) hw)
m : coequalizer u v ⟶ Y
hm : coequalizer.π u v ≫ m = f
⊢ u = v
[PROOFSTEP]
have reassoced {W : C} (h : coequalizer u v ⟶ W) : w ≫ coequalizer.π u v ≫ h = 0 ≫ h := by
  rw [← Category.assoc, eq_whisker hw]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsLimit (KernelFork.ofι 0 (_ : 0 ≫ f = 0))
Z✝ : C
u v : Z✝ ⟶ X
huv : u ≫ f = v ≫ f
W✝ : C
w : W✝ ⟶ X
hw : w ≫ coequalizer.π u v = 0
hl : IsColimit (CokernelCofork.ofπ (coequalizer.π u v) hw)
m : coequalizer u v ⟶ Y
hm : coequalizer.π u v ≫ m = f
W : C
h : coequalizer u v ⟶ W
⊢ w ≫ coequalizer.π u v ≫ h = 0 ≫ h
[PROOFSTEP]
rw [← Category.assoc, eq_whisker hw]
[GOAL]
case mk.mk
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsLimit (KernelFork.ofι 0 (_ : 0 ≫ f = 0))
Z✝ : C
u v : Z✝ ⟶ X
huv : u ≫ f = v ≫ f
W : C
w : W ⟶ X
hw : w ≫ coequalizer.π u v = 0
hl : IsColimit (CokernelCofork.ofπ (coequalizer.π u v) hw)
m : coequalizer u v ⟶ Y
hm : coequalizer.π u v ≫ m = f
reassoced : ∀ {W_1 : C} (h : coequalizer u v ⟶ W_1), w ≫ coequalizer.π u v ≫ h = 0 ≫ h
⊢ u = v
[PROOFSTEP]
have hwf : w ≫ f = 0 := by rw [← hm, reassoced, zero_comp]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsLimit (KernelFork.ofι 0 (_ : 0 ≫ f = 0))
Z✝ : C
u v : Z✝ ⟶ X
huv : u ≫ f = v ≫ f
W : C
w : W ⟶ X
hw : w ≫ coequalizer.π u v = 0
hl : IsColimit (CokernelCofork.ofπ (coequalizer.π u v) hw)
m : coequalizer u v ⟶ Y
hm : coequalizer.π u v ≫ m = f
reassoced : ∀ {W_1 : C} (h : coequalizer u v ⟶ W_1), w ≫ coequalizer.π u v ≫ h = 0 ≫ h
⊢ w ≫ f = 0
[PROOFSTEP]
rw [← hm, reassoced, zero_comp]
[GOAL]
case mk.mk
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsLimit (KernelFork.ofι 0 (_ : 0 ≫ f = 0))
Z✝ : C
u v : Z✝ ⟶ X
huv : u ≫ f = v ≫ f
W : C
w : W ⟶ X
hw : w ≫ coequalizer.π u v = 0
hl : IsColimit (CokernelCofork.ofπ (coequalizer.π u v) hw)
m : coequalizer u v ⟶ Y
hm : coequalizer.π u v ≫ m = f
reassoced : ∀ {W_1 : C} (h : coequalizer u v ⟶ W_1), w ≫ coequalizer.π u v ≫ h = 0 ≫ h
hwf : w ≫ f = 0
⊢ u = v
[PROOFSTEP]
obtain ⟨n, hn⟩ := KernelFork.IsLimit.lift' l _ hwf
[GOAL]
case mk.mk.mk
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsLimit (KernelFork.ofι 0 (_ : 0 ≫ f = 0))
Z✝ : C
u v : Z✝ ⟶ X
huv : u ≫ f = v ≫ f
W : C
w : W ⟶ X
hw : w ≫ coequalizer.π u v = 0
hl : IsColimit (CokernelCofork.ofπ (coequalizer.π u v) hw)
m : coequalizer u v ⟶ Y
hm : coequalizer.π u v ≫ m = f
reassoced : ∀ {W_1 : C} (h : coequalizer u v ⟶ W_1), w ≫ coequalizer.π u v ≫ h = 0 ≫ h
hwf : w ≫ f = 0
n : W ⟶ (KernelFork.ofι 0 (_ : 0 ≫ f = 0)).pt
hn : n ≫ Fork.ι (KernelFork.ofι 0 (_ : 0 ≫ f = 0)) = w
⊢ u = v
[PROOFSTEP]
rw [Fork.ι_ofι, HasZeroMorphisms.comp_zero] at hn 
[GOAL]
case mk.mk.mk
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsLimit (KernelFork.ofι 0 (_ : 0 ≫ f = 0))
Z✝ : C
u v : Z✝ ⟶ X
huv : u ≫ f = v ≫ f
W : C
w : W ⟶ X
hw : w ≫ coequalizer.π u v = 0
hl : IsColimit (CokernelCofork.ofπ (coequalizer.π u v) hw)
m : coequalizer u v ⟶ Y
hm : coequalizer.π u v ≫ m = f
reassoced : ∀ {W_1 : C} (h : coequalizer u v ⟶ W_1), w ≫ coequalizer.π u v ≫ h = 0 ≫ h
hwf : w ≫ f = 0
n : W ⟶ (KernelFork.ofι 0 (_ : 0 ≫ f = 0)).pt
hn : 0 = w
⊢ u = v
[PROOFSTEP]
have : IsIso (coequalizer.π u v) := by apply isIso_colimit_cocone_parallelPair_of_eq hn.symm hl
[GOAL]
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsLimit (KernelFork.ofι 0 (_ : 0 ≫ f = 0))
Z✝ : C
u v : Z✝ ⟶ X
huv : u ≫ f = v ≫ f
W : C
w : W ⟶ X
hw : w ≫ coequalizer.π u v = 0
hl : IsColimit (CokernelCofork.ofπ (coequalizer.π u v) hw)
m : coequalizer u v ⟶ Y
hm : coequalizer.π u v ≫ m = f
reassoced : ∀ {W_1 : C} (h : coequalizer u v ⟶ W_1), w ≫ coequalizer.π u v ≫ h = 0 ≫ h
hwf : w ≫ f = 0
n : W ⟶ (KernelFork.ofι 0 (_ : 0 ≫ f = 0)).pt
hn : 0 = w
⊢ IsIso (coequalizer.π u v)
[PROOFSTEP]
apply isIso_colimit_cocone_parallelPair_of_eq hn.symm hl
[GOAL]
case mk.mk.mk
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsLimit (KernelFork.ofι 0 (_ : 0 ≫ f = 0))
Z✝ : C
u v : Z✝ ⟶ X
huv : u ≫ f = v ≫ f
W : C
w : W ⟶ X
hw : w ≫ coequalizer.π u v = 0
hl : IsColimit (CokernelCofork.ofπ (coequalizer.π u v) hw)
m : coequalizer u v ⟶ Y
hm : coequalizer.π u v ≫ m = f
reassoced : ∀ {W_1 : C} (h : coequalizer u v ⟶ W_1), w ≫ coequalizer.π u v ≫ h = 0 ≫ h
hwf : w ≫ f = 0
n : W ⟶ (KernelFork.ofι 0 (_ : 0 ≫ f = 0)).pt
hn : 0 = w
this : IsIso (coequalizer.π u v)
⊢ u = v
[PROOFSTEP]
apply (cancel_mono (coequalizer.π u v)).1
[GOAL]
case mk.mk.mk
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
inst✝² : HasFiniteCoproducts C
inst✝¹ : HasCokernels C
inst✝ : NormalEpiCategory C
X Y : C
f : X ⟶ Y
Z : C
l : IsLimit (KernelFork.ofι 0 (_ : 0 ≫ f = 0))
Z✝ : C
u v : Z✝ ⟶ X
huv : u ≫ f = v ≫ f
W : C
w : W ⟶ X
hw : w ≫ coequalizer.π u v = 0
hl : IsColimit (CokernelCofork.ofπ (coequalizer.π u v) hw)
m : coequalizer u v ⟶ Y
hm : coequalizer.π u v ≫ m = f
reassoced : ∀ {W_1 : C} (h : coequalizer u v ⟶ W_1), w ≫ coequalizer.π u v ≫ h = 0 ≫ h
hwf : w ≫ f = 0
n : W ⟶ (KernelFork.ofι 0 (_ : 0 ≫ f = 0)).pt
hn : 0 = w
this : IsIso (coequalizer.π u v)
⊢ u ≫ coequalizer.π u v = v ≫ coequalizer.π u v
[PROOFSTEP]
exact coequalizer.condition _ _
