l3lab/ntp-mathlib huggingface dataset:
instance quasiIso_map_of_preservesRightHomology
    [F.PreservesRightHomologyOf S₁] [F.PreservesRightHomologyOf S₂]
    [QuasiIso φ] : QuasiIso (F.mapShortComplex.map φ) := by
  have γ : RightHomologyMapData φ S₁.rightHomologyData S₂.rightHomologyData := default
  have : IsIso γ.φH := by
    rw [← γ.quasiIso_iff]
    infer_instance
  

Proof state:
C : Type u_1
D : Type u_2
inst✝¹¹ : Category.{?u.203053, u_1} C
inst✝¹⁰ : Category.{?u.203057, u_2} D
inst✝⁹ : HasZeroMorphisms C
inst✝⁸ : HasZeroMorphisms D
S : ShortComplex C
h₁ : LeftHomologyData S
h₂ : RightHomologyData S
F : C ⥤ D
inst✝⁷ : Functor.PreservesZeroMorphisms F
S₁ S₂ : ShortComplex C
φ : S₁ ⟶ S₂
hl₁ : LeftHomologyData S₁
hr₁ : RightHomologyData S₁
hl₂ : LeftHomologyData S₂
hr₂ : RightHomologyData S₂
ψl : LeftHomologyMapData φ hl₁ hl₂
ψr : RightHomologyMapData φ hr₁ hr₂
inst✝⁶ : HasHomology S₁
inst✝⁵ : HasHomology S₂
inst✝⁴ : HasHomology ((Functor.mapShortComplex F).obj S₁)
inst✝³ : HasHomology ((Functor.mapShortComplex F).obj S₂)
inst✝² : Functor.PreservesRightHomologyOf F S₁
inst✝¹ : Functor.PreservesRightHomologyOf F S₂
inst✝ : QuasiIso φ
γ : RightHomologyMapData φ (rightHomologyData S₁) (rightHomologyData S₂)
this : IsIso γ.φH
⊢ QuasiIso ((Functor.mapShortComplex F).map φ)

Next tactic:
rw [(γ.map F).quasiIso_iff, RightHomologyMapData.map_φH]
instance quasiIso_map_of_preservesRightHomology
    [F.PreservesRightHomologyOf S₁] [F.PreservesRightHomologyOf S₂]
    [QuasiIso φ] : QuasiIso (F.mapShortComplex.map φ) := by
  have γ : RightHomologyMapData φ S₁.rightHomologyData S₂.rightHomologyData := default
  have : IsIso γ.φH := by
    rw [← γ.quasiIso_iff]
    infer_instance
  rw [(γ.map F).quasiIso_iff, RightHomologyMapData.map_φH]
  

Proof state:
C : Type u_1
D : Type u_2
inst✝¹¹ : Category.{?u.203053, u_1} C
inst✝¹⁰ : Category.{?u.203057, u_2} D
inst✝⁹ : HasZeroMorphisms C
inst✝⁸ : HasZeroMorphisms D
S : ShortComplex C
h₁ : LeftHomologyData S
h₂ : RightHomologyData S
F : C ⥤ D
inst✝⁷ : Functor.PreservesZeroMorphisms F
S₁ S₂ : ShortComplex C
φ : S₁ ⟶ S₂
hl₁ : LeftHomologyData S₁
hr₁ : RightHomologyData S₁
hl₂ : LeftHomologyData S₂
hr₂ : RightHomologyData S₂
ψl : LeftHomologyMapData φ hl₁ hl₂
ψr : RightHomologyMapData φ hr₁ hr₂
inst✝⁶ : HasHomology S₁
inst✝⁵ : HasHomology S₂
inst✝⁴ : HasHomology ((Functor.mapShortComplex F).obj S₁)
inst✝³ : HasHomology ((Functor.mapShortComplex F).obj S₂)
inst✝² : Functor.PreservesRightHomologyOf F S₁
inst✝¹ : Functor.PreservesRightHomologyOf F S₂
inst✝ : QuasiIso φ
γ : RightHomologyMapData φ (rightHomologyData S₁) (rightHomologyData S₂)
this : IsIso γ.φH
⊢ IsIso (F.map γ.φH)

