l3lab/ntp-mathlib huggingface dataset:
/-- 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 simp)
    

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
e : parallelPair f' 0 ≅ parallelPair (F.map (CategoryTheory.ShortComplex.LeftHomologyData.f' h)) 0 :=
  parallelPair.ext (Iso.refl ((parallelPair f' 0).obj WalkingParallelPair.zero))
    (Iso.refl ((parallelPair f' 0).obj WalkingParallelPair.one))
    (_ :
      (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)
    (_ : 0 ≫ 𝟙 (F.obj h.K) = 𝟙 (F.obj S.X₁) ≫ 0)
⊢ IsColimit (CokernelCofork.ofπ (F.map h.π) wπ)

Next tactic:
refine' IsColimit.precomposeInvEquiv e _
      (IsColimit.ofIsoColimit (CokernelCofork.mapIsColimit _ h.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
  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 simp)
    refine' IsColimit.precomposeInvEquiv e _
      (IsColimit.ofIsoColimit (CokernelCofork.mapIsColimit _ h.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 (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
e : parallelPair f' 0 ≅ parallelPair (F.map (CategoryTheory.ShortComplex.LeftHomologyData.f' h)) 0 :=
  parallelPair.ext (Iso.refl ((parallelPair f' 0).obj WalkingParallelPair.zero))
    (Iso.refl ((parallelPair f' 0).obj WalkingParallelPair.one))
    (_ :
      (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)
    (_ : 0 ≫ 𝟙 (F.obj h.K) = 𝟙 (F.obj S.X₁) ≫ 0)
⊢ CokernelCofork.map (CokernelCofork.ofπ h.π (_ : CategoryTheory.ShortComplex.LeftHomologyData.f' h ≫ h.π = 0)) F ≅
    (Cocones.precompose e.inv).obj (CokernelCofork.ofπ (F.map h.π) wπ)

Next tactic:
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
    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 

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
e : parallelPair f' 0 ≅ parallelPair (F.map (CategoryTheory.ShortComplex.LeftHomologyData.f' h)) 0 :=
  parallelPair.ext (Iso.refl ((parallelPair f' 0).obj WalkingParallelPair.zero))
    (Iso.refl ((parallelPair f' 0).obj WalkingParallelPair.one))
    (_ :
      (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)
    (_ : 0 ≫ 𝟙 (F.obj h.K) = 𝟙 (F.obj S.X₁) ≫ 0)
⊢ Cofork.π
        (CokernelCofork.map (CokernelCofork.ofπ h.π (_ : CategoryTheory.ShortComplex.LeftHomologyData.f' h ≫ h.π = 0))
          F) ≫
      (Iso.refl
          (CokernelCofork.map (CokernelCofork.ofπ h.π (_ : CategoryTheory.ShortComplex.LeftHomologyData.f' h ≫ h.π = 0))
              F).pt).hom =
    Cofork.π ((Cocones.precompose e.inv).obj (CokernelCofork.ofπ (F.map h.π) wπ))

Next tactic:
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 simpa using hf') (by simp)
    refine' IsColimit.precomposeInvEquiv e _
      (IsColimit.ofIsoColimit (CokernelCofork.mapIsColimit _ h.hπ' F) _)
    exact Cofork.ext (Iso.refl _) (by simp)
  

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
hπ : IsColimit (CokernelCofork.ofπ (F.map h.π) wπ)
⊢ LeftHomologyData (ShortComplex.map S F)

Next tactic:
exact
    { K := F.obj h.K
      H := F.obj h.H
      i := F.map h.i
      π := F.map h.π
      wi := wi
      hi := hi
      wπ := wπ
      hπ := hπ }
@[simp]
lemma map_f' : (h.map F).f' = F.map h.f' := by
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{u_4, u_1} C
inst✝⁴ : Category.{u_3, 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
⊢ f' (map h F) = F.map (f' h)

Next tactic:
rw [← cancel_mono (h.map F).i, f'_i, map_f, map_i, ← F.map_comp, f'_i]
/-- Given a left homology map data `ψ : LeftHomologyMapData φ h₁ h₂` such that
both left homology data `h₁` and `h₂` are preserved by a functor `F`, this is
the induced left homology map data for the morphism `F.mapShortComplex.map φ`. -/
@[simps]
def LeftHomologyMapData.map {φ : S₁ ⟶ S₂} {h₁ : S₁.LeftHomologyData}
    {h₂ : S₂.LeftHomologyData} (ψ : LeftHomologyMapData φ h₁ h₂) (F : C ⥤ D)
    [F.PreservesZeroMorphisms] [h₁.IsPreservedBy F] [h₂.IsPreservedBy F] :
    LeftHomologyMapData (F.mapShortComplex.map φ) (h₁.map F) (h₂.map F) where
  φK := F.map ψ.φK
  φH := F.map ψ.φH
  commi := by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{?u.25691, u_1} C
inst✝⁵ : Category.{?u.25695, u_2} D
inst✝⁴ : HasZeroMorphisms C
inst✝³ : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
ψ : LeftHomologyMapData φ h₁ h₂
F : C ⥤ D
inst✝² : Functor.PreservesZeroMorphisms F
inst✝¹ : LeftHomologyData.IsPreservedBy h₁ F
inst✝ : LeftHomologyData.IsPreservedBy h₂ F
⊢ F.map ψ.φK ≫ (LeftHomologyData.map h₂ F).i = (LeftHomologyData.map h₁ F).i ≫ ((Functor.mapShortComplex F).map φ).τ₂

Next tactic:
simpa only [F.map_comp] using F.congr_map ψ.commi
/-- Given a left homology map data `ψ : LeftHomologyMapData φ h₁ h₂` such that
both left homology data `h₁` and `h₂` are preserved by a functor `F`, this is
the induced left homology map data for the morphism `F.mapShortComplex.map φ`. -/
@[simps]
def LeftHomologyMapData.map {φ : S₁ ⟶ S₂} {h₁ : S₁.LeftHomologyData}
    {h₂ : S₂.LeftHomologyData} (ψ : LeftHomologyMapData φ h₁ h₂) (F : C ⥤ D)
    [F.PreservesZeroMorphisms] [h₁.IsPreservedBy F] [h₂.IsPreservedBy F] :
    LeftHomologyMapData (F.mapShortComplex.map φ) (h₁.map F) (h₂.map F) where
  φK := F.map ψ.φK
  φH := F.map ψ.φH
  commi := by simpa only [F.map_comp] using F.congr_map ψ.commi
  commf' := by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{?u.25691, u_1} C
inst✝⁵ : Category.{?u.25695, u_2} D
inst✝⁴ : HasZeroMorphisms C
inst✝³ : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
ψ : LeftHomologyMapData φ h₁ h₂
F : C ⥤ D
inst✝² : Functor.PreservesZeroMorphisms F
inst✝¹ : LeftHomologyData.IsPreservedBy h₁ F
inst✝ : LeftHomologyData.IsPreservedBy h₂ F
⊢ LeftHomologyData.f' (LeftHomologyData.map h₁ F) ≫ F.map ψ.φK =
    ((Functor.mapShortComplex F).map φ).τ₁ ≫ LeftHomologyData.f' (LeftHomologyData.map h₂ F)

Next tactic:
simpa only [LeftHomologyData.map_f', F.map_comp] using F.congr_map ψ.commf'
/-- Given a left homology map data `ψ : LeftHomologyMapData φ h₁ h₂` such that
both left homology data `h₁` and `h₂` are preserved by a functor `F`, this is
the induced left homology map data for the morphism `F.mapShortComplex.map φ`. -/
@[simps]
def LeftHomologyMapData.map {φ : S₁ ⟶ S₂} {h₁ : S₁.LeftHomologyData}
    {h₂ : S₂.LeftHomologyData} (ψ : LeftHomologyMapData φ h₁ h₂) (F : C ⥤ D)
    [F.PreservesZeroMorphisms] [h₁.IsPreservedBy F] [h₂.IsPreservedBy F] :
    LeftHomologyMapData (F.mapShortComplex.map φ) (h₁.map F) (h₂.map F) where
  φK := F.map ψ.φK
  φH := F.map ψ.φH
  commi := by simpa only [F.map_comp] using F.congr_map ψ.commi
  commf' := by simpa only [LeftHomologyData.map_f', F.map_comp] using F.congr_map ψ.commf'
  commπ := by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{?u.25691, u_1} C
inst✝⁵ : Category.{?u.25695, u_2} D
inst✝⁴ : HasZeroMorphisms C
inst✝³ : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
ψ : LeftHomologyMapData φ h₁ h₂
F : C ⥤ D
inst✝² : Functor.PreservesZeroMorphisms F
inst✝¹ : LeftHomologyData.IsPreservedBy h₁ F
inst✝ : LeftHomologyData.IsPreservedBy h₂ F
⊢ (LeftHomologyData.map h₁ F).π ≫ F.map ψ.φH = F.map ψ.φK ≫ (LeftHomologyData.map h₂ F).π

Next tactic:
simpa only [F.map_comp] using F.congr_map ψ.commπ
/-- When a right homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced right homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).RightHomologyData := by
  

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

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

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

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

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

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

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

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

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

Next tactic:
have hp := CokernelCofork.mapIsColimit _ h.hp F
/-- When a right homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced right homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).RightHomologyData := by
  have := IsPreservedBy.hf h F
  have := IsPreservedBy.hg' h F
  have wp : F.map S.f ≫ F.map h.p = 0 := by rw [← F.map_comp, h.wp, F.map_zero]
  have hp := CokernelCofork.mapIsColimit _ h.hp F
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.33603, u_1} C
inst✝⁴ : Category.{?u.33607, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : RightHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesColimit (parallelPair S.f 0) F
this : PreservesLimit (parallelPair (g' h) 0) F
wp : F.map S.f ≫ F.map h.p = 0
hp : IsColimit (CokernelCofork.map (CokernelCofork.ofπ h.p (_ : S.f ≫ h.p = 0)) F)
⊢ RightHomologyData (ShortComplex.map S F)

Next tactic:
let g' : F.obj h.Q ⟶ F.obj S.X₃ := hp.desc (CokernelCofork.ofπ (S.map F).g (S.map F).zero)
/-- When a right homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced right homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).RightHomologyData := by
  have := IsPreservedBy.hf h F
  have := IsPreservedBy.hg' h F
  have wp : F.map S.f ≫ F.map h.p = 0 := by rw [← F.map_comp, h.wp, F.map_zero]
  have hp := CokernelCofork.mapIsColimit _ h.hp F
  let g' : F.obj h.Q ⟶ F.obj S.X₃ := hp.desc (CokernelCofork.ofπ (S.map F).g (S.map F).zero)
  

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.33603, u_1} C
inst✝⁴ : Category.{?u.33607, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : RightHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesColimit (parallelPair S.f 0) F
this : PreservesLimit (parallelPair (CategoryTheory.ShortComplex.RightHomologyData.g' h) 0) F
wp : F.map S.f ≫ F.map h.p = 0
hp : IsColimit (CokernelCofork.map (CokernelCofork.ofπ h.p (_ : S.f ≫ h.p = 0)) F)
g' : F.obj h.Q ⟶ F.obj S.X₃ :=
  IsColimit.desc hp
    (CokernelCofork.ofπ (ShortComplex.map S F).g (_ : (ShortComplex.map S F).f ≫ (ShortComplex.map S F).g = 0))
⊢ RightHomologyData (ShortComplex.map S F)

Next tactic:
have hg' : g' = F.map h.g' := by
    apply Cofork.IsColimit.hom_ext hp
    rw [Cofork.IsColimit.π_desc hp]
    simp only [Cofork.π_ofπ, CokernelCofork.map_π, map_g, ← F.map_comp, p_g']
/-- When a right homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced right homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).RightHomologyData := by
  have := IsPreservedBy.hf h F
  have := IsPreservedBy.hg' h F
  have wp : F.map S.f ≫ F.map h.p = 0 := by rw [← F.map_comp, h.wp, F.map_zero]
  have hp := CokernelCofork.mapIsColimit _ h.hp F
  let g' : F.obj h.Q ⟶ F.obj S.X₃ := hp.desc (CokernelCofork.ofπ (S.map F).g (S.map F).zero)
  have hg' : g' = F.map h.g' := by
    

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.33603, u_1} C
inst✝⁴ : Category.{?u.33607, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : RightHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesColimit (parallelPair S.f 0) F
this : PreservesLimit (parallelPair (CategoryTheory.ShortComplex.RightHomologyData.g' h) 0) F
wp : F.map S.f ≫ F.map h.p = 0
hp : IsColimit (CokernelCofork.map (CokernelCofork.ofπ h.p (_ : S.f ≫ h.p = 0)) F)
g' : F.obj h.Q ⟶ F.obj S.X₃ :=
  IsColimit.desc hp
    (CokernelCofork.ofπ (ShortComplex.map S F).g (_ : (ShortComplex.map S F).f ≫ (ShortComplex.map S F).g = 0))
⊢ g' = F.map (CategoryTheory.ShortComplex.RightHomologyData.g' h)

Next tactic:
apply Cofork.IsColimit.hom_ext hp
/-- When a right homology data `h` of a short complex `S` is preserved by a functor `F`,
this is the induced right homology data `h.map F` for the short complex `S.map F`. -/
@[simps]
noncomputable def map : (S.map F).RightHomologyData := by
  have := IsPreservedBy.hf h F
  have := IsPreservedBy.hg' h F
  have wp : F.map S.f ≫ F.map h.p = 0 := by rw [← F.map_comp, h.wp, F.map_zero]
  have hp := CokernelCofork.mapIsColimit _ h.hp F
  let g' : F.obj h.Q ⟶ F.obj S.X₃ := hp.desc (CokernelCofork.ofπ (S.map F).g (S.map F).zero)
  have hg' : g' = F.map h.g' := by
    apply Cofork.IsColimit.hom_ext hp
    

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.33603, u_1} C
inst✝⁴ : Category.{?u.33607, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
S S₁ S₂ : ShortComplex C
h : RightHomologyData S
F : C ⥤ D
inst✝¹ : Functor.PreservesZeroMorphisms F
inst✝ : IsPreservedBy h F
this✝ : PreservesColimit (parallelPair S.f 0) F
this : PreservesLimit (parallelPair (CategoryTheory.ShortComplex.RightHomologyData.g' h) 0) F
wp : F.map S.f ≫ F.map h.p = 0
hp : IsColimit (CokernelCofork.map (CokernelCofork.ofπ h.p (_ : S.f ≫ h.p = 0)) F)
g' : F.obj h.Q ⟶ F.obj S.X₃ :=
  IsColimit.desc hp
    (CokernelCofork.ofπ (ShortComplex.map S F).g (_ : (ShortComplex.map S F).f ≫ (ShortComplex.map S F).g = 0))
⊢ Cofork.π (CokernelCofork.map (CokernelCofork.ofπ h.p (_ : S.f ≫ h.p = 0)) F) ≫ g' =
    Cofork.π (CokernelCofork.map (CokernelCofork.ofπ h.p (_ : S.f ≫ h.p = 0)) F) ≫
      F.map (CategoryTheory.ShortComplex.RightHomologyData.g' h)

Next tactic:
rw [Cofork.IsColimit.π_desc hp]