l3lab/ntp-mathlib huggingface dataset:
/-- The left homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def leftHomologyData [HasZeroObject C] (s : S.Splitting) :
    LeftHomologyData S := by
  have hi := KernelFork.IsLimit.ofι S.f S.zero
    (fun x _ => x ≫ s.r)
    (fun x hx => by simp only [assoc, s.r_f, comp_sub, comp_id,
      sub_eq_self, reassoc_of% hx, zero_comp])
    (fun x _ b hb => by simp only [← hb, assoc, f_r, comp_id])
  let f' := hi.lift (KernelFork.ofι S.f S.zero)
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.93193, u_1} C
inst✝³ : Category.{?u.93197, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hi : IsLimit (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
f' : (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt ⟶ (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt :=
  IsLimit.lift hi (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
⊢ LeftHomologyData S

Next tactic:
have hf' : f' = 𝟙 _ := by
    apply Fork.IsLimit.hom_ext hi
    dsimp
    erw [Fork.IsLimit.lift_ι hi]
    simp only [Fork.ι_ofι, id_comp]
/-- The left homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def leftHomologyData [HasZeroObject C] (s : S.Splitting) :
    LeftHomologyData S := by
  have hi := KernelFork.IsLimit.ofι S.f S.zero
    (fun x _ => x ≫ s.r)
    (fun x hx => by simp only [assoc, s.r_f, comp_sub, comp_id,
      sub_eq_self, reassoc_of% hx, zero_comp])
    (fun x _ b hb => by simp only [← hb, assoc, f_r, comp_id])
  let f' := hi.lift (KernelFork.ofι S.f S.zero)
  have hf' : f' = 𝟙 _ := by
    

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.93193, u_1} C
inst✝³ : Category.{?u.93197, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hi : IsLimit (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
f' : (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt ⟶ (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt :=
  IsLimit.lift hi (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
⊢ f' = 𝟙 (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt

Next tactic:
apply Fork.IsLimit.hom_ext hi
/-- The left homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def leftHomologyData [HasZeroObject C] (s : S.Splitting) :
    LeftHomologyData S := by
  have hi := KernelFork.IsLimit.ofι S.f S.zero
    (fun x _ => x ≫ s.r)
    (fun x hx => by simp only [assoc, s.r_f, comp_sub, comp_id,
      sub_eq_self, reassoc_of% hx, zero_comp])
    (fun x _ b hb => by simp only [← hb, assoc, f_r, comp_id])
  let f' := hi.lift (KernelFork.ofι S.f S.zero)
  have hf' : f' = 𝟙 _ := by
    apply Fork.IsLimit.hom_ext hi
    

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.93193, u_1} C
inst✝³ : Category.{?u.93197, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hi : IsLimit (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
f' : (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt ⟶ (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt :=
  IsLimit.lift hi (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
⊢ f' ≫ Fork.ι (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)) =
    𝟙 (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt ≫ Fork.ι (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))

Next tactic:
dsimp
/-- The left homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def leftHomologyData [HasZeroObject C] (s : S.Splitting) :
    LeftHomologyData S := by
  have hi := KernelFork.IsLimit.ofι S.f S.zero
    (fun x _ => x ≫ s.r)
    (fun x hx => by simp only [assoc, s.r_f, comp_sub, comp_id,
      sub_eq_self, reassoc_of% hx, zero_comp])
    (fun x _ b hb => by simp only [← hb, assoc, f_r, comp_id])
  let f' := hi.lift (KernelFork.ofι S.f S.zero)
  have hf' : f' = 𝟙 _ := by
    apply Fork.IsLimit.hom_ext hi
    dsimp
    

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.93193, u_1} C
inst✝³ : Category.{?u.93197, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hi : IsLimit (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
f' : (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt ⟶ (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt :=
  IsLimit.lift hi (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
⊢ IsLimit.lift hi (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)) ≫ S.f = 𝟙 S.X₁ ≫ S.f

Next tactic:
erw [Fork.IsLimit.lift_ι hi]
/-- The left homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def leftHomologyData [HasZeroObject C] (s : S.Splitting) :
    LeftHomologyData S := by
  have hi := KernelFork.IsLimit.ofι S.f S.zero
    (fun x _ => x ≫ s.r)
    (fun x hx => by simp only [assoc, s.r_f, comp_sub, comp_id,
      sub_eq_self, reassoc_of% hx, zero_comp])
    (fun x _ b hb => by simp only [← hb, assoc, f_r, comp_id])
  let f' := hi.lift (KernelFork.ofι S.f S.zero)
  have hf' : f' = 𝟙 _ := by
    apply Fork.IsLimit.hom_ext hi
    dsimp
    erw [Fork.IsLimit.lift_ι hi]
    

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.93193, u_1} C
inst✝³ : Category.{?u.93197, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hi : IsLimit (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
f' : (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt ⟶ (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt :=
  IsLimit.lift hi (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
⊢ Fork.ι (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)) = 𝟙 S.X₁ ≫ S.f

Next tactic:
simp only [Fork.ι_ofι, id_comp]
/-- The left homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def leftHomologyData [HasZeroObject C] (s : S.Splitting) :
    LeftHomologyData S := by
  have hi := KernelFork.IsLimit.ofι S.f S.zero
    (fun x _ => x ≫ s.r)
    (fun x hx => by simp only [assoc, s.r_f, comp_sub, comp_id,
      sub_eq_self, reassoc_of% hx, zero_comp])
    (fun x _ b hb => by simp only [← hb, assoc, f_r, comp_id])
  let f' := hi.lift (KernelFork.ofι S.f S.zero)
  have hf' : f' = 𝟙 _ := by
    apply Fork.IsLimit.hom_ext hi
    dsimp
    erw [Fork.IsLimit.lift_ι hi]
    simp only [Fork.ι_ofι, id_comp]
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.93193, u_1} C
inst✝³ : Category.{?u.93197, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hi : IsLimit (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
f' : (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt ⟶ (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt :=
  IsLimit.lift hi (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
hf' : f' = 𝟙 (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt
⊢ LeftHomologyData S

Next tactic:
have wπ : f' ≫ (0 : S.X₁ ⟶ 0) = 0 := comp_zero
/-- The left homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def leftHomologyData [HasZeroObject C] (s : S.Splitting) :
    LeftHomologyData S := by
  have hi := KernelFork.IsLimit.ofι S.f S.zero
    (fun x _ => x ≫ s.r)
    (fun x hx => by simp only [assoc, s.r_f, comp_sub, comp_id,
      sub_eq_self, reassoc_of% hx, zero_comp])
    (fun x _ b hb => by simp only [← hb, assoc, f_r, comp_id])
  let f' := hi.lift (KernelFork.ofι S.f S.zero)
  have hf' : f' = 𝟙 _ := by
    apply Fork.IsLimit.hom_ext hi
    dsimp
    erw [Fork.IsLimit.lift_ι hi]
    simp only [Fork.ι_ofι, id_comp]
  have wπ : f' ≫ (0 : S.X₁ ⟶ 0) = 0 := comp_zero
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.93193, u_1} C
inst✝³ : Category.{?u.93197, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hi : IsLimit (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
f' : (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt ⟶ (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt :=
  IsLimit.lift hi (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
hf' : f' = 𝟙 (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt
wπ : f' ≫ 0 = 0
⊢ LeftHomologyData S

Next tactic:
have hπ : IsColimit (CokernelCofork.ofπ 0 wπ) := CokernelCofork.IsColimit.ofEpiOfIsZero _
      (by rw [hf']; infer_instance) (isZero_zero _)
/-- The left homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def leftHomologyData [HasZeroObject C] (s : S.Splitting) :
    LeftHomologyData S := by
  have hi := KernelFork.IsLimit.ofι S.f S.zero
    (fun x _ => x ≫ s.r)
    (fun x hx => by simp only [assoc, s.r_f, comp_sub, comp_id,
      sub_eq_self, reassoc_of% hx, zero_comp])
    (fun x _ b hb => by simp only [← hb, assoc, f_r, comp_id])
  let f' := hi.lift (KernelFork.ofι S.f S.zero)
  have hf' : f' = 𝟙 _ := by
    apply Fork.IsLimit.hom_ext hi
    dsimp
    erw [Fork.IsLimit.lift_ι hi]
    simp only [Fork.ι_ofι, id_comp]
  have wπ : f' ≫ (0 : S.X₁ ⟶ 0) = 0 := comp_zero
  have hπ : IsColimit (CokernelCofork.ofπ 0 wπ) := CokernelCofork.IsColimit.ofEpiOfIsZero _
      (by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.93193, u_1} C
inst✝³ : Category.{?u.93197, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hi : IsLimit (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
f' : (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt ⟶ (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt :=
  IsLimit.lift hi (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
hf' : f' = 𝟙 (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt
wπ : f' ≫ 0 = 0
⊢ Epi f'

Next tactic:
rw [hf']
/-- The left homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def leftHomologyData [HasZeroObject C] (s : S.Splitting) :
    LeftHomologyData S := by
  have hi := KernelFork.IsLimit.ofι S.f S.zero
    (fun x _ => x ≫ s.r)
    (fun x hx => by simp only [assoc, s.r_f, comp_sub, comp_id,
      sub_eq_self, reassoc_of% hx, zero_comp])
    (fun x _ b hb => by simp only [← hb, assoc, f_r, comp_id])
  let f' := hi.lift (KernelFork.ofι S.f S.zero)
  have hf' : f' = 𝟙 _ := by
    apply Fork.IsLimit.hom_ext hi
    dsimp
    erw [Fork.IsLimit.lift_ι hi]
    simp only [Fork.ι_ofι, id_comp]
  have wπ : f' ≫ (0 : S.X₁ ⟶ 0) = 0 := comp_zero
  have hπ : IsColimit (CokernelCofork.ofπ 0 wπ) := CokernelCofork.IsColimit.ofEpiOfIsZero _
      (by rw [hf']; 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.93193, u_1} C
inst✝³ : Category.{?u.93197, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hi : IsLimit (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
f' : (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt ⟶ (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt :=
  IsLimit.lift hi (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
hf' : f' = 𝟙 (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt
wπ : f' ≫ 0 = 0
⊢ Epi (𝟙 (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt)

Next tactic:
infer_instance
/-- The left homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def leftHomologyData [HasZeroObject C] (s : S.Splitting) :
    LeftHomologyData S := by
  have hi := KernelFork.IsLimit.ofι S.f S.zero
    (fun x _ => x ≫ s.r)
    (fun x hx => by simp only [assoc, s.r_f, comp_sub, comp_id,
      sub_eq_self, reassoc_of% hx, zero_comp])
    (fun x _ b hb => by simp only [← hb, assoc, f_r, comp_id])
  let f' := hi.lift (KernelFork.ofι S.f S.zero)
  have hf' : f' = 𝟙 _ := by
    apply Fork.IsLimit.hom_ext hi
    dsimp
    erw [Fork.IsLimit.lift_ι hi]
    simp only [Fork.ι_ofι, id_comp]
  have wπ : f' ≫ (0 : S.X₁ ⟶ 0) = 0 := comp_zero
  have hπ : IsColimit (CokernelCofork.ofπ 0 wπ) := CokernelCofork.IsColimit.ofEpiOfIsZero _
      (by rw [hf']; infer_instance) (isZero_zero _)
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.93193, u_1} C
inst✝³ : Category.{?u.93197, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hi : IsLimit (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
f' : (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt ⟶ (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt :=
  IsLimit.lift hi (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0))
hf' : f' = 𝟙 (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)).pt
wπ : f' ≫ 0 = 0
hπ : IsColimit (CokernelCofork.ofπ 0 wπ)
⊢ LeftHomologyData S

Next tactic:
exact
    { K := S.X₁
      H := 0
      i := S.f
      wi := S.zero
      hi := hi
      π := 0
      wπ := wπ
      hπ := hπ }
/-- The right homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def rightHomologyData [HasZeroObject C] (s : S.Splitting) :
    RightHomologyData S := by
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.97382, u_1} C
inst✝³ : Category.{?u.97386, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
⊢ RightHomologyData S

Next tactic:
have hp := CokernelCofork.IsColimit.ofπ S.g S.zero
    (fun x _ => s.s ≫ x)
    (fun x hx => by simp only [s.g_s_assoc, sub_comp, id_comp, sub_eq_self, assoc, hx, comp_zero])
    (fun x _ b hb => by simp only [← hb, s.s_g_assoc])
/-- The right homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def rightHomologyData [HasZeroObject C] (s : S.Splitting) :
    RightHomologyData S := by
  have hp := CokernelCofork.IsColimit.ofπ S.g S.zero
    (fun x _ => s.s ≫ x)
    (fun x hx => by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.97382, u_1} C
inst✝³ : Category.{?u.97386, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
Z'✝ : C
x : S.X₂ ⟶ Z'✝
hx : S.f ≫ x = 0
⊢ S.g ≫ (fun {Z'} x x_1 => s.s ≫ x) x hx = x

Next tactic:
simp only [s.g_s_assoc, sub_comp, id_comp, sub_eq_self, assoc, hx, comp_zero]
/-- The right homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def rightHomologyData [HasZeroObject C] (s : S.Splitting) :
    RightHomologyData S := by
  have hp := CokernelCofork.IsColimit.ofπ S.g S.zero
    (fun x _ => s.s ≫ x)
    (fun x hx => by simp only [s.g_s_assoc, sub_comp, id_comp, sub_eq_self, assoc, hx, comp_zero])
    (fun x _ b hb => by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.97382, u_1} C
inst✝³ : Category.{?u.97386, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
Z'✝ : C
x : S.X₂ ⟶ Z'✝
x✝ : S.f ≫ x = 0
b : S.X₃ ⟶ Z'✝
hb : S.g ≫ b = x
⊢ b = (fun {Z'} x x_1 => s.s ≫ x) x x✝

Next tactic:
simp only [← hb, s.s_g_assoc]
/-- The right homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def rightHomologyData [HasZeroObject C] (s : S.Splitting) :
    RightHomologyData S := by
  have hp := CokernelCofork.IsColimit.ofπ S.g S.zero
    (fun x _ => s.s ≫ x)
    (fun x hx => by simp only [s.g_s_assoc, sub_comp, id_comp, sub_eq_self, assoc, hx, comp_zero])
    (fun x _ b hb => by simp only [← hb, s.s_g_assoc])
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.97382, u_1} C
inst✝³ : Category.{?u.97386, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hp : IsColimit (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0))
⊢ RightHomologyData S

Next tactic:
let g' := hp.desc (CokernelCofork.ofπ S.g S.zero)
/-- The right homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def rightHomologyData [HasZeroObject C] (s : S.Splitting) :
    RightHomologyData S := by
  have hp := CokernelCofork.IsColimit.ofπ S.g S.zero
    (fun x _ => s.s ≫ x)
    (fun x hx => by simp only [s.g_s_assoc, sub_comp, id_comp, sub_eq_self, assoc, hx, comp_zero])
    (fun x _ b hb => by simp only [← hb, s.s_g_assoc])
  let g' := hp.desc (CokernelCofork.ofπ S.g S.zero)
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.97382, u_1} C
inst✝³ : Category.{?u.97386, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hp : IsColimit (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0))
g' : (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt ⟶ (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt :=
  IsColimit.desc hp (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0))
⊢ RightHomologyData S

Next tactic:
have hg' : g' = 𝟙 _ := by
    apply Cofork.IsColimit.hom_ext hp
    dsimp
    erw [Cofork.IsColimit.π_desc hp]
    simp only [Cofork.π_ofπ, comp_id]
/-- The right homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def rightHomologyData [HasZeroObject C] (s : S.Splitting) :
    RightHomologyData S := by
  have hp := CokernelCofork.IsColimit.ofπ S.g S.zero
    (fun x _ => s.s ≫ x)
    (fun x hx => by simp only [s.g_s_assoc, sub_comp, id_comp, sub_eq_self, assoc, hx, comp_zero])
    (fun x _ b hb => by simp only [← hb, s.s_g_assoc])
  let g' := hp.desc (CokernelCofork.ofπ S.g S.zero)
  have hg' : g' = 𝟙 _ := by
    

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.97382, u_1} C
inst✝³ : Category.{?u.97386, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hp : IsColimit (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0))
g' : (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt ⟶ (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt :=
  IsColimit.desc hp (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0))
⊢ g' = 𝟙 (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt

Next tactic:
apply Cofork.IsColimit.hom_ext hp
/-- The right homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def rightHomologyData [HasZeroObject C] (s : S.Splitting) :
    RightHomologyData S := by
  have hp := CokernelCofork.IsColimit.ofπ S.g S.zero
    (fun x _ => s.s ≫ x)
    (fun x hx => by simp only [s.g_s_assoc, sub_comp, id_comp, sub_eq_self, assoc, hx, comp_zero])
    (fun x _ b hb => by simp only [← hb, s.s_g_assoc])
  let g' := hp.desc (CokernelCofork.ofπ S.g S.zero)
  have hg' : g' = 𝟙 _ := by
    apply Cofork.IsColimit.hom_ext hp
    

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.97382, u_1} C
inst✝³ : Category.{?u.97386, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hp : IsColimit (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0))
g' : (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt ⟶ (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt :=
  IsColimit.desc hp (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0))
⊢ Cofork.π (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)) ≫ g' =
    Cofork.π (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)) ≫ 𝟙 (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt

Next tactic:
dsimp
/-- The right homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def rightHomologyData [HasZeroObject C] (s : S.Splitting) :
    RightHomologyData S := by
  have hp := CokernelCofork.IsColimit.ofπ S.g S.zero
    (fun x _ => s.s ≫ x)
    (fun x hx => by simp only [s.g_s_assoc, sub_comp, id_comp, sub_eq_self, assoc, hx, comp_zero])
    (fun x _ b hb => by simp only [← hb, s.s_g_assoc])
  let g' := hp.desc (CokernelCofork.ofπ S.g S.zero)
  have hg' : g' = 𝟙 _ := by
    apply Cofork.IsColimit.hom_ext hp
    dsimp
    

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.97382, u_1} C
inst✝³ : Category.{?u.97386, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hp : IsColimit (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0))
g' : (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt ⟶ (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt :=
  IsColimit.desc hp (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0))
⊢ S.g ≫ IsColimit.desc hp (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)) = S.g ≫ 𝟙 S.X₃

Next tactic:
erw [Cofork.IsColimit.π_desc hp]
/-- The right homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def rightHomologyData [HasZeroObject C] (s : S.Splitting) :
    RightHomologyData S := by
  have hp := CokernelCofork.IsColimit.ofπ S.g S.zero
    (fun x _ => s.s ≫ x)
    (fun x hx => by simp only [s.g_s_assoc, sub_comp, id_comp, sub_eq_self, assoc, hx, comp_zero])
    (fun x _ b hb => by simp only [← hb, s.s_g_assoc])
  let g' := hp.desc (CokernelCofork.ofπ S.g S.zero)
  have hg' : g' = 𝟙 _ := by
    apply Cofork.IsColimit.hom_ext hp
    dsimp
    erw [Cofork.IsColimit.π_desc hp]
    

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.97382, u_1} C
inst✝³ : Category.{?u.97386, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hp : IsColimit (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0))
g' : (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt ⟶ (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt :=
  IsColimit.desc hp (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0))
⊢ Cofork.π (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)) = S.g ≫ 𝟙 S.X₃

Next tactic:
simp only [Cofork.π_ofπ, comp_id]
/-- The right homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def rightHomologyData [HasZeroObject C] (s : S.Splitting) :
    RightHomologyData S := by
  have hp := CokernelCofork.IsColimit.ofπ S.g S.zero
    (fun x _ => s.s ≫ x)
    (fun x hx => by simp only [s.g_s_assoc, sub_comp, id_comp, sub_eq_self, assoc, hx, comp_zero])
    (fun x _ b hb => by simp only [← hb, s.s_g_assoc])
  let g' := hp.desc (CokernelCofork.ofπ S.g S.zero)
  have hg' : g' = 𝟙 _ := by
    apply Cofork.IsColimit.hom_ext hp
    dsimp
    erw [Cofork.IsColimit.π_desc hp]
    simp only [Cofork.π_ofπ, comp_id]
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.97382, u_1} C
inst✝³ : Category.{?u.97386, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hp : IsColimit (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0))
g' : (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt ⟶ (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt :=
  IsColimit.desc hp (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0))
hg' : g' = 𝟙 (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt
⊢ RightHomologyData S

Next tactic:
have wι : (0 : 0 ⟶ S.X₃) ≫ g' = 0 := zero_comp
/-- The right homology data on a short complex equipped with a splitting. -/
@[simps]
noncomputable def rightHomologyData [HasZeroObject C] (s : S.Splitting) :
    RightHomologyData S := by
  have hp := CokernelCofork.IsColimit.ofπ S.g S.zero
    (fun x _ => s.s ≫ x)
    (fun x hx => by simp only [s.g_s_assoc, sub_comp, id_comp, sub_eq_self, assoc, hx, comp_zero])
    (fun x _ b hb => by simp only [← hb, s.s_g_assoc])
  let g' := hp.desc (CokernelCofork.ofπ S.g S.zero)
  have hg' : g' = 𝟙 _ := by
    apply Cofork.IsColimit.hom_ext hp
    dsimp
    erw [Cofork.IsColimit.π_desc hp]
    simp only [Cofork.π_ofπ, comp_id]
  have wι : (0 : 0 ⟶ S.X₃) ≫ g' = 0 := zero_comp
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{?u.97382, u_1} C
inst✝³ : Category.{?u.97386, u_2} D
inst✝² : Preadditive C
inst✝¹ : Preadditive D
S : ShortComplex C
inst✝ : HasZeroObject C
s : Splitting S
hp : IsColimit (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0))
g' : (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt ⟶ (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt :=
  IsColimit.desc hp (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0))
hg' : g' = 𝟙 (CokernelCofork.ofπ S.g (_ : S.f ≫ S.g = 0)).pt
wι : 0 ≫ g' = 0
⊢ RightHomologyData S

Next tactic:
have hι : IsLimit (KernelFork.ofι 0 wι) := KernelFork.IsLimit.ofMonoOfIsZero _
      (by rw [hg']; dsimp; infer_instance) (isZero_zero _)