Next tactic:
infer_instance
lemma quasiIso_map_iff_of_preservesRightHomology
    [F.PreservesRightHomologyOf S₁] [F.PreservesRightHomologyOf S₂]
    [ReflectsIsomorphisms F] :
    QuasiIso (F.mapShortComplex.map φ) ↔ QuasiIso φ := by
  

Proof state:
C : Type u_1
D : Type u_2
inst✝¹¹ : Category.{u_3, u_1} C
inst✝¹⁰ : Category.{u_4, u_2} D
inst✝⁹ : HasZeroMorphisms C
inst✝⁸ : HasZeroMorphisms D
S : ShortComplex C
h₁ : LeftHomologyData S
h₂ : RightHomologyData S
F : C ⥤ D
inst✝⁷ : Functor.PreservesZeroMorphisms F
S₁ S₂ : ShortComplex C
φ : S₁ ⟶ S₂
hl₁ : LeftHomologyData S₁
hr₁ : RightHomologyData S₁
hl₂ : LeftHomologyData S₂
hr₂ : RightHomologyData S₂
ψl : LeftHomologyMapData φ hl₁ hl₂
ψr : RightHomologyMapData φ hr₁ hr₂
inst✝⁶ : HasHomology S₁
inst✝⁵ : HasHomology S₂
inst✝⁴ : HasHomology ((Functor.mapShortComplex F).obj S₁)
inst✝³ : HasHomology ((Functor.mapShortComplex F).obj S₂)
inst✝² : Functor.PreservesRightHomologyOf F S₁
inst✝¹ : Functor.PreservesRightHomologyOf F S₂
inst✝ : ReflectsIsomorphisms F
⊢ QuasiIso ((Functor.mapShortComplex F).map φ) ↔ QuasiIso φ

Next tactic:
have γ : RightHomologyMapData φ S₁.rightHomologyData S₂.rightHomologyData := default
lemma quasiIso_map_iff_of_preservesRightHomology
    [F.PreservesRightHomologyOf S₁] [F.PreservesRightHomologyOf S₂]
    [ReflectsIsomorphisms F] :
    QuasiIso (F.mapShortComplex.map φ) ↔ QuasiIso φ := by
  have γ : RightHomologyMapData φ S₁.rightHomologyData S₂.rightHomologyData := default
  

Proof state:
C : Type u_1
D : Type u_2
inst✝¹¹ : Category.{u_3, u_1} C
inst✝¹⁰ : Category.{u_4, u_2} D
inst✝⁹ : HasZeroMorphisms C
inst✝⁸ : HasZeroMorphisms D
S : ShortComplex C
h₁ : LeftHomologyData S
h₂ : RightHomologyData S
F : C ⥤ D
inst✝⁷ : Functor.PreservesZeroMorphisms F
S₁ S₂ : ShortComplex C
φ : S₁ ⟶ S₂
hl₁ : LeftHomologyData S₁
hr₁ : RightHomologyData S₁
hl₂ : LeftHomologyData S₂
hr₂ : RightHomologyData S₂
ψl : LeftHomologyMapData φ hl₁ hl₂
ψr : RightHomologyMapData φ hr₁ hr₂
inst✝⁶ : HasHomology S₁
inst✝⁵ : HasHomology S₂
inst✝⁴ : HasHomology ((Functor.mapShortComplex F).obj S₁)
inst✝³ : HasHomology ((Functor.mapShortComplex F).obj S₂)
inst✝² : Functor.PreservesRightHomologyOf F S₁
inst✝¹ : Functor.PreservesRightHomologyOf F S₂
inst✝ : ReflectsIsomorphisms F
γ : RightHomologyMapData φ (rightHomologyData S₁) (rightHomologyData S₂)
⊢ QuasiIso ((Functor.mapShortComplex F).map φ) ↔ QuasiIso φ

