l3lab/ntp-mathlib huggingface dataset:
/-- To prove that a vector space over a linear ordered field is ordered, it suffices to verify only
the first axiom of `OrderedSMul`. -/
theorem OrderedSMul.mk' (h : ∀ ⦃a b : M⦄ ⦃c : 𝕜⦄, a < b → 0 < c → c • a ≤ c • b) :
    OrderedSMul 𝕜 M := by
  have hlt' : ∀ (a b : M) (c : 𝕜), a < b → 0 < c → c • a < c • b := by
    refine' fun a b c hab hc => (h hab hc).lt_of_ne _
    rw [Ne.def, hc.ne'.isUnit.smul_left_cancel]
    exact hab.ne
  refine' { smul_lt_smul_of_pos := fun {a b c} => hlt' a b c..}
  intro a b c hab hc
  obtain ⟨c, rfl⟩ := hc.ne'.isUnit
  rw [← inv_smul_smul c a, ← inv_smul_smul c b]
  

Proof state:
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
𝕜 : Type u_5
R : Type u_6
M : Type u_7
N : Type u_8
inst✝⁴ : LinearOrderedSemifield 𝕜
inst✝³ : OrderedAddCommMonoid M
inst✝² : OrderedAddCommMonoid N
inst✝¹ : MulActionWithZero 𝕜 M
inst✝ : MulActionWithZero 𝕜 N
h : ∀ ⦃a b : M⦄ ⦃c : 𝕜⦄, a < b → 0 < c → c • a ≤ c • b
hlt' : ∀ (a b : M) (c : 𝕜), a < b → 0 < c → c • a < c • b
a b : M
c : 𝕜ˣ
hab : ↑c • a < ↑c • b
hc : 0 < ↑c
⊢ c⁻¹ • c • a < c⁻¹ • c • b

Next tactic:
refine' hlt' _ _ _ hab (pos_of_mul_pos_right _ hc.le)
/-- To prove that a vector space over a linear ordered field is ordered, it suffices to verify only
the first axiom of `OrderedSMul`. -/
theorem OrderedSMul.mk' (h : ∀ ⦃a b : M⦄ ⦃c : 𝕜⦄, a < b → 0 < c → c • a ≤ c • b) :
    OrderedSMul 𝕜 M := by
  have hlt' : ∀ (a b : M) (c : 𝕜), a < b → 0 < c → c • a < c • b := by
    refine' fun a b c hab hc => (h hab hc).lt_of_ne _
    rw [Ne.def, hc.ne'.isUnit.smul_left_cancel]
    exact hab.ne
  refine' { smul_lt_smul_of_pos := fun {a b c} => hlt' a b c..}
  intro a b c hab hc
  obtain ⟨c, rfl⟩ := hc.ne'.isUnit
  rw [← inv_smul_smul c a, ← inv_smul_smul c b]
  refine' hlt' _ _ _ hab (pos_of_mul_pos_right _ hc.le)
  

Proof state:
case intro
ι : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
𝕜 : Type u_5
R : Type u_6
M : Type u_7
N : Type u_8
inst✝⁴ : LinearOrderedSemifield 𝕜
inst✝³ : OrderedAddCommMonoid M
inst✝² : OrderedAddCommMonoid N
inst✝¹ : MulActionWithZero 𝕜 M
inst✝ : MulActionWithZero 𝕜 N
h : ∀ ⦃a b : M⦄ ⦃c : 𝕜⦄, a < b → 0 < c → c • a ≤ c • b
hlt' : ∀ (a b : M) (c : 𝕜), a < b → 0 < c → c • a < c • b
a b : M
c : 𝕜ˣ
hab : ↑c • a < ↑c • b
hc : 0 < ↑c
⊢ 0 < ↑c * ↑c⁻¹