Next tactic:
rw [γ.quasiIso_iff, (γ.map F).quasiIso_iff, RightHomologyMapData.map_φH]
lemma quasiIso_map_iff_of_preservesRightHomology
    [F.PreservesRightHomologyOf S₁] [F.PreservesRightHomologyOf S₂]
    [ReflectsIsomorphisms F] :
    QuasiIso (F.mapShortComplex.map φ) ↔ QuasiIso φ := by
  have γ : RightHomologyMapData φ S₁.rightHomologyData S₂.rightHomologyData := default
  rw [γ.quasiIso_iff, (γ.map F).quasiIso_iff, RightHomologyMapData.map_φH]
  

Proof state:
C : Type u_1
D : Type u_2
inst✝¹¹ : Category.{u_3, u_1} C
inst✝¹⁰ : Category.{u_4, u_2} D
inst✝⁹ : HasZeroMorphisms C
inst✝⁸ : HasZeroMorphisms D
S : ShortComplex C
h₁ : LeftHomologyData S
h₂ : RightHomologyData S
F : C ⥤ D
inst✝⁷ : Functor.PreservesZeroMorphisms F
S₁ S₂ : ShortComplex C
φ : S₁ ⟶ S₂
hl₁ : LeftHomologyData S₁
hr₁ : RightHomologyData S₁
hl₂ : LeftHomologyData S₂
hr₂ : RightHomologyData S₂
ψl : LeftHomologyMapData φ hl₁ hl₂
ψr : RightHomologyMapData φ hr₁ hr₂
inst✝⁶ : HasHomology S₁
inst✝⁵ : HasHomology S₂
inst✝⁴ : HasHomology ((Functor.mapShortComplex F).obj S₁)
inst✝³ : HasHomology ((Functor.mapShortComplex F).obj S₂)
inst✝² : Functor.PreservesRightHomologyOf F S₁
inst✝¹ : Functor.PreservesRightHomologyOf F S₂
inst✝ : ReflectsIsomorphisms F
γ : RightHomologyMapData φ (rightHomologyData S₁) (rightHomologyData S₂)
⊢ IsIso (F.map γ.φH) ↔ IsIso γ.φH

Next tactic:
constructor
lemma quasiIso_map_iff_of_preservesRightHomology
    [F.PreservesRightHomologyOf S₁] [F.PreservesRightHomologyOf S₂]
    [ReflectsIsomorphisms F] :
    QuasiIso (F.mapShortComplex.map φ) ↔ QuasiIso φ := by
  have γ : RightHomologyMapData φ S₁.rightHomologyData S₂.rightHomologyData := default
  rw [γ.quasiIso_iff, (γ.map F).quasiIso_iff, RightHomologyMapData.map_φH]
  constructor
  · 

Proof state:
case mp
C : Type u_1
D : Type u_2
inst✝¹¹ : Category.{u_3, u_1} C
inst✝¹⁰ : Category.{u_4, u_2} D
inst✝⁹ : HasZeroMorphisms C
inst✝⁸ : HasZeroMorphisms D
S : ShortComplex C
h₁ : LeftHomologyData S
h₂ : RightHomologyData S
F : C ⥤ D
inst✝⁷ : Functor.PreservesZeroMorphisms F
S₁ S₂ : ShortComplex C
φ : S₁ ⟶ S₂
hl₁ : LeftHomologyData S₁
hr₁ : RightHomologyData S₁
hl₂ : LeftHomologyData S₂
hr₂ : RightHomologyData S₂
ψl : LeftHomologyMapData φ hl₁ hl₂
ψr : RightHomologyMapData φ hr₁ hr₂
inst✝⁶ : HasHomology S₁
inst✝⁵ : HasHomology S₂
inst✝⁴ : HasHomology ((Functor.mapShortComplex F).obj S₁)
inst✝³ : HasHomology ((Functor.mapShortComplex F).obj S₂)
inst✝² : Functor.PreservesRightHomologyOf F S₁
inst✝¹ : Functor.PreservesRightHomologyOf F S₂
inst✝ : ReflectsIsomorphisms F
γ : RightHomologyMapData φ (rightHomologyData S₁) (rightHomologyData S₂)
⊢ IsIso (F.map γ.φH) → IsIso γ.φH

Next tactic:
intro
lemma quasiIso_map_iff_of_preservesRightHomology
    [F.PreservesRightHomologyOf S₁] [F.PreservesRightHomologyOf S₂]
    [ReflectsIsomorphisms F] :
    QuasiIso (F.mapShortComplex.map φ) ↔ QuasiIso φ := by
  have γ : RightHomologyMapData φ S₁.rightHomologyData S₂.rightHomologyData := default
  rw [γ.quasiIso_iff, (γ.map F).quasiIso_iff, RightHomologyMapData.map_φH]
  constructor
  · intro
    

Proof state:
case mp
C : Type u_1
D : Type u_2
inst✝¹¹ : Category.{u_3, u_1} C
inst✝¹⁰ : Category.{u_4, u_2} D
inst✝⁹ : HasZeroMorphisms C
inst✝⁸ : HasZeroMorphisms D
S : ShortComplex C
h₁ : LeftHomologyData S
h₂ : RightHomologyData S
F : C ⥤ D
inst✝⁷ : Functor.PreservesZeroMorphisms F
S₁ S₂ : ShortComplex C
φ : S₁ ⟶ S₂
hl₁ : LeftHomologyData S₁
hr₁ : RightHomologyData S₁
hl₂ : LeftHomologyData S₂
hr₂ : RightHomologyData S₂
ψl : LeftHomologyMapData φ hl₁ hl₂
ψr : RightHomologyMapData φ hr₁ hr₂
inst✝⁶ : HasHomology S₁
inst✝⁵ : HasHomology S₂
inst✝⁴ : HasHomology ((Functor.mapShortComplex F).obj S₁)
inst✝³ : HasHomology ((Functor.mapShortComplex F).obj S₂)
inst✝² : Functor.PreservesRightHomologyOf F S₁
inst✝¹ : Functor.PreservesRightHomologyOf F S₂
inst✝ : ReflectsIsomorphisms F
γ : RightHomologyMapData φ (rightHomologyData S₁) (rightHomologyData S₂)
a✝ : IsIso (F.map γ.φH)
⊢ IsIso γ.φH

Next tactic:
exact isIso_of_reflects_iso _ F
lemma quasiIso_map_iff_of_preservesRightHomology
    [F.PreservesRightHomologyOf S₁] [F.PreservesRightHomologyOf S₂]
    [ReflectsIsomorphisms F] :
    QuasiIso (F.mapShortComplex.map φ) ↔ QuasiIso φ := by
  have γ : RightHomologyMapData φ S₁.rightHomologyData S₂.rightHomologyData := default
  rw [γ.quasiIso_iff, (γ.map F).quasiIso_iff, RightHomologyMapData.map_φH]
  constructor
  · intro
    exact isIso_of_reflects_iso _ F
  · 

Proof state:
case mpr
C : Type u_1
D : Type u_2
inst✝¹¹ : Category.{u_3, u_1} C
inst✝¹⁰ : Category.{u_4, u_2} D
inst✝⁹ : HasZeroMorphisms C
inst✝⁸ : HasZeroMorphisms D
S : ShortComplex C
h₁ : LeftHomologyData S
h₂ : RightHomologyData S
F : C ⥤ D
inst✝⁷ : Functor.PreservesZeroMorphisms F
S₁ S₂ : ShortComplex C
φ : S₁ ⟶ S₂
hl₁ : LeftHomologyData S₁
hr₁ : RightHomologyData S₁
hl₂ : LeftHomologyData S₂
hr₂ : RightHomologyData S₂
ψl : LeftHomologyMapData φ hl₁ hl₂
ψr : RightHomologyMapData φ hr₁ hr₂
inst✝⁶ : HasHomology S₁
inst✝⁵ : HasHomology S₂
inst✝⁴ : HasHomology ((Functor.mapShortComplex F).obj S₁)
inst✝³ : HasHomology ((Functor.mapShortComplex F).obj S₂)
inst✝² : Functor.PreservesRightHomologyOf F S₁
inst✝¹ : Functor.PreservesRightHomologyOf F S₂
inst✝ : ReflectsIsomorphisms F
γ : RightHomologyMapData φ (rightHomologyData S₁) (rightHomologyData S₂)
⊢ IsIso γ.φH → IsIso (F.map γ.φH)