Next tactic:
simp only [c.mul_inv, zero_lt_one]
/-- When a left homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced left homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).LeftHomologyData := by
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.13232, u_1} C
inst✝⁴ : Category.{?u.13236, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : LeftHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
⊢ LeftHomologyData (ShortComplex.map S F)

Next tactic:
have := IsPreservedBy.hg h F
/-- When a left homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced left homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).LeftHomologyData := by
  have := IsPreservedBy.hg h F
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.13232, u_1} C
inst✝⁴ : Category.{?u.13236, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : LeftHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this : PreservesLimit (parallelPair S.g 0) F
⊢ LeftHomologyData (ShortComplex.map S F)

Next tactic:
have := IsPreservedBy.hf' h F
/-- When a left homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced left homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).LeftHomologyData := by
  have := IsPreservedBy.hg h F
  have := IsPreservedBy.hf' h F
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.13232, u_1} C
inst✝⁴ : Category.{?u.13236, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : LeftHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesLimit (parallelPair S.g 0) F
this : PreservesColimit (parallelPair (f' h) 0) F
⊢ LeftHomologyData (ShortComplex.map S F)

Next tactic:
have wi : F.map h.i ≫ F.map S.g = 0 := by rw [← F.map_comp, h.wi, F.map_zero]
/-- When a left homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced left homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).LeftHomologyData := by
  have := IsPreservedBy.hg h F
  have := IsPreservedBy.hf' h F
  have wi : F.map h.i ≫ F.map S.g = 0 := by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.13232, u_1} C
inst✝⁴ : Category.{?u.13236, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : LeftHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesLimit (parallelPair S.g 0) F
this : PreservesColimit (parallelPair (f' h) 0) F
⊢ F.map h.i ≫ F.map S.g = 0

Next tactic:
rw [← F.map_comp, h.wi, F.map_zero]
/-- When a left homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced left homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).LeftHomologyData := by
  have := IsPreservedBy.hg h F
  have := IsPreservedBy.hf' h F
  have wi : F.map h.i ≫ F.map S.g = 0 := by rw [← F.map_comp, h.wi, F.map_zero]
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.13232, u_1} C
inst✝⁴ : Category.{?u.13236, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : LeftHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesLimit (parallelPair S.g 0) F
this : PreservesColimit (parallelPair (f' h) 0) F
wi : F.map h.i ≫ F.map S.g = 0
⊢ LeftHomologyData (ShortComplex.map S F)

Next tactic:
have hi := KernelFork.mapIsLimit _ h.hi F
/-- When a left homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced left homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).LeftHomologyData := by
  have := IsPreservedBy.hg h F
  have := IsPreservedBy.hf' h F
  have wi : F.map h.i ≫ F.map S.g = 0 := by rw [← F.map_comp, h.wi, F.map_zero]
  have hi := KernelFork.mapIsLimit _ h.hi F
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.13232, u_1} C
inst✝⁴ : Category.{?u.13236, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : LeftHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesLimit (parallelPair S.g 0) F
this : PreservesColimit (parallelPair (f' h) 0) F
wi : F.map h.i ≫ F.map S.g = 0
hi : IsLimit (KernelFork.map (KernelFork.ofι h.i (_ : h.i ≫ S.g = 0)) F)
⊢ LeftHomologyData (ShortComplex.map S F)

Next tactic:
let f' : F.obj S.X₁ ⟶ F.obj h.K := hi.lift (KernelFork.ofι (S.map F).f (S.map F).zero)
/-- When a left homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced left homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).LeftHomologyData := by
  have := IsPreservedBy.hg h F
  have := IsPreservedBy.hf' h F
  have wi : F.map h.i ≫ F.map S.g = 0 := by rw [← F.map_comp, h.wi, F.map_zero]
  have hi := KernelFork.mapIsLimit _ h.hi F
  let f' : F.obj S.X₁ ⟶ F.obj h.K := hi.lift (KernelFork.ofι (S.map F).f (S.map F).zero)
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.13232, u_1} C
inst✝⁴ : Category.{?u.13236, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : LeftHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesLimit (parallelPair S.g 0) F
this : PreservesColimit (parallelPair (CategoryTheory.ShortComplex.LeftHomologyData.f' h) 0) F
wi : F.map h.i ≫ F.map S.g = 0
hi : IsLimit (KernelFork.map (KernelFork.ofι h.i (_ : h.i ≫ S.g = 0)) F)
f' : F.obj S.X₁ ⟶ F.obj h.K :=
  IsLimit.lift hi
    (KernelFork.ofι (ShortComplex.map S F).f (_ : (ShortComplex.map S F).f ≫ (ShortComplex.map S F).g = 0))
⊢ LeftHomologyData (ShortComplex.map S F)

Next tactic:
have hf' : f' = F.map h.f' := Fork.IsLimit.hom_ext hi (by
    rw [Fork.IsLimit.lift_ι hi]
    simp only [KernelFork.map_ι, Fork.ι_ofι, map_f, ← F.map_comp, f'_i])
/-- When a left homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced left homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).LeftHomologyData := by
  have := IsPreservedBy.hg h F
  have := IsPreservedBy.hf' h F
  have wi : F.map h.i ≫ F.map S.g = 0 := by rw [← F.map_comp, h.wi, F.map_zero]
  have hi := KernelFork.mapIsLimit _ h.hi F
  let f' : F.obj S.X₁ ⟶ F.obj h.K := hi.lift (KernelFork.ofι (S.map F).f (S.map F).zero)
  have hf' : f' = F.map h.f' := Fork.IsLimit.hom_ext hi (by
    

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.13232, u_1} C
inst✝⁴ : Category.{?u.13236, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : LeftHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesLimit (parallelPair S.g 0) F
this : PreservesColimit (parallelPair (CategoryTheory.ShortComplex.LeftHomologyData.f' h) 0) F
wi : F.map h.i ≫ F.map S.g = 0
hi : IsLimit (KernelFork.map (KernelFork.ofι h.i (_ : h.i ≫ S.g = 0)) F)
f' : F.obj S.X₁ ⟶ F.obj h.K :=
  IsLimit.lift hi
    (KernelFork.ofι (ShortComplex.map S F).f (_ : (ShortComplex.map S F).f ≫ (ShortComplex.map S F).g = 0))
⊢ f' ≫ Fork.ι (KernelFork.map (KernelFork.ofι h.i (_ : h.i ≫ S.g = 0)) F) =
    F.map (CategoryTheory.ShortComplex.LeftHomologyData.f' h) ≫
      Fork.ι (KernelFork.map (KernelFork.ofι h.i (_ : h.i ≫ S.g = 0)) F)

Next tactic:
rw [Fork.IsLimit.lift_ι hi]
/-- When a left homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced left homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).LeftHomologyData := by
  have := IsPreservedBy.hg h F
  have := IsPreservedBy.hf' h F
  have wi : F.map h.i ≫ F.map S.g = 0 := by rw [← F.map_comp, h.wi, F.map_zero]
  have hi := KernelFork.mapIsLimit _ h.hi F
  let f' : F.obj S.X₁ ⟶ F.obj h.K := hi.lift (KernelFork.ofι (S.map F).f (S.map F).zero)
  have hf' : f' = F.map h.f' := Fork.IsLimit.hom_ext hi (by
    rw [Fork.IsLimit.lift_ι hi]
    

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.13232, u_1} C
inst✝⁴ : Category.{?u.13236, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : LeftHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesLimit (parallelPair S.g 0) F
this : PreservesColimit (parallelPair (CategoryTheory.ShortComplex.LeftHomologyData.f' h) 0) F
wi : F.map h.i ≫ F.map S.g = 0
hi : IsLimit (KernelFork.map (KernelFork.ofι h.i (_ : h.i ≫ S.g = 0)) F)
f' : F.obj S.X₁ ⟶ F.obj h.K :=
  IsLimit.lift hi
    (KernelFork.ofι (ShortComplex.map S F).f (_ : (ShortComplex.map S F).f ≫ (ShortComplex.map S F).g = 0))
⊢ Fork.ι (KernelFork.ofι (ShortComplex.map S F).f (_ : (ShortComplex.map S F).f ≫ (ShortComplex.map S F).g = 0)) =
    F.map (CategoryTheory.ShortComplex.LeftHomologyData.f' h) ≫
      Fork.ι (KernelFork.map (KernelFork.ofι h.i (_ : h.i ≫ S.g = 0)) F)

Next tactic:
simp only [KernelFork.map_ι, Fork.ι_ofι, map_f, ← F.map_comp, f'_i]
/-- When a left homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced left homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).LeftHomologyData := by
  have := IsPreservedBy.hg h F
  have := IsPreservedBy.hf' h F
  have wi : F.map h.i ≫ F.map S.g = 0 := by rw [← F.map_comp, h.wi, F.map_zero]
  have hi := KernelFork.mapIsLimit _ h.hi F
  let f' : F.obj S.X₁ ⟶ F.obj h.K := hi.lift (KernelFork.ofι (S.map F).f (S.map F).zero)
  have hf' : f' = F.map h.f' := Fork.IsLimit.hom_ext hi (by
    rw [Fork.IsLimit.lift_ι hi]
    simp only [KernelFork.map_ι, Fork.ι_ofι, map_f, ← F.map_comp, f'_i])
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.13232, u_1} C
inst✝⁴ : Category.{?u.13236, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : LeftHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesLimit (parallelPair S.g 0) F
this : PreservesColimit (parallelPair (CategoryTheory.ShortComplex.LeftHomologyData.f' h) 0) F
wi : F.map h.i ≫ F.map S.g = 0
hi : IsLimit (KernelFork.map (KernelFork.ofι h.i (_ : h.i ≫ S.g = 0)) F)
f' : F.obj S.X₁ ⟶ F.obj h.K :=
  IsLimit.lift hi
    (KernelFork.ofι (ShortComplex.map S F).f (_ : (ShortComplex.map S F).f ≫ (ShortComplex.map S F).g = 0))
hf' : f' = F.map (CategoryTheory.ShortComplex.LeftHomologyData.f' h)
⊢ LeftHomologyData (ShortComplex.map S F)

Next tactic:
have wπ : f' ≫ F.map h.π = 0 := by rw [hf', ← F.map_comp, f'_π, F.map_zero]
/-- When a left homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced left homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).LeftHomologyData := by
  have := IsPreservedBy.hg h F
  have := IsPreservedBy.hf' h F
  have wi : F.map h.i ≫ F.map S.g = 0 := by rw [← F.map_comp, h.wi, F.map_zero]
  have hi := KernelFork.mapIsLimit _ h.hi F
  let f' : F.obj S.X₁ ⟶ F.obj h.K := hi.lift (KernelFork.ofι (S.map F).f (S.map F).zero)
  have hf' : f' = F.map h.f' := Fork.IsLimit.hom_ext hi (by
    rw [Fork.IsLimit.lift_ι hi]
    simp only [KernelFork.map_ι, Fork.ι_ofι, map_f, ← F.map_comp, f'_i])
  have wπ : f' ≫ F.map h.π = 0 := by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.13232, u_1} C
inst✝⁴ : Category.{?u.13236, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : LeftHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesLimit (parallelPair S.g 0) F
this : PreservesColimit (parallelPair (CategoryTheory.ShortComplex.LeftHomologyData.f' h) 0) F
wi : F.map h.i ≫ F.map S.g = 0
hi : IsLimit (KernelFork.map (KernelFork.ofι h.i (_ : h.i ≫ S.g = 0)) F)
f' : F.obj S.X₁ ⟶ F.obj h.K :=
  IsLimit.lift hi
    (KernelFork.ofι (ShortComplex.map S F).f (_ : (ShortComplex.map S F).f ≫ (ShortComplex.map S F).g = 0))
hf' : f' = F.map (CategoryTheory.ShortComplex.LeftHomologyData.f' h)
⊢ f' ≫ F.map h.π = 0

Next tactic:
rw [hf', ← F.map_comp, f'_π, F.map_zero]
/-- When a left homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced left homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).LeftHomologyData := by
  have := IsPreservedBy.hg h F
  have := IsPreservedBy.hf' h F
  have wi : F.map h.i ≫ F.map S.g = 0 := by rw [← F.map_comp, h.wi, F.map_zero]
  have hi := KernelFork.mapIsLimit _ h.hi F
  let f' : F.obj S.X₁ ⟶ F.obj h.K := hi.lift (KernelFork.ofι (S.map F).f (S.map F).zero)
  have hf' : f' = F.map h.f' := Fork.IsLimit.hom_ext hi (by
    rw [Fork.IsLimit.lift_ι hi]
    simp only [KernelFork.map_ι, Fork.ι_ofι, map_f, ← F.map_comp, f'_i])
  have wπ : f' ≫ F.map h.π = 0 := by rw [hf', ← F.map_comp, f'_π, F.map_zero]
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.13232, u_1} C
inst✝⁴ : Category.{?u.13236, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : LeftHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesLimit (parallelPair S.g 0) F
this : PreservesColimit (parallelPair (CategoryTheory.ShortComplex.LeftHomologyData.f' h) 0) F
wi : F.map h.i ≫ F.map S.g = 0
hi : IsLimit (KernelFork.map (KernelFork.ofι h.i (_ : h.i ≫ S.g = 0)) F)
f' : F.obj S.X₁ ⟶ F.obj h.K :=
  IsLimit.lift hi
    (KernelFork.ofι (ShortComplex.map S F).f (_ : (ShortComplex.map S F).f ≫ (ShortComplex.map S F).g = 0))
hf' : f' = F.map (CategoryTheory.ShortComplex.LeftHomologyData.f' h)
wπ : f' ≫ F.map h.π = 0
⊢ LeftHomologyData (ShortComplex.map S F)

Next tactic:
have hπ : IsColimit (CokernelCofork.ofπ (F.map h.π) wπ) := by
    let e : parallelPair f' 0 ≅ parallelPair (F.map h.f') 0 :=
      parallelPair.ext (Iso.refl _) (Iso.refl _) (by simpa using hf') (by simp)
    refine' IsColimit.precomposeInvEquiv e _
      (IsColimit.ofIsoColimit (CokernelCofork.mapIsColimit _ h.hπ' F) _)
    exact Cofork.ext (Iso.refl _) (by simp)
/-- When a left homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced left homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).LeftHomologyData := by
  have := IsPreservedBy.hg h F
  have := IsPreservedBy.hf' h F
  have wi : F.map h.i ≫ F.map S.g = 0 := by rw [← F.map_comp, h.wi, F.map_zero]
  have hi := KernelFork.mapIsLimit _ h.hi F
  let f' : F.obj S.X₁ ⟶ F.obj h.K := hi.lift (KernelFork.ofι (S.map F).f (S.map F).zero)
  have hf' : f' = F.map h.f' := Fork.IsLimit.hom_ext hi (by
    rw [Fork.IsLimit.lift_ι hi]
    simp only [KernelFork.map_ι, Fork.ι_ofι, map_f, ← F.map_comp, f'_i])
  have wπ : f' ≫ F.map h.π = 0 := by rw [hf', ← F.map_comp, f'_π, F.map_zero]
  have hπ : IsColimit (CokernelCofork.ofπ (F.map h.π) wπ) := by
    

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.13232, u_1} C
inst✝⁴ : Category.{?u.13236, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : LeftHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesLimit (parallelPair S.g 0) F
this : PreservesColimit (parallelPair (CategoryTheory.ShortComplex.LeftHomologyData.f' h) 0) F
wi : F.map h.i ≫ F.map S.g = 0
hi : IsLimit (KernelFork.map (KernelFork.ofι h.i (_ : h.i ≫ S.g = 0)) F)
f' : F.obj S.X₁ ⟶ F.obj h.K :=
  IsLimit.lift hi
    (KernelFork.ofι (ShortComplex.map S F).f (_ : (ShortComplex.map S F).f ≫ (ShortComplex.map S F).g = 0))
hf' : f' = F.map (CategoryTheory.ShortComplex.LeftHomologyData.f' h)
wπ : f' ≫ F.map h.π = 0
⊢ IsColimit (CokernelCofork.ofπ (F.map h.π) wπ)

Next tactic:
let e : parallelPair f' 0 ≅ parallelPair (F.map h.f') 0 :=
      parallelPair.ext (Iso.refl _) (Iso.refl _) (by simpa using hf') (by simp)
/-- When a left homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced left homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).LeftHomologyData := by
  have := IsPreservedBy.hg h F
  have := IsPreservedBy.hf' h F
  have wi : F.map h.i ≫ F.map S.g = 0 := by rw [← F.map_comp, h.wi, F.map_zero]
  have hi := KernelFork.mapIsLimit _ h.hi F
  let f' : F.obj S.X₁ ⟶ F.obj h.K := hi.lift (KernelFork.ofι (S.map F).f (S.map F).zero)
  have hf' : f' = F.map h.f' := Fork.IsLimit.hom_ext hi (by
    rw [Fork.IsLimit.lift_ι hi]
    simp only [KernelFork.map_ι, Fork.ι_ofι, map_f, ← F.map_comp, f'_i])
  have wπ : f' ≫ F.map h.π = 0 := by rw [hf', ← F.map_comp, f'_π, F.map_zero]
  have hπ : IsColimit (CokernelCofork.ofπ (F.map h.π) wπ) := by
    let e : parallelPair f' 0 ≅ parallelPair (F.map h.f') 0 :=
      parallelPair.ext (Iso.refl _) (Iso.refl _) (by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.13232, u_1} C
inst✝⁴ : Category.{?u.13236, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : LeftHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesLimit (parallelPair S.g 0) F
this : PreservesColimit (parallelPair (CategoryTheory.ShortComplex.LeftHomologyData.f' h) 0) F
wi : F.map h.i ≫ F.map S.g = 0
hi : IsLimit (KernelFork.map (KernelFork.ofι h.i (_ : h.i ≫ S.g = 0)) F)
f' : F.obj S.X₁ ⟶ F.obj h.K :=
  IsLimit.lift hi
    (KernelFork.ofι (ShortComplex.map S F).f (_ : (ShortComplex.map S F).f ≫ (ShortComplex.map S F).g = 0))
hf' : f' = F.map (CategoryTheory.ShortComplex.LeftHomologyData.f' h)
wπ : f' ≫ F.map h.π = 0
⊢ (parallelPair f' 0).map WalkingParallelPairHom.left ≫
      (Iso.refl ((parallelPair f' 0).obj WalkingParallelPair.one)).hom =
    (Iso.refl ((parallelPair f' 0).obj WalkingParallelPair.zero)).hom ≫
      (parallelPair (F.map (CategoryTheory.ShortComplex.LeftHomologyData.f' h)) 0).map WalkingParallelPairHom.left

Next tactic:
simpa using hf'
/-- When a left homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced left homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).LeftHomologyData := by
  have := IsPreservedBy.hg h F
  have := IsPreservedBy.hf' h F
  have wi : F.map h.i ≫ F.map S.g = 0 := by rw [← F.map_comp, h.wi, F.map_zero]
  have hi := KernelFork.mapIsLimit _ h.hi F
  let f' : F.obj S.X₁ ⟶ F.obj h.K := hi.lift (KernelFork.ofι (S.map F).f (S.map F).zero)
  have hf' : f' = F.map h.f' := Fork.IsLimit.hom_ext hi (by
    rw [Fork.IsLimit.lift_ι hi]
    simp only [KernelFork.map_ι, Fork.ι_ofι, map_f, ← F.map_comp, f'_i])
  have wπ : f' ≫ F.map h.π = 0 := by rw [hf', ← F.map_comp, f'_π, F.map_zero]
  have hπ : IsColimit (CokernelCofork.ofπ (F.map h.π) wπ) := by
    let e : parallelPair f' 0 ≅ parallelPair (F.map h.f') 0 :=
      parallelPair.ext (Iso.refl _) (Iso.refl _) (by simpa using hf') (by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.13232, u_1} C
inst✝⁴ : Category.{?u.13236, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : LeftHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesLimit (parallelPair S.g 0) F
this : PreservesColimit (parallelPair (CategoryTheory.ShortComplex.LeftHomologyData.f' h) 0) F
wi : F.map h.i ≫ F.map S.g = 0
hi : IsLimit (KernelFork.map (KernelFork.ofι h.i (_ : h.i ≫ S.g = 0)) F)
f' : F.obj S.X₁ ⟶ F.obj h.K :=
  IsLimit.lift hi
    (KernelFork.ofι (ShortComplex.map S F).f (_ : (ShortComplex.map S F).f ≫ (ShortComplex.map S F).g = 0))
hf' : f' = F.map (CategoryTheory.ShortComplex.LeftHomologyData.f' h)
wπ : f' ≫ F.map h.π = 0
⊢ (parallelPair f' 0).map WalkingParallelPairHom.right ≫
      (Iso.refl ((parallelPair f' 0).obj WalkingParallelPair.one)).hom =
    (Iso.refl ((parallelPair f' 0).obj WalkingParallelPair.zero)).hom ≫
      (parallelPair (F.map (CategoryTheory.ShortComplex.LeftHomologyData.f' h)) 0).map WalkingParallelPairHom.right

Next tactic:
simp