Next tactic:
intro
lemma quasiIso_map_iff_of_preservesRightHomology
    [F.PreservesRightHomologyOf S₁] [F.PreservesRightHomologyOf S₂]
    [ReflectsIsomorphisms F] :
    QuasiIso (F.mapShortComplex.map φ) ↔ QuasiIso φ := by
  have γ : RightHomologyMapData φ S₁.rightHomologyData S₂.rightHomologyData := default
  rw [γ.quasiIso_iff, (γ.map F).quasiIso_iff, RightHomologyMapData.map_φH]
  constructor
  · intro
    exact isIso_of_reflects_iso _ F
  · intro
    

Proof state:
case mpr
C : Type u_1
D : Type u_2
inst✝¹¹ : Category.{u_3, u_1} C
inst✝¹⁰ : Category.{u_4, u_2} D
inst✝⁹ : HasZeroMorphisms C
inst✝⁸ : HasZeroMorphisms D
S : ShortComplex C
h₁ : LeftHomologyData S
h₂ : RightHomologyData S
F : C ⥤ D
inst✝⁷ : Functor.PreservesZeroMorphisms F
S₁ S₂ : ShortComplex C
φ : S₁ ⟶ S₂
hl₁ : LeftHomologyData S₁
hr₁ : RightHomologyData S₁
hl₂ : LeftHomologyData S₂
hr₂ : RightHomologyData S₂
ψl : LeftHomologyMapData φ hl₁ hl₂
ψr : RightHomologyMapData φ hr₁ hr₂
inst✝⁶ : HasHomology S₁
inst✝⁵ : HasHomology S₂
inst✝⁴ : HasHomology ((Functor.mapShortComplex F).obj S₁)
inst✝³ : HasHomology ((Functor.mapShortComplex F).obj S₂)
inst✝² : Functor.PreservesRightHomologyOf F S₁
inst✝¹ : Functor.PreservesRightHomologyOf F S₂
inst✝ : ReflectsIsomorphisms F
γ : RightHomologyMapData φ (rightHomologyData S₁) (rightHomologyData S₂)
a✝ : IsIso γ.φH
⊢ IsIso (F.map γ.φH)

Next tactic:
infer_instance
/-- If a short complex `S` is such that `S.f = 0` and that the kernel of `S.g` is preserved
by a functor `F`, then `F` preserves the left homology of `S`. -/
noncomputable def preservesLeftHomologyOfZerof (hf : S.f = 0)
    [PreservesLimit (parallelPair S.g 0) F] :
    F.PreservesLeftHomologyOf S := ⟨fun h =>
  { g := by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.210111, u_1} C
inst✝⁴ : Category.{?u.210115, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
S : ShortComplex C
hf : S.f = 0
inst✝ : PreservesLimit (parallelPair S.g 0) F
h : ShortComplex.LeftHomologyData S
⊢ PreservesLimit (parallelPair S.g 0) F

Next tactic:
infer_instance
/-- If a short complex `S` is such that `S.f = 0` and that the kernel of `S.g` is preserved
by a functor `F`, then `F` preserves the left homology of `S`. -/
noncomputable def preservesLeftHomologyOfZerof (hf : S.f = 0)
    [PreservesLimit (parallelPair S.g 0) F] :
    F.PreservesLeftHomologyOf S := ⟨fun h =>
  { g := by infer_instance
    f' := Limits.preservesCokernelZero' _ _
      (by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.210111, u_1} C
inst✝⁴ : Category.{?u.210115, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
S : ShortComplex C
hf : S.f = 0
inst✝ : PreservesLimit (parallelPair S.g 0) F
h : ShortComplex.LeftHomologyData S
⊢ ShortComplex.LeftHomologyData.f' h = 0

Next tactic:
rw [← cancel_mono h.i, h.f'_i, zero_comp, hf]
/-- If a short complex `S` is such that `S.g = 0` and that the cokernel of `S.f` is preserved
by a functor `F`, then `F` preserves the right homology of `S`. -/
noncomputable def preservesRightHomologyOfZerog (hg : S.g = 0)
    [PreservesColimit (parallelPair S.f 0) F] :
    F.PreservesRightHomologyOf S := ⟨fun h =>
  { f := by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.212095, u_1} C
inst✝⁴ : Category.{?u.212099, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
S : ShortComplex C
hg : S.g = 0
inst✝ : PreservesColimit (parallelPair S.f 0) F
h : ShortComplex.RightHomologyData S
⊢ PreservesColimit (parallelPair S.f 0) F

Next tactic:
infer_instance
/-- If a short complex `S` is such that `S.g = 0` and that the cokernel of `S.f` is preserved
by a functor `F`, then `F` preserves the right homology of `S`. -/
noncomputable def preservesRightHomologyOfZerog (hg : S.g = 0)
    [PreservesColimit (parallelPair S.f 0) F] :
    F.PreservesRightHomologyOf S := ⟨fun h =>
  { f := by infer_instance
    g' := Limits.preservesKernelZero' _ _
      (by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.212095, u_1} C
inst✝⁴ : Category.{?u.212099, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
S : ShortComplex C
hg : S.g = 0
inst✝ : PreservesColimit (parallelPair S.f 0) F
h : ShortComplex.RightHomologyData S
⊢ ShortComplex.RightHomologyData.g' h = 0

Next tactic:
rw [← cancel_epi h.p, h.p_g', comp_zero, hg]
/-- If a short complex `S` is such that `S.g = 0` and that the cokernel of `S.f` is preserved
by a functor `F`, then `F` preserves the left homology of `S`. -/
noncomputable def preservesLeftHomologyOfZerog (hg : S.g = 0)
    [PreservesColimit (parallelPair S.f 0) F] :
    F.PreservesLeftHomologyOf S := ⟨fun h =>
  { g := by
      

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.214081, u_1} C
inst✝⁴ : Category.{?u.214085, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
S : ShortComplex C
hg : S.g = 0
inst✝ : PreservesColimit (parallelPair S.f 0) F
h : ShortComplex.LeftHomologyData S
⊢ PreservesLimit (parallelPair S.g 0) F

Next tactic:
rw [hg]
/-- If a short complex `S` is such that `S.g = 0` and that the cokernel of `S.f` is preserved
by a functor `F`, then `F` preserves the left homology of `S`. -/
noncomputable def preservesLeftHomologyOfZerog (hg : S.g = 0)
    [PreservesColimit (parallelPair S.f 0) F] :
    F.PreservesLeftHomologyOf S := ⟨fun h =>
  { g := by
      rw [hg]
      

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.214081, u_1} C
inst✝⁴ : Category.{?u.214085, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
S : ShortComplex C
hg : S.g = 0
inst✝ : PreservesColimit (parallelPair S.f 0) F
h : ShortComplex.LeftHomologyData S
⊢ PreservesLimit (parallelPair 0 0) F

Next tactic:
infer_instance
/-- If a short complex `S` is such that `S.g = 0` and that the cokernel of `S.f` is preserved
by a functor `F`, then `F` preserves the left homology of `S`. -/
noncomputable def preservesLeftHomologyOfZerog (hg : S.g = 0)
    [PreservesColimit (parallelPair S.f 0) F] :
    F.PreservesLeftHomologyOf S := ⟨fun h =>
  { g := by
      rw [hg]
      infer_instance
    f' := by
      

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.214081, u_1} C
inst✝⁴ : Category.{?u.214085, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
S : ShortComplex C
hg : S.g = 0
inst✝ : PreservesColimit (parallelPair S.f 0) F
h : ShortComplex.LeftHomologyData S
⊢ PreservesColimit (parallelPair (ShortComplex.LeftHomologyData.f' h) 0) F

Next tactic:
have := h.isIso_i hg
/-- If a short complex `S` is such that `S.g = 0` and that the cokernel of `S.f` is preserved
by a functor `F`, then `F` preserves the left homology of `S`. -/
noncomputable def preservesLeftHomologyOfZerog (hg : S.g = 0)
    [PreservesColimit (parallelPair S.f 0) F] :
    F.PreservesLeftHomologyOf S := ⟨fun h =>
  { g := by
      rw [hg]
      infer_instance
    f' := by
      have := h.isIso_i hg
      

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.214081, u_1} C
inst✝⁴ : Category.{?u.214085, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
S : ShortComplex C
hg : S.g = 0
inst✝ : PreservesColimit (parallelPair S.f 0) F
h : ShortComplex.LeftHomologyData S
this : IsIso h.i
⊢ PreservesColimit (parallelPair (ShortComplex.LeftHomologyData.f' h) 0) F

Next tactic:
let e : parallelPair h.f' 0 ≅ parallelPair S.f 0 :=
        parallelPair.ext (Iso.refl _) (asIso h.i) (by aesop_cat) (by aesop_cat)
/-- If a short complex `S` is such that `S.g = 0` and that the cokernel of `S.f` is preserved
by a functor `F`, then `F` preserves the left homology of `S`. -/
noncomputable def preservesLeftHomologyOfZerog (hg : S.g = 0)
    [PreservesColimit (parallelPair S.f 0) F] :
    F.PreservesLeftHomologyOf S := ⟨fun h =>
  { g := by
      rw [hg]
      infer_instance
    f' := by
      have := h.isIso_i hg
      let e : parallelPair h.f' 0 ≅ parallelPair S.f 0 :=
        parallelPair.ext (Iso.refl _) (asIso h.i) (by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.214081, u_1} C
inst✝⁴ : Category.{?u.214085, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
S : ShortComplex C
hg : S.g = 0
inst✝ : PreservesColimit (parallelPair S.f 0) F
h : ShortComplex.LeftHomologyData S
this : IsIso h.i
⊢ (parallelPair (ShortComplex.LeftHomologyData.f' h) 0).map WalkingParallelPairHom.left ≫ (asIso h.i).hom =
    (Iso.refl ((parallelPair (ShortComplex.LeftHomologyData.f' h) 0).obj WalkingParallelPair.zero)).hom ≫
      (parallelPair S.f 0).map WalkingParallelPairHom.left

Next tactic:
aesop_cat
/-- If a short complex `S` is such that `S.g = 0` and that the cokernel of `S.f` is preserved
by a functor `F`, then `F` preserves the left homology of `S`. -/
noncomputable def preservesLeftHomologyOfZerog (hg : S.g = 0)
    [PreservesColimit (parallelPair S.f 0) F] :
    F.PreservesLeftHomologyOf S := ⟨fun h =>
  { g := by
      rw [hg]
      infer_instance
    f' := by
      have := h.isIso_i hg
      let e : parallelPair h.f' 0 ≅ parallelPair S.f 0 :=
        parallelPair.ext (Iso.refl _) (asIso h.i) (by aesop_cat) (by 

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.214081, u_1} C
inst✝⁴ : Category.{?u.214085, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
S : ShortComplex C
hg : S.g = 0
inst✝ : PreservesColimit (parallelPair S.f 0) F
h : ShortComplex.LeftHomologyData S
this : IsIso h.i
⊢ (parallelPair (ShortComplex.LeftHomologyData.f' h) 0).map WalkingParallelPairHom.right ≫ (asIso h.i).hom =
    (Iso.refl ((parallelPair (ShortComplex.LeftHomologyData.f' h) 0).obj WalkingParallelPair.zero)).hom ≫
      (parallelPair S.f 0).map WalkingParallelPairHom.right

Next tactic:
aesop_cat
/-- If a short complex `S` is such that `S.g = 0` and that the cokernel of `S.f` is preserved
by a functor `F`, then `F` preserves the left homology of `S`. -/
noncomputable def preservesLeftHomologyOfZerog (hg : S.g = 0)
    [PreservesColimit (parallelPair S.f 0) F] :
    F.PreservesLeftHomologyOf S := ⟨fun h =>
  { g := by
      rw [hg]
      infer_instance
    f' := by
      have := h.isIso_i hg
      let e : parallelPair h.f' 0 ≅ parallelPair S.f 0 :=
        parallelPair.ext (Iso.refl _) (asIso h.i) (by aesop_cat) (by aesop_cat)
      

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.214081, u_1} C
inst✝⁴ : Category.{?u.214085, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
S : ShortComplex C
hg : S.g = 0
inst✝ : PreservesColimit (parallelPair S.f 0) F
h : ShortComplex.LeftHomologyData S
this : IsIso h.i
e : parallelPair (ShortComplex.LeftHomologyData.f' h) 0 ≅ parallelPair S.f 0 :=
  parallelPair.ext (Iso.refl ((parallelPair (ShortComplex.LeftHomologyData.f' h) 0).obj WalkingParallelPair.zero))
    (asIso h.i) (_ : ShortComplex.LeftHomologyData.f' h ≫ h.i = 𝟙 S.X₁ ≫ S.f) (_ : 0 ≫ h.i = 𝟙 S.X₁ ≫ 0)
⊢ PreservesColimit (parallelPair (ShortComplex.LeftHomologyData.f' h) 0) F

Next tactic:
exact Limits.preservesColimitOfIsoDiagram F e.symm
/-- If a short complex `S` is such that `S.f = 0` and that the kernel of `S.g` is preserved
by a functor `F`, then `F` preserves the right homology of `S`. -/
noncomputable def preservesRightHomologyOfZerof (hf : S.f = 0)
    [PreservesLimit (parallelPair S.g 0) F] :
    F.PreservesRightHomologyOf S := ⟨fun h =>
  { f := by
      

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.219136, u_1} C
inst✝⁴ : Category.{?u.219140, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
S : ShortComplex C
hf : S.f = 0
inst✝ : PreservesLimit (parallelPair S.g 0) F
h : ShortComplex.RightHomologyData S
⊢ PreservesColimit (parallelPair S.f 0) F

Next tactic:
rw [hf]
/-- If a short complex `S` is such that `S.f = 0` and that the kernel of `S.g` is preserved
by a functor `F`, then `F` preserves the right homology of `S`. -/
noncomputable def preservesRightHomologyOfZerof (hf : S.f = 0)
    [PreservesLimit (parallelPair S.g 0) F] :
    F.PreservesRightHomologyOf S := ⟨fun h =>
  { f := by
      rw [hf]
      

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.219136, u_1} C
inst✝⁴ : Category.{?u.219140, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
S : ShortComplex C
hf : S.f = 0
inst✝ : PreservesLimit (parallelPair S.g 0) F
h : ShortComplex.RightHomologyData S
⊢ PreservesColimit (parallelPair 0 0) F

Next tactic:
infer_instance
/-- If a short complex `S` is such that `S.f = 0` and that the kernel of `S.g` is preserved
by a functor `F`, then `F` preserves the right homology of `S`. -/
noncomputable def preservesRightHomologyOfZerof (hf : S.f = 0)
    [PreservesLimit (parallelPair S.g 0) F] :
    F.PreservesRightHomologyOf S := ⟨fun h =>
  { f := by
      rw [hf]
      infer_instance
    g' := by
      

Proof state:
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.219136, u_1} C
inst✝⁴ : Category.{?u.219140, u_2} D
inst✝³ : HasZeroMorphisms C
inst✝² : HasZeroMorphisms D
F : C ⥤ D
inst✝¹ : PreservesZeroMorphisms F
S : ShortComplex C
hf : S.f = 0
inst✝ : PreservesLimit (parallelPair S.g 0) F
h : ShortComplex.RightHomologyData S
⊢ PreservesLimit (parallelPair (ShortComplex.RightHomologyData.g' h) 0) F

Next tactic:
have := h.isIso_p hf