File: Mathlib/Algebra/Homology/ShortComplex/Homology.lean

full_name: CategoryTheory.ShortComplex.HomologyData.comm
code: /-- A homology data for a short complex consists of two compatible left and
right homology data -/
structure HomologyData where
  /-- a left homology data -/
  left : S.LeftHomologyData
  /-- a right homology data -/
  right : S.RightHomologyData
  /-- the compatibility isomorphism relating the two dual notions of
    `LeftHomologyData` and `RightHomologyData`  -/
  iso : left.H ≅ right.H
  /-- the pentagon relation expressing the compatibility of the left
  and right homology data -/
  comm : left.π ≫ iso.hom ≫ right.ι = left.i ≫ right.p := by aesop_cat
goal: CategoryTheory.CategoryStruct.comp self.left.π (CategoryTheory.CategoryStruct.comp self.iso.hom self.right.ι) =
  CategoryTheory.CategoryStruct.comp self.left.i self.right.p

full_name: CategoryTheory.ShortComplex.HomologyData.left
code: /-- A homology data for a short complex consists of two compatible left and
right homology data -/
structure HomologyData where
  /-- a left homology data -/
  left : S.LeftHomologyData
  /-- a right homology data -/
  right : S.RightHomologyData
  /-- the compatibility isomorphism relating the two dual notions of
    `LeftHomologyData` and `RightHomologyData`  -/
  iso : left.H ≅ right.H
  /-- the pentagon relation expressing the compatibility of the left
  and right homology data -/
  comm : left.π ≫ iso.hom ≫ right.ι = left.i ≫ right.p := by aesop_cat
goal: S.LeftHomologyData

full_name: CategoryTheory.ShortComplex.HomologyData.right
code: /-- A homology data for a short complex consists of two compatible left and
right homology data -/
structure HomologyData where
  /-- a left homology data -/
  left : S.LeftHomologyData
  /-- a right homology data -/
  right : S.RightHomologyData
  /-- the compatibility isomorphism relating the two dual notions of
    `LeftHomologyData` and `RightHomologyData`  -/
  iso : left.H ≅ right.H
  /-- the pentagon relation expressing the compatibility of the left
  and right homology data -/
  comm : left.π ≫ iso.hom ≫ right.ι = left.i ≫ right.p := by aesop_cat
goal: S.RightHomologyData

full_name: CategoryTheory.ShortComplex.HomologyData
code: /-- A homology data for a short complex consists of two compatible left and
right homology data -/
structure HomologyData where
  /-- a left homology data -/
  left : S.LeftHomologyData
  /-- a right homology data -/
  right : S.RightHomologyData
  /-- the compatibility isomorphism relating the two dual notions of
    `LeftHomologyData` and `RightHomologyData`  -/
  iso : left.H ≅ right.H
  /-- the pentagon relation expressing the compatibility of the left
  and right homology data -/
  comm : left.π ≫ iso.hom ≫ right.ι = left.i ≫ right.p := by aesop_cat
goal: Type (max u v)

full_name: CategoryTheory.ShortComplex.HomologyData.iso
code: /-- A homology data for a short complex consists of two compatible left and
right homology data -/
structure HomologyData where
  /-- a left homology data -/
  left : S.LeftHomologyData
  /-- a right homology data -/
  right : S.RightHomologyData
  /-- the compatibility isomorphism relating the two dual notions of
    `LeftHomologyData` and `RightHomologyData`  -/
  iso : left.H ≅ right.H
  /-- the pentagon relation expressing the compatibility of the left
  and right homology data -/
  comm : left.π ≫ iso.hom ≫ right.ι = left.i ≫ right.p := by aesop_cat
goal: self.left.H ≅ self.right.H

full_name: CategoryTheory.ShortComplex.HomologyMapData.left
code: /-- A homology map data for a morphism `φ : S₁ ⟶ S₂` where both `S₁` and `S₂` are
equipped with homology data consists of left and right homology map data. -/
structure HomologyMapData where
  /-- a left homology map data -/
  left : LeftHomologyMapData φ h₁.left h₂.left
  /-- a right homology map data -/
  right : RightHomologyMapData φ h₁.right h₂.right
goal: CategoryTheory.ShortComplex.LeftHomologyMapData φ h₁.left h₂.left

full_name: CategoryTheory.ShortComplex.HomologyMapData.right
code: /-- A homology map data for a morphism `φ : S₁ ⟶ S₂` where both `S₁` and `S₂` are
equipped with homology data consists of left and right homology map data. -/
structure HomologyMapData where
  /-- a left homology map data -/
  left : LeftHomologyMapData φ h₁.left h₂.left
  /-- a right homology map data -/
  right : RightHomologyMapData φ h₁.right h₂.right
goal: CategoryTheory.ShortComplex.RightHomologyMapData φ h₁.right h₂.right

full_name: CategoryTheory.ShortComplex.HomologyMapData
code: /-- A homology map data for a morphism `φ : S₁ ⟶ S₂` where both `S₁` and `S₂` are
equipped with homology data consists of left and right homology map data. -/
structure HomologyMapData where
  /-- a left homology map data -/
  left : LeftHomologyMapData φ h₁.left h₂.left
  /-- a right homology map data -/
  right : RightHomologyMapData φ h₁.right h₂.right
goal: Type v

full_name: CategoryTheory.ShortComplex.HomologyMapData.comm
code: @[reassoc]
lemma comm (h : HomologyMapData φ h₁ h₂) :
    h.left.φH ≫ h₂.iso.hom = h₁.iso.hom ≫ h.right.φH 
goal: CategoryTheory.CategoryStruct.comp h.left.φH h₂.iso.hom = CategoryTheory.CategoryStruct.comp h₁.iso.hom h.right.φH

full_name: CategoryTheory.ShortComplex.HomologyMapData.instSubsingleton
code: instance : Subsingleton (HomologyMapData φ h₁ h₂) 
goal: Subsingleton (CategoryTheory.ShortComplex.HomologyMapData φ h₁ h₂)

full_name: CategoryTheory.ShortComplex.HomologyMapData.instInhabited
code: instance : Inhabited (HomologyMapData φ h₁ h₂) 
goal: Inhabited (CategoryTheory.ShortComplex.HomologyMapData φ h₁ h₂)

full_name: CategoryTheory.ShortComplex.HomologyMapData.instUnique
code: instance : Unique (HomologyMapData φ h₁ h₂) 
goal: Unique (CategoryTheory.ShortComplex.HomologyMapData φ h₁ h₂)

full_name: CategoryTheory.ShortComplex.HomologyMapData.homologyMapData
code: /-- A choice of the (unique) homology map data associated with a morphism
`φ : S₁ ⟶ S₂` where both short complexes `S₁` and `S₂` are equipped with
homology data. -/
def homologyMapData : HomologyMapData φ h₁ h₂ 
goal: CategoryTheory.ShortComplex.HomologyMapData φ h₁ h₂

full_name: CategoryTheory.ShortComplex.HomologyMapData.congr_left_φH
code: lemma congr_left_φH {γ₁ γ₂ : HomologyMapData φ h₁ h₂} (eq : γ₁ = γ₂) :
    γ₁.left.φH = γ₂.left.φH 
goal: γ₁.left.φH = γ₂.left.φH

full_name: CategoryTheory.ShortComplex.HomologyData.ofIsLimitKernelFork_right
code: /-- When the first map `S.f` is zero, this is the homology data on `S` given
by any limit kernel fork of `S.g` -/
@[simps]
def ofIsLimitKernelFork (hf : S.f = 0) (c : KernelFork S.g) (hc : IsLimit c) :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIsLimitKernelFork S hf c hc).right =
  CategoryTheory.ShortComplex.RightHomologyData.ofIsLimitKernelFork S hf c hc

full_name: CategoryTheory.ShortComplex.HomologyData.ofIsLimitKernelFork_iso
code: /-- When the first map `S.f` is zero, this is the homology data on `S` given
by any limit kernel fork of `S.g` -/
@[simps]
def ofIsLimitKernelFork (hf : S.f = 0) (c : KernelFork S.g) (hc : IsLimit c) :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIsLimitKernelFork S hf c hc).iso =
  CategoryTheory.Iso.refl (CategoryTheory.ShortComplex.LeftHomologyData.ofIsLimitKernelFork S hf c hc).H

full_name: CategoryTheory.ShortComplex.HomologyData.ofIsLimitKernelFork_left
code: /-- When the first map `S.f` is zero, this is the homology data on `S` given
by any limit kernel fork of `S.g` -/
@[simps]
def ofIsLimitKernelFork (hf : S.f = 0) (c : KernelFork S.g) (hc : IsLimit c) :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIsLimitKernelFork S hf c hc).left =
  CategoryTheory.ShortComplex.LeftHomologyData.ofIsLimitKernelFork S hf c hc

full_name: CategoryTheory.ShortComplex.HomologyData.ofIsLimitKernelFork
code: /-- When the first map `S.f` is zero, this is the homology data on `S` given
by any limit kernel fork of `S.g` -/
@[simps]
def ofIsLimitKernelFork (hf : S.f = 0) (c : KernelFork S.g) (hc : IsLimit c) :
    S.HomologyData 
goal: S.HomologyData

full_name: CategoryTheory.ShortComplex.HomologyData.ofHasKernel_iso
code: /-- When the first map `S.f` is zero, this is the homology data on `S` given
by the chosen `kernel S.g` -/
@[simps]
noncomputable def ofHasKernel (hf : S.f = 0) [HasKernel S.g] :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofHasKernel S hf).iso =
  CategoryTheory.Iso.refl (CategoryTheory.ShortComplex.LeftHomologyData.ofHasKernel S hf).H

full_name: CategoryTheory.ShortComplex.HomologyData.ofHasKernel_right
code: /-- When the first map `S.f` is zero, this is the homology data on `S` given
by the chosen `kernel S.g` -/
@[simps]
noncomputable def ofHasKernel (hf : S.f = 0) [HasKernel S.g] :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofHasKernel S hf).right =
  CategoryTheory.ShortComplex.RightHomologyData.ofHasKernel S hf

full_name: CategoryTheory.ShortComplex.HomologyData.ofHasKernel_left
code: /-- When the first map `S.f` is zero, this is the homology data on `S` given
by the chosen `kernel S.g` -/
@[simps]
noncomputable def ofHasKernel (hf : S.f = 0) [HasKernel S.g] :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofHasKernel S hf).left =
  CategoryTheory.ShortComplex.LeftHomologyData.ofHasKernel S hf

full_name: CategoryTheory.ShortComplex.HomologyData.ofHasKernel
code: /-- When the first map `S.f` is zero, this is the homology data on `S` given
by the chosen `kernel S.g` -/
@[simps]
noncomputable def ofHasKernel (hf : S.f = 0) [HasKernel S.g] :
    S.HomologyData 
goal: S.HomologyData

full_name: CategoryTheory.ShortComplex.HomologyData.ofIsColimitCokernelCofork
code: /-- When the second map `S.g` is zero, this is the homology data on `S` given
by any colimit cokernel cofork of `S.f` -/
@[simps]
def ofIsColimitCokernelCofork (hg : S.g = 0) (c : CokernelCofork S.f) (hc : IsColimit c) :
    S.HomologyData 
goal: S.HomologyData

full_name: CategoryTheory.ShortComplex.HomologyData.ofIsColimitCokernelCofork_right
code: /-- When the second map `S.g` is zero, this is the homology data on `S` given
by any colimit cokernel cofork of `S.f` -/
@[simps]
def ofIsColimitCokernelCofork (hg : S.g = 0) (c : CokernelCofork S.f) (hc : IsColimit c) :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIsColimitCokernelCofork S hg c hc).right =
  CategoryTheory.ShortComplex.RightHomologyData.ofIsColimitCokernelCofork S hg c hc

full_name: CategoryTheory.ShortComplex.HomologyData.ofIsColimitCokernelCofork_iso
code: /-- When the second map `S.g` is zero, this is the homology data on `S` given
by any colimit cokernel cofork of `S.f` -/
@[simps]
def ofIsColimitCokernelCofork (hg : S.g = 0) (c : CokernelCofork S.f) (hc : IsColimit c) :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIsColimitCokernelCofork S hg c hc).iso =
  CategoryTheory.Iso.refl (CategoryTheory.ShortComplex.LeftHomologyData.ofIsColimitCokernelCofork S hg c hc).H

full_name: CategoryTheory.ShortComplex.HomologyData.ofIsColimitCokernelCofork_left
code: /-- When the second map `S.g` is zero, this is the homology data on `S` given
by any colimit cokernel cofork of `S.f` -/
@[simps]
def ofIsColimitCokernelCofork (hg : S.g = 0) (c : CokernelCofork S.f) (hc : IsColimit c) :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIsColimitCokernelCofork S hg c hc).left =
  CategoryTheory.ShortComplex.LeftHomologyData.ofIsColimitCokernelCofork S hg c hc

full_name: CategoryTheory.ShortComplex.HomologyData.ofHasCokernel_left
code: /-- When the second map `S.g` is zero, this is the homology data on `S` given by
the chosen `cokernel S.f` -/
@[simps]
noncomputable def ofHasCokernel (hg : S.g = 0) [HasCokernel S.f] :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofHasCokernel S hg).left =
  CategoryTheory.ShortComplex.LeftHomologyData.ofHasCokernel S hg

full_name: CategoryTheory.ShortComplex.HomologyData.ofHasCokernel_right
code: /-- When the second map `S.g` is zero, this is the homology data on `S` given by
the chosen `cokernel S.f` -/
@[simps]
noncomputable def ofHasCokernel (hg : S.g = 0) [HasCokernel S.f] :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofHasCokernel S hg).right =
  CategoryTheory.ShortComplex.RightHomologyData.ofHasCokernel S hg

full_name: CategoryTheory.ShortComplex.HomologyData.ofHasCokernel_iso
code: /-- When the second map `S.g` is zero, this is the homology data on `S` given by
the chosen `cokernel S.f` -/
@[simps]
noncomputable def ofHasCokernel (hg : S.g = 0) [HasCokernel S.f] :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofHasCokernel S hg).iso =
  CategoryTheory.Iso.refl (CategoryTheory.ShortComplex.LeftHomologyData.ofHasCokernel S hg).H

full_name: CategoryTheory.ShortComplex.HomologyData.ofHasCokernel
code: /-- When the second map `S.g` is zero, this is the homology data on `S` given by
the chosen `cokernel S.f` -/
@[simps]
noncomputable def ofHasCokernel (hg : S.g = 0) [HasCokernel S.f] :
    S.HomologyData 
goal: S.HomologyData

full_name: CategoryTheory.ShortComplex.HomologyData.ofZeros
code: /-- When both `S.f` and `S.g` are zero, the middle object `S.X₂` gives a homology data on S -/
@[simps]
noncomputable def ofZeros (hf : S.f = 0) (hg : S.g = 0) :
    S.HomologyData 
goal: S.HomologyData

full_name: CategoryTheory.ShortComplex.HomologyData.ofZeros_iso
code: /-- When both `S.f` and `S.g` are zero, the middle object `S.X₂` gives a homology data on S -/
@[simps]
noncomputable def ofZeros (hf : S.f = 0) (hg : S.g = 0) :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofZeros S hf hg).iso =
  CategoryTheory.Iso.refl (CategoryTheory.ShortComplex.LeftHomologyData.ofZeros S hf hg).H

full_name: CategoryTheory.ShortComplex.HomologyData.ofZeros_right
code: /-- When both `S.f` and `S.g` are zero, the middle object `S.X₂` gives a homology data on S -/
@[simps]
noncomputable def ofZeros (hf : S.f = 0) (hg : S.g = 0) :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofZeros S hf hg).right =
  CategoryTheory.ShortComplex.RightHomologyData.ofZeros S hf hg

full_name: CategoryTheory.ShortComplex.HomologyData.ofZeros_left
code: /-- When both `S.f` and `S.g` are zero, the middle object `S.X₂` gives a homology data on S -/
@[simps]
noncomputable def ofZeros (hf : S.f = 0) (hg : S.g = 0) :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofZeros S hf hg).left =
  CategoryTheory.ShortComplex.LeftHomologyData.ofZeros S hf hg

full_name: CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono_left
code: /-- If `φ : S₁ ⟶ S₂` is a morphism of short complexes such that `φ.τ₁` is epi, `φ.τ₂` is an iso
and `φ.τ₃` is mono, then a homology data for `S₁` induces a homology data for `S₂`.
The inverse construction is `ofEpiOfIsIsoOfMono'`. -/
@[simps]
noncomputable def ofEpiOfIsIsoOfMono (φ : S₁ ⟶ S₂) (h : HomologyData S₁)
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] : HomologyData S₂ 
goal: (CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono φ h).left =
  CategoryTheory.ShortComplex.LeftHomologyData.ofEpiOfIsIsoOfMono φ h.left

full_name: CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono_iso
code: /-- If `φ : S₁ ⟶ S₂` is a morphism of short complexes such that `φ.τ₁` is epi, `φ.τ₂` is an iso
and `φ.τ₃` is mono, then a homology data for `S₁` induces a homology data for `S₂`.
The inverse construction is `ofEpiOfIsIsoOfMono'`. -/
@[simps]
noncomputable def ofEpiOfIsIsoOfMono (φ : S₁ ⟶ S₂) (h : HomologyData S₁)
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] : HomologyData S₂ 
goal: (CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono φ h).iso = h.iso

full_name: CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono
code: /-- If `φ : S₁ ⟶ S₂` is a morphism of short complexes such that `φ.τ₁` is epi, `φ.τ₂` is an iso
and `φ.τ₃` is mono, then a homology data for `S₁` induces a homology data for `S₂`.
The inverse construction is `ofEpiOfIsIsoOfMono'`. -/
@[simps]
noncomputable def ofEpiOfIsIsoOfMono (φ : S₁ ⟶ S₂) (h : HomologyData S₁)
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] : HomologyData S₂ 
goal: S₂.HomologyData

full_name: CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono_right
code: /-- If `φ : S₁ ⟶ S₂` is a morphism of short complexes such that `φ.τ₁` is epi, `φ.τ₂` is an iso
and `φ.τ₃` is mono, then a homology data for `S₁` induces a homology data for `S₂`.
The inverse construction is `ofEpiOfIsIsoOfMono'`. -/
@[simps]
noncomputable def ofEpiOfIsIsoOfMono (φ : S₁ ⟶ S₂) (h : HomologyData S₁)
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] : HomologyData S₂ 
goal: (CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono φ h).right =
  CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono φ h.right

full_name: CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono'_right
code: /-- If `φ : S₁ ⟶ S₂` is a morphism of short complexes such that `φ.τ₁` is epi, `φ.τ₂` is an iso
and `φ.τ₃` is mono, then a homology data for `S₂` induces a homology data for `S₁`.
The inverse construction is `ofEpiOfIsIsoOfMono`. -/
@[simps]
noncomputable def ofEpiOfIsIsoOfMono' (φ : S₁ ⟶ S₂) (h : HomologyData S₂)
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] : HomologyData S₁ 
goal: (CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono' φ h).right =
  CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono' φ h.right

full_name: CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono'
code: /-- If `φ : S₁ ⟶ S₂` is a morphism of short complexes such that `φ.τ₁` is epi, `φ.τ₂` is an iso
and `φ.τ₃` is mono, then a homology data for `S₂` induces a homology data for `S₁`.
The inverse construction is `ofEpiOfIsIsoOfMono`. -/
@[simps]
noncomputable def ofEpiOfIsIsoOfMono' (φ : S₁ ⟶ S₂) (h : HomologyData S₂)
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] : HomologyData S₁ 
goal: S₁.HomologyData

full_name: CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono'_left
code: /-- If `φ : S₁ ⟶ S₂` is a morphism of short complexes such that `φ.τ₁` is epi, `φ.τ₂` is an iso
and `φ.τ₃` is mono, then a homology data for `S₂` induces a homology data for `S₁`.
The inverse construction is `ofEpiOfIsIsoOfMono`. -/
@[simps]
noncomputable def ofEpiOfIsIsoOfMono' (φ : S₁ ⟶ S₂) (h : HomologyData S₂)
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] : HomologyData S₁ 
goal: (CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono' φ h).left =
  CategoryTheory.ShortComplex.LeftHomologyData.ofEpiOfIsIsoOfMono' φ h.left

full_name: CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono'_iso
code: /-- If `φ : S₁ ⟶ S₂` is a morphism of short complexes such that `φ.τ₁` is epi, `φ.τ₂` is an iso
and `φ.τ₃` is mono, then a homology data for `S₂` induces a homology data for `S₁`.
The inverse construction is `ofEpiOfIsIsoOfMono`. -/
@[simps]
noncomputable def ofEpiOfIsIsoOfMono' (φ : S₁ ⟶ S₂) (h : HomologyData S₂)
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] : HomologyData S₁ 
goal: (CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono' φ h).iso = h.iso

full_name: CategoryTheory.ShortComplex.HomologyData.ofIso_left_H
code: /-- If `e : S₁ ≅ S₂` is an isomorphism of short complexes and `h₁ : HomologyData S₁`,
this is the homology data for `S₂` deduced from the isomorphism. -/
@[simps!]
noncomputable def ofIso (e : S₁ ≅ S₂) (h : HomologyData S₁) 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIso e h).left.H = h.left.H

full_name: CategoryTheory.ShortComplex.HomologyData.ofIso_iso
code: /-- If `e : S₁ ≅ S₂` is an isomorphism of short complexes and `h₁ : HomologyData S₁`,
this is the homology data for `S₂` deduced from the isomorphism. -/
@[simps!]
noncomputable def ofIso (e : S₁ ≅ S₂) (h : HomologyData S₁) 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIso e h).iso = h.iso

full_name: CategoryTheory.ShortComplex.HomologyData.ofIso_left_i
code: /-- If `e : S₁ ≅ S₂` is an isomorphism of short complexes and `h₁ : HomologyData S₁`,
this is the homology data for `S₂` deduced from the isomorphism. -/
@[simps!]
noncomputable def ofIso (e : S₁ ≅ S₂) (h : HomologyData S₁) 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIso e h).left.i = CategoryTheory.CategoryStruct.comp h.left.i e.hom.τ₂

full_name: CategoryTheory.ShortComplex.HomologyData.ofIso_left_K
code: /-- If `e : S₁ ≅ S₂` is an isomorphism of short complexes and `h₁ : HomologyData S₁`,
this is the homology data for `S₂` deduced from the isomorphism. -/
@[simps!]
noncomputable def ofIso (e : S₁ ≅ S₂) (h : HomologyData S₁) 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIso e h).left.K = h.left.K

full_name: CategoryTheory.ShortComplex.HomologyData.ofIso_right_ι
code: /-- If `e : S₁ ≅ S₂` is an isomorphism of short complexes and `h₁ : HomologyData S₁`,
this is the homology data for `S₂` deduced from the isomorphism. -/
@[simps!]
noncomputable def ofIso (e : S₁ ≅ S₂) (h : HomologyData S₁) 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIso e h).right.ι = h.right.ι

full_name: CategoryTheory.ShortComplex.HomologyData.ofIso
code: /-- If `e : S₁ ≅ S₂` is an isomorphism of short complexes and `h₁ : HomologyData S₁`,
this is the homology data for `S₂` deduced from the isomorphism. -/
@[simps!]
noncomputable def ofIso (e : S₁ ≅ S₂) (h : HomologyData S₁) 
goal: S₂.HomologyData

full_name: CategoryTheory.ShortComplex.HomologyData.ofIso_right_H
code: /-- If `e : S₁ ≅ S₂` is an isomorphism of short complexes and `h₁ : HomologyData S₁`,
this is the homology data for `S₂` deduced from the isomorphism. -/
@[simps!]
noncomputable def ofIso (e : S₁ ≅ S₂) (h : HomologyData S₁) 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIso e h).right.H = h.right.H

full_name: CategoryTheory.ShortComplex.HomologyData.ofIso_right_p
code: /-- If `e : S₁ ≅ S₂` is an isomorphism of short complexes and `h₁ : HomologyData S₁`,
this is the homology data for `S₂` deduced from the isomorphism. -/
@[simps!]
noncomputable def ofIso (e : S₁ ≅ S₂) (h : HomologyData S₁) 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIso e h).right.p =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.inv e.hom.τ₂) h.right.p

full_name: CategoryTheory.ShortComplex.HomologyData.ofIso_right_Q
code: /-- If `e : S₁ ≅ S₂` is an isomorphism of short complexes and `h₁ : HomologyData S₁`,
this is the homology data for `S₂` deduced from the isomorphism. -/
@[simps!]
noncomputable def ofIso (e : S₁ ≅ S₂) (h : HomologyData S₁) 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIso e h).right.Q = h.right.Q

full_name: CategoryTheory.ShortComplex.HomologyData.ofIso_left_π
code: /-- If `e : S₁ ≅ S₂` is an isomorphism of short complexes and `h₁ : HomologyData S₁`,
this is the homology data for `S₂` deduced from the isomorphism. -/
@[simps!]
noncomputable def ofIso (e : S₁ ≅ S₂) (h : HomologyData S₁) 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIso e h).left.π = h.left.π

full_name: CategoryTheory.ShortComplex.HomologyData.op_left
code: /-- A homology data for a short complex `S` induces a homology data for `S.op`. -/
@[simps]
def op (h : S.HomologyData) : S.op.HomologyData 
goal: h.op.left = h.right.op

full_name: CategoryTheory.ShortComplex.HomologyData.op_iso
code: /-- A homology data for a short complex `S` induces a homology data for `S.op`. -/
@[simps]
def op (h : S.HomologyData) : S.op.HomologyData 
goal: h.op.iso = h.iso.op

full_name: CategoryTheory.ShortComplex.HomologyData.op
code: /-- A homology data for a short complex `S` induces a homology data for `S.op`. -/
@[simps]
def op (h : S.HomologyData) : S.op.HomologyData 
goal: S.op.HomologyData

full_name: CategoryTheory.ShortComplex.HomologyData.op_right
code: /-- A homology data for a short complex `S` induces a homology data for `S.op`. -/
@[simps]
def op (h : S.HomologyData) : S.op.HomologyData 
goal: h.op.right = h.left.op

full_name: CategoryTheory.ShortComplex.HomologyData.unop_iso
code: /-- A homology data for a short complex `S` in the opposite category
induces a homology data for `S.unop`. -/
@[simps]
def unop {S : ShortComplex Cᵒᵖ} (h : S.HomologyData) : S.unop.HomologyData 
goal: h.unop.iso = h.iso.unop

full_name: CategoryTheory.ShortComplex.HomologyData.unop_left
code: /-- A homology data for a short complex `S` in the opposite category
induces a homology data for `S.unop`. -/
@[simps]
def unop {S : ShortComplex Cᵒᵖ} (h : S.HomologyData) : S.unop.HomologyData 
goal: h.unop.left = h.right.unop

full_name: CategoryTheory.ShortComplex.HomologyData.unop
code: /-- A homology data for a short complex `S` in the opposite category
induces a homology data for `S.unop`. -/
@[simps]
def unop {S : ShortComplex Cᵒᵖ} (h : S.HomologyData) : S.unop.HomologyData 
goal: S.unop.HomologyData

full_name: CategoryTheory.ShortComplex.HomologyData.unop_right
code: /-- A homology data for a short complex `S` in the opposite category
induces a homology data for `S.unop`. -/
@[simps]
def unop {S : ShortComplex Cᵒᵖ} (h : S.HomologyData) : S.unop.HomologyData 
goal: h.unop.right = h.left.unop

full_name: CategoryTheory.ShortComplex.HasHomology
code: /-- A short complex `S` has homology when there exists a `S.HomologyData` -/
class HasHomology : Prop where
  /-- the condition that there exists a homology data -/
  condition : Nonempty S.HomologyData
goal: Prop

full_name: CategoryTheory.ShortComplex.HasHomology.condition
code: /-- A short complex `S` has homology when there exists a `S.HomologyData` -/
class HasHomology : Prop where
  /-- the condition that there exists a homology data -/
  condition : Nonempty S.HomologyData
goal: Nonempty S.HomologyData

full_name: CategoryTheory.ShortComplex.homologyData
code: /-- A chosen `S.HomologyData` for a short complex `S` that has homology -/
noncomputable def homologyData [HasHomology S] :
  S.HomologyData 
goal: S.HomologyData

full_name: CategoryTheory.ShortComplex.HasHomology.mk'
code: lemma HasHomology.mk' (h : S.HomologyData) : HasHomology S 
goal: S.HasHomology

full_name: CategoryTheory.ShortComplex.instHasHomologyOppositeOp
code: instance [HasHomology S] : HasHomology S.op 
goal: S.op.HasHomology

full_name: CategoryTheory.ShortComplex.instHasHomologyUnopOfOpposite
code: instance (S : ShortComplex Cᵒᵖ) [HasHomology S] : HasHomology S.unop 
goal: S.unop.HasHomology

full_name: CategoryTheory.ShortComplex.hasLeftHomology_of_hasHomology
code: instance hasLeftHomology_of_hasHomology [S.HasHomology] : S.HasLeftHomology 
goal: S.HasLeftHomology

full_name: CategoryTheory.ShortComplex.hasRightHomology_of_hasHomology
code: instance hasRightHomology_of_hasHomology [S.HasHomology] : S.HasRightHomology 
goal: S.HasRightHomology

full_name: CategoryTheory.ShortComplex.hasHomology_of_hasCokernel
code: instance hasHomology_of_hasCokernel {X Y : C} (f : X ⟶ Y) (Z : C) [HasCokernel f] :
    (ShortComplex.mk f (0 : Y ⟶ Z) comp_zero).HasHomology 
goal: (CategoryTheory.ShortComplex.mk f 0 ⋯).HasHomology

full_name: CategoryTheory.ShortComplex.hasHomology_of_hasKernel
code: instance hasHomology_of_hasKernel {Y Z : C} (g : Y ⟶ Z) (X : C) [HasKernel g] :
    (ShortComplex.mk (0 : X ⟶ Y) g zero_comp).HasHomology 
goal: (CategoryTheory.ShortComplex.mk 0 g ⋯).HasHomology

full_name: CategoryTheory.ShortComplex.hasHomology_of_zeros
code: instance hasHomology_of_zeros (X Y Z : C) :
    (ShortComplex.mk (0 : X ⟶ Y) (0 : Y ⟶ Z) zero_comp).HasHomology 
goal: (CategoryTheory.ShortComplex.mk 0 0 ⋯).HasHomology

full_name: CategoryTheory.ShortComplex.hasHomology_of_epi_of_isIso_of_mono
code: lemma hasHomology_of_epi_of_isIso_of_mono (φ : S₁ ⟶ S₂) [HasHomology S₁]
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] : HasHomology S₂ 
goal: S₂.HasHomology

full_name: CategoryTheory.ShortComplex.hasHomology_of_epi_of_isIso_of_mono'
code: lemma hasHomology_of_epi_of_isIso_of_mono' (φ : S₁ ⟶ S₂) [HasHomology S₂]
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] : HasHomology S₁ 
goal: S₁.HasHomology

full_name: CategoryTheory.ShortComplex.hasHomology_of_iso
code: lemma hasHomology_of_iso (e : S₁ ≅ S₂) [HasHomology S₁] : HasHomology S₂ 
goal: S₂.HasHomology

full_name: CategoryTheory.ShortComplex.HomologyMapData.id_left
code: /-- The homology map data associated to the identity morphism of a short complex. -/
@[simps]
def id (h : S.HomologyData) : HomologyMapData (𝟙 S) h h 
goal: (CategoryTheory.ShortComplex.HomologyMapData.id h).left = CategoryTheory.ShortComplex.LeftHomologyMapData.id h.left

full_name: CategoryTheory.ShortComplex.HomologyMapData.id_right
code: /-- The homology map data associated to the identity morphism of a short complex. -/
@[simps]
def id (h : S.HomologyData) : HomologyMapData (𝟙 S) h h 
goal: (CategoryTheory.ShortComplex.HomologyMapData.id h).right = CategoryTheory.ShortComplex.RightHomologyMapData.id h.right

full_name: CategoryTheory.ShortComplex.HomologyMapData.id
code: /-- The homology map data associated to the identity morphism of a short complex. -/
@[simps]
def id (h : S.HomologyData) : HomologyMapData (𝟙 S) h h 
goal: CategoryTheory.ShortComplex.HomologyMapData (CategoryTheory.CategoryStruct.id S) h h

full_name: CategoryTheory.ShortComplex.HomologyMapData.zero_left
code: /-- The homology map data associated to the zero morphism between two short complexes. -/
@[simps]
def zero (h₁ : S₁.HomologyData) (h₂ : S₂.HomologyData) :
    HomologyMapData 0 h₁ h₂ 
goal: (CategoryTheory.ShortComplex.HomologyMapData.zero h₁ h₂).left =
  CategoryTheory.ShortComplex.LeftHomologyMapData.zero h₁.left h₂.left

full_name: CategoryTheory.ShortComplex.HomologyMapData.zero
code: /-- The homology map data associated to the zero morphism between two short complexes. -/
@[simps]
def zero (h₁ : S₁.HomologyData) (h₂ : S₂.HomologyData) :
    HomologyMapData 0 h₁ h₂ 
goal: CategoryTheory.ShortComplex.HomologyMapData 0 h₁ h₂

full_name: CategoryTheory.ShortComplex.HomologyMapData.zero_right
code: /-- The homology map data associated to the zero morphism between two short complexes. -/
@[simps]
def zero (h₁ : S₁.HomologyData) (h₂ : S₂.HomologyData) :
    HomologyMapData 0 h₁ h₂ 
goal: (CategoryTheory.ShortComplex.HomologyMapData.zero h₁ h₂).right =
  CategoryTheory.ShortComplex.RightHomologyMapData.zero h₁.right h₂.right

full_name: CategoryTheory.ShortComplex.HomologyMapData.comp_left
code: /-- The composition of homology map data. -/
@[simps]
def comp {φ : S₁ ⟶ S₂} {φ' : S₂ ⟶ S₃} {h₁ : S₁.HomologyData}
    {h₂ : S₂.HomologyData} {h₃ : S₃.HomologyData}
    (ψ : HomologyMapData φ h₁ h₂) (ψ' : HomologyMapData φ' h₂ h₃) :
    HomologyMapData (φ ≫ φ') h₁ h₃ 
goal: (ψ.comp ψ').left = ψ.left.comp ψ'.left

full_name: CategoryTheory.ShortComplex.HomologyMapData.comp
code: /-- The composition of homology map data. -/
@[simps]
def comp {φ : S₁ ⟶ S₂} {φ' : S₂ ⟶ S₃} {h₁ : S₁.HomologyData}
    {h₂ : S₂.HomologyData} {h₃ : S₃.HomologyData}
    (ψ : HomologyMapData φ h₁ h₂) (ψ' : HomologyMapData φ' h₂ h₃) :
    HomologyMapData (φ ≫ φ') h₁ h₃ 
goal: CategoryTheory.ShortComplex.HomologyMapData (CategoryTheory.CategoryStruct.comp φ φ') h₁ h₃

full_name: CategoryTheory.ShortComplex.HomologyMapData.comp_right
code: /-- The composition of homology map data. -/
@[simps]
def comp {φ : S₁ ⟶ S₂} {φ' : S₂ ⟶ S₃} {h₁ : S₁.HomologyData}
    {h₂ : S₂.HomologyData} {h₃ : S₃.HomologyData}
    (ψ : HomologyMapData φ h₁ h₂) (ψ' : HomologyMapData φ' h₂ h₃) :
    HomologyMapData (φ ≫ φ') h₁ h₃ 
goal: (ψ.comp ψ').right = ψ.right.comp ψ'.right

full_name: CategoryTheory.ShortComplex.HomologyMapData.op_right
code: /-- A homology map data for a morphism of short complexes induces
a homology map data in the opposite category. -/
@[simps]
def op {φ : S₁ ⟶ S₂} {h₁ : S₁.HomologyData} {h₂ : S₂.HomologyData}
    (ψ : HomologyMapData φ h₁ h₂) :
    HomologyMapData (opMap φ) h₂.op h₁.op 
goal: ψ.op.right = ψ.left.op

full_name: CategoryTheory.ShortComplex.HomologyMapData.op
code: /-- A homology map data for a morphism of short complexes induces
a homology map data in the opposite category. -/
@[simps]
def op {φ : S₁ ⟶ S₂} {h₁ : S₁.HomologyData} {h₂ : S₂.HomologyData}
    (ψ : HomologyMapData φ h₁ h₂) :
    HomologyMapData (opMap φ) h₂.op h₁.op 
goal: CategoryTheory.ShortComplex.HomologyMapData (CategoryTheory.ShortComplex.opMap φ) h₂.op h₁.op

full_name: CategoryTheory.ShortComplex.HomologyMapData.op_left
code: /-- A homology map data for a morphism of short complexes induces
a homology map data in the opposite category. -/
@[simps]
def op {φ : S₁ ⟶ S₂} {h₁ : S₁.HomologyData} {h₂ : S₂.HomologyData}
    (ψ : HomologyMapData φ h₁ h₂) :
    HomologyMapData (opMap φ) h₂.op h₁.op 
goal: ψ.op.left = ψ.right.op

full_name: CategoryTheory.ShortComplex.HomologyMapData.unop
code: /-- A homology map data for a morphism of short complexes in the opposite category
induces a homology map data in the original category. -/
@[simps]
def unop {S₁ S₂ : ShortComplex Cᵒᵖ} {φ : S₁ ⟶ S₂}
    {h₁ : S₁.HomologyData} {h₂ : S₂.HomologyData}
    (ψ : HomologyMapData φ h₁ h₂) :
    HomologyMapData (unopMap φ) h₂.unop h₁.unop 
goal: CategoryTheory.ShortComplex.HomologyMapData (CategoryTheory.ShortComplex.unopMap φ) h₂.unop h₁.unop

full_name: CategoryTheory.ShortComplex.HomologyMapData.unop_right
code: /-- A homology map data for a morphism of short complexes in the opposite category
induces a homology map data in the original category. -/
@[simps]
def unop {S₁ S₂ : ShortComplex Cᵒᵖ} {φ : S₁ ⟶ S₂}
    {h₁ : S₁.HomologyData} {h₂ : S₂.HomologyData}
    (ψ : HomologyMapData φ h₁ h₂) :
    HomologyMapData (unopMap φ) h₂.unop h₁.unop 
goal: ψ.unop.right = ψ.left.unop

full_name: CategoryTheory.ShortComplex.HomologyMapData.unop_left
code: /-- A homology map data for a morphism of short complexes in the opposite category
induces a homology map data in the original category. -/
@[simps]
def unop {S₁ S₂ : ShortComplex Cᵒᵖ} {φ : S₁ ⟶ S₂}
    {h₁ : S₁.HomologyData} {h₂ : S₂.HomologyData}
    (ψ : HomologyMapData φ h₁ h₂) :
    HomologyMapData (unopMap φ) h₂.unop h₁.unop 
goal: ψ.unop.left = ψ.right.unop

full_name: CategoryTheory.ShortComplex.HomologyMapData.ofZeros_right
code: /-- When `S₁.f`, `S₁.g`, `S₂.f` and `S₂.g` are all zero, the action on homology of a
morphism `φ : S₁ ⟶ S₂` is given by the action `φ.τ₂` on the middle objects. -/
@[simps]
def ofZeros (φ : S₁ ⟶ S₂) (hf₁ : S₁.f = 0) (hg₁ : S₁.g = 0) (hf₂ : S₂.f = 0) (hg₂ : S₂.g = 0) :
    HomologyMapData φ (HomologyData.ofZeros S₁ hf₁ hg₁) (HomologyData.ofZeros S₂ hf₂ hg₂) 
goal: (CategoryTheory.ShortComplex.HomologyMapData.ofZeros φ hf₁ hg₁ hf₂ hg₂).right =
  CategoryTheory.ShortComplex.RightHomologyMapData.ofZeros φ hf₁ hg₁ hf₂ hg₂

full_name: CategoryTheory.ShortComplex.HomologyMapData.ofZeros_left
code: /-- When `S₁.f`, `S₁.g`, `S₂.f` and `S₂.g` are all zero, the action on homology of a
morphism `φ : S₁ ⟶ S₂` is given by the action `φ.τ₂` on the middle objects. -/
@[simps]
def ofZeros (φ : S₁ ⟶ S₂) (hf₁ : S₁.f = 0) (hg₁ : S₁.g = 0) (hf₂ : S₂.f = 0) (hg₂ : S₂.g = 0) :
    HomologyMapData φ (HomologyData.ofZeros S₁ hf₁ hg₁) (HomologyData.ofZeros S₂ hf₂ hg₂) 
goal: (CategoryTheory.ShortComplex.HomologyMapData.ofZeros φ hf₁ hg₁ hf₂ hg₂).left =
  CategoryTheory.ShortComplex.LeftHomologyMapData.ofZeros φ hf₁ hg₁ hf₂ hg₂

full_name: CategoryTheory.ShortComplex.HomologyMapData.ofZeros
code: /-- When `S₁.f`, `S₁.g`, `S₂.f` and `S₂.g` are all zero, the action on homology of a
morphism `φ : S₁ ⟶ S₂` is given by the action `φ.τ₂` on the middle objects. -/
@[simps]
def ofZeros (φ : S₁ ⟶ S₂) (hf₁ : S₁.f = 0) (hg₁ : S₁.g = 0) (hf₂ : S₂.f = 0) (hg₂ : S₂.g = 0) :
    HomologyMapData φ (HomologyData.ofZeros S₁ hf₁ hg₁) (HomologyData.ofZeros S₂ hf₂ hg₂) 
goal: CategoryTheory.ShortComplex.HomologyMapData φ (CategoryTheory.ShortComplex.HomologyData.ofZeros S₁ hf₁ hg₁)
  (CategoryTheory.ShortComplex.HomologyData.ofZeros S₂ hf₂ hg₂)

full_name: CategoryTheory.ShortComplex.HomologyMapData.ofIsColimitCokernelCofork_left
code: /-- When `S₁.g` and `S₂.g` are zero and we have chosen colimit cokernel coforks `c₁` and `c₂`
for `S₁.f` and `S₂.f` respectively, the action on homology of a morphism `φ : S₁ ⟶ S₂` of
short complexes is given by the unique morphism `f : c₁.pt ⟶ c₂.pt` such that
`φ.τ₂ ≫ c₂.π = c₁.π ≫ f`. -/
@[simps]
def ofIsColimitCokernelCofork (φ : S₁ ⟶ S₂)
    (hg₁ : S₁.g = 0) (c₁ : CokernelCofork S₁.f) (hc₁ : IsColimit c₁)
    (hg₂ : S₂.g = 0) (c₂ : CokernelCofork S₂.f) (hc₂ : IsColimit c₂) (f : c₁.pt ⟶ c₂.pt)
    (comm : φ.τ₂ ≫ c₂.π = c₁.π ≫ f) :
    HomologyMapData φ (HomologyData.ofIsColimitCokernelCofork S₁ hg₁ c₁ hc₁)
      (HomologyData.ofIsColimitCokernelCofork S₂ hg₂ c₂ hc₂) 
goal: (CategoryTheory.ShortComplex.HomologyMapData.ofIsColimitCokernelCofork φ hg₁ c₁ hc₁ hg₂ c₂ hc₂ f comm).left =
  CategoryTheory.ShortComplex.LeftHomologyMapData.ofIsColimitCokernelCofork φ hg₁ c₁ hc₁ hg₂ c₂ hc₂ f comm

full_name: CategoryTheory.ShortComplex.HomologyMapData.ofIsColimitCokernelCofork
code: /-- When `S₁.g` and `S₂.g` are zero and we have chosen colimit cokernel coforks `c₁` and `c₂`
for `S₁.f` and `S₂.f` respectively, the action on homology of a morphism `φ : S₁ ⟶ S₂` of
short complexes is given by the unique morphism `f : c₁.pt ⟶ c₂.pt` such that
`φ.τ₂ ≫ c₂.π = c₁.π ≫ f`. -/
@[simps]
def ofIsColimitCokernelCofork (φ : S₁ ⟶ S₂)
    (hg₁ : S₁.g = 0) (c₁ : CokernelCofork S₁.f) (hc₁ : IsColimit c₁)
    (hg₂ : S₂.g = 0) (c₂ : CokernelCofork S₂.f) (hc₂ : IsColimit c₂) (f : c₁.pt ⟶ c₂.pt)
    (comm : φ.τ₂ ≫ c₂.π = c₁.π ≫ f) :
    HomologyMapData φ (HomologyData.ofIsColimitCokernelCofork S₁ hg₁ c₁ hc₁)
      (HomologyData.ofIsColimitCokernelCofork S₂ hg₂ c₂ hc₂) 
goal: CategoryTheory.ShortComplex.HomologyMapData φ
  (CategoryTheory.ShortComplex.HomologyData.ofIsColimitCokernelCofork S₁ hg₁ c₁ hc₁)
  (CategoryTheory.ShortComplex.HomologyData.ofIsColimitCokernelCofork S₂ hg₂ c₂ hc₂)

full_name: CategoryTheory.ShortComplex.HomologyMapData.ofIsColimitCokernelCofork_right
code: /-- When `S₁.g` and `S₂.g` are zero and we have chosen colimit cokernel coforks `c₁` and `c₂`
for `S₁.f` and `S₂.f` respectively, the action on homology of a morphism `φ : S₁ ⟶ S₂` of
short complexes is given by the unique morphism `f : c₁.pt ⟶ c₂.pt` such that
`φ.τ₂ ≫ c₂.π = c₁.π ≫ f`. -/
@[simps]
def ofIsColimitCokernelCofork (φ : S₁ ⟶ S₂)
    (hg₁ : S₁.g = 0) (c₁ : CokernelCofork S₁.f) (hc₁ : IsColimit c₁)
    (hg₂ : S₂.g = 0) (c₂ : CokernelCofork S₂.f) (hc₂ : IsColimit c₂) (f : c₁.pt ⟶ c₂.pt)
    (comm : φ.τ₂ ≫ c₂.π = c₁.π ≫ f) :
    HomologyMapData φ (HomologyData.ofIsColimitCokernelCofork S₁ hg₁ c₁ hc₁)
      (HomologyData.ofIsColimitCokernelCofork S₂ hg₂ c₂ hc₂) 
goal: (CategoryTheory.ShortComplex.HomologyMapData.ofIsColimitCokernelCofork φ hg₁ c₁ hc₁ hg₂ c₂ hc₂ f comm).right =
  CategoryTheory.ShortComplex.RightHomologyMapData.ofIsColimitCokernelCofork φ hg₁ c₁ hc₁ hg₂ c₂ hc₂ f comm

full_name: CategoryTheory.ShortComplex.HomologyMapData.ofIsLimitKernelFork_right
code: /-- When `S₁.f` and `S₂.f` are zero and we have chosen limit kernel forks `c₁` and `c₂`
for `S₁.g` and `S₂.g` respectively, the action on homology of a morphism `φ : S₁ ⟶ S₂` of
short complexes is given by the unique morphism `f : c₁.pt ⟶ c₂.pt` such that
`c₁.ι ≫ φ.τ₂ = f ≫ c₂.ι`. -/
@[simps]
def ofIsLimitKernelFork (φ : S₁ ⟶ S₂)
    (hf₁ : S₁.f = 0) (c₁ : KernelFork S₁.g) (hc₁ : IsLimit c₁)
    (hf₂ : S₂.f = 0) (c₂ : KernelFork S₂.g) (hc₂ : IsLimit c₂) (f : c₁.pt ⟶ c₂.pt)
    (comm : c₁.ι ≫ φ.τ₂ = f ≫ c₂.ι) :
    HomologyMapData φ (HomologyData.ofIsLimitKernelFork S₁ hf₁ c₁ hc₁)
      (HomologyData.ofIsLimitKernelFork S₂ hf₂ c₂ hc₂) 
goal: (CategoryTheory.ShortComplex.HomologyMapData.ofIsLimitKernelFork φ hf₁ c₁ hc₁ hf₂ c₂ hc₂ f comm).right =
  CategoryTheory.ShortComplex.RightHomologyMapData.ofIsLimitKernelFork φ hf₁ c₁ hc₁ hf₂ c₂ hc₂ f comm

full_name: CategoryTheory.ShortComplex.HomologyMapData.ofIsLimitKernelFork_left
code: /-- When `S₁.f` and `S₂.f` are zero and we have chosen limit kernel forks `c₁` and `c₂`
for `S₁.g` and `S₂.g` respectively, the action on homology of a morphism `φ : S₁ ⟶ S₂` of
short complexes is given by the unique morphism `f : c₁.pt ⟶ c₂.pt` such that
`c₁.ι ≫ φ.τ₂ = f ≫ c₂.ι`. -/
@[simps]
def ofIsLimitKernelFork (φ : S₁ ⟶ S₂)
    (hf₁ : S₁.f = 0) (c₁ : KernelFork S₁.g) (hc₁ : IsLimit c₁)
    (hf₂ : S₂.f = 0) (c₂ : KernelFork S₂.g) (hc₂ : IsLimit c₂) (f : c₁.pt ⟶ c₂.pt)
    (comm : c₁.ι ≫ φ.τ₂ = f ≫ c₂.ι) :
    HomologyMapData φ (HomologyData.ofIsLimitKernelFork S₁ hf₁ c₁ hc₁)
      (HomologyData.ofIsLimitKernelFork S₂ hf₂ c₂ hc₂) 
goal: (CategoryTheory.ShortComplex.HomologyMapData.ofIsLimitKernelFork φ hf₁ c₁ hc₁ hf₂ c₂ hc₂ f comm).left =
  CategoryTheory.ShortComplex.LeftHomologyMapData.ofIsLimitKernelFork φ hf₁ c₁ hc₁ hf₂ c₂ hc₂ f comm

full_name: CategoryTheory.ShortComplex.HomologyMapData.ofIsLimitKernelFork
code: /-- When `S₁.f` and `S₂.f` are zero and we have chosen limit kernel forks `c₁` and `c₂`
for `S₁.g` and `S₂.g` respectively, the action on homology of a morphism `φ : S₁ ⟶ S₂` of
short complexes is given by the unique morphism `f : c₁.pt ⟶ c₂.pt` such that
`c₁.ι ≫ φ.τ₂ = f ≫ c₂.ι`. -/
@[simps]
def ofIsLimitKernelFork (φ : S₁ ⟶ S₂)
    (hf₁ : S₁.f = 0) (c₁ : KernelFork S₁.g) (hc₁ : IsLimit c₁)
    (hf₂ : S₂.f = 0) (c₂ : KernelFork S₂.g) (hc₂ : IsLimit c₂) (f : c₁.pt ⟶ c₂.pt)
    (comm : c₁.ι ≫ φ.τ₂ = f ≫ c₂.ι) :
    HomologyMapData φ (HomologyData.ofIsLimitKernelFork S₁ hf₁ c₁ hc₁)
      (HomologyData.ofIsLimitKernelFork S₂ hf₂ c₂ hc₂) 
goal: CategoryTheory.ShortComplex.HomologyMapData φ
  (CategoryTheory.ShortComplex.HomologyData.ofIsLimitKernelFork S₁ hf₁ c₁ hc₁)
  (CategoryTheory.ShortComplex.HomologyData.ofIsLimitKernelFork S₂ hf₂ c₂ hc₂)

full_name: CategoryTheory.ShortComplex.HomologyMapData.compatibilityOfZerosOfIsColimitCokernelCofork
code: /-- When both maps `S.f` and `S.g` of a short complex `S` are zero, this is the homology map
data (for the identity of `S`) which relates the homology data `ofZeros` and
`ofIsColimitCokernelCofork`. -/
def compatibilityOfZerosOfIsColimitCokernelCofork (hf : S.f = 0) (hg : S.g = 0)
    (c : CokernelCofork S.f) (hc : IsColimit c) :
    HomologyMapData (𝟙 S) (HomologyData.ofZeros S hf hg)
      (HomologyData.ofIsColimitCokernelCofork S hg c hc) 
goal: CategoryTheory.ShortComplex.HomologyMapData (CategoryTheory.CategoryStruct.id S)
  (CategoryTheory.ShortComplex.HomologyData.ofZeros S hf hg)
  (CategoryTheory.ShortComplex.HomologyData.ofIsColimitCokernelCofork S hg c hc)

full_name: CategoryTheory.ShortComplex.HomologyMapData.compatibilityOfZerosOfIsLimitKernelFork_right
code: /-- When both maps `S.f` and `S.g` of a short complex `S` are zero, this is the homology map
data (for the identity of `S`) which relates the homology data
`HomologyData.ofIsLimitKernelFork` and `ofZeros` . -/
@[simps]
def compatibilityOfZerosOfIsLimitKernelFork (hf : S.f = 0) (hg : S.g = 0)
    (c : KernelFork S.g) (hc : IsLimit c) :
    HomologyMapData (𝟙 S)
      (HomologyData.ofIsLimitKernelFork S hf c hc)
      (HomologyData.ofZeros S hf hg) 
goal: (CategoryTheory.ShortComplex.HomologyMapData.compatibilityOfZerosOfIsLimitKernelFork hf hg c hc).right =
  CategoryTheory.ShortComplex.RightHomologyMapData.compatibilityOfZerosOfIsLimitKernelFork S hf hg c hc

full_name: CategoryTheory.ShortComplex.HomologyMapData.compatibilityOfZerosOfIsLimitKernelFork
code: /-- When both maps `S.f` and `S.g` of a short complex `S` are zero, this is the homology map
data (for the identity of `S`) which relates the homology data
`HomologyData.ofIsLimitKernelFork` and `ofZeros` . -/
@[simps]
def compatibilityOfZerosOfIsLimitKernelFork (hf : S.f = 0) (hg : S.g = 0)
    (c : KernelFork S.g) (hc : IsLimit c) :
    HomologyMapData (𝟙 S)
      (HomologyData.ofIsLimitKernelFork S hf c hc)
      (HomologyData.ofZeros S hf hg) 
goal: CategoryTheory.ShortComplex.HomologyMapData (CategoryTheory.CategoryStruct.id S)
  (CategoryTheory.ShortComplex.HomologyData.ofIsLimitKernelFork S hf c hc)
  (CategoryTheory.ShortComplex.HomologyData.ofZeros S hf hg)

full_name: CategoryTheory.ShortComplex.HomologyMapData.compatibilityOfZerosOfIsLimitKernelFork_left
code: /-- When both maps `S.f` and `S.g` of a short complex `S` are zero, this is the homology map
data (for the identity of `S`) which relates the homology data
`HomologyData.ofIsLimitKernelFork` and `ofZeros` . -/
@[simps]
def compatibilityOfZerosOfIsLimitKernelFork (hf : S.f = 0) (hg : S.g = 0)
    (c : KernelFork S.g) (hc : IsLimit c) :
    HomologyMapData (𝟙 S)
      (HomologyData.ofIsLimitKernelFork S hf c hc)
      (HomologyData.ofZeros S hf hg) 
goal: (CategoryTheory.ShortComplex.HomologyMapData.compatibilityOfZerosOfIsLimitKernelFork hf hg c hc).left =
  CategoryTheory.ShortComplex.LeftHomologyMapData.compatibilityOfZerosOfIsLimitKernelFork S hf hg c hc

full_name: CategoryTheory.ShortComplex.HomologyMapData.ofEpiOfIsIsoOfMono
code: /-- This homology map data expresses compatibilities of the homology data
constructed by `HomologyData.ofEpiOfIsIsoOfMono` -/
noncomputable def ofEpiOfIsIsoOfMono (φ : S₁ ⟶ S₂) (h : HomologyData S₁)
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    HomologyMapData φ h (HomologyData.ofEpiOfIsIsoOfMono φ h) 
goal: CategoryTheory.ShortComplex.HomologyMapData φ h (CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono φ h)

full_name: CategoryTheory.ShortComplex.HomologyMapData.ofEpiOfIsIsoOfMono'
code: /-- This homology map data expresses compatibilities of the homology data
constructed by `HomologyData.ofEpiOfIsIsoOfMono'` -/
noncomputable def ofEpiOfIsIsoOfMono' (φ : S₁ ⟶ S₂) (h : HomologyData S₂)
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    HomologyMapData φ (HomologyData.ofEpiOfIsIsoOfMono' φ h) h 
goal: CategoryTheory.ShortComplex.HomologyMapData φ (CategoryTheory.ShortComplex.HomologyData.ofEpiOfIsIsoOfMono' φ h) h

full_name: CategoryTheory.ShortComplex.homology
code: /-- The homology of a short complex is the `left.H` field of a chosen homology data. -/
noncomputable def homology [HasHomology S] : C 
goal: C

full_name: CategoryTheory.ShortComplex.leftHomologyIso
code: /-- When a short complex has homology, this is the canonical isomorphism
`S.leftHomology ≅ S.homology`. -/
noncomputable def leftHomologyIso [S.HasHomology] : S.leftHomology ≅ S.homology 
goal: S.leftHomology ≅ S.homology

full_name: CategoryTheory.ShortComplex.rightHomologyIso
code: /-- When a short complex has homology, this is the canonical isomorphism
`S.rightHomology ≅ S.homology`. -/
noncomputable def rightHomologyIso [S.HasHomology] : S.rightHomology ≅ S.homology 
goal: S.rightHomology ≅ S.homology

full_name: CategoryTheory.ShortComplex.LeftHomologyData.homologyIso
code: /-- When a short complex has homology, its homology can be computed using
any left homology data. -/
noncomputable def LeftHomologyData.homologyIso (h : S.LeftHomologyData) [S.HasHomology] :
    S.homology ≅ h.H 
goal: S.homology ≅ h.H

full_name: CategoryTheory.ShortComplex.RightHomologyData.homologyIso
code: /-- When a short complex has homology, its homology can be computed using
any right homology data. -/
noncomputable def RightHomologyData.homologyIso (h : S.RightHomologyData) [S.HasHomology] :
    S.homology ≅ h.H 
goal: S.homology ≅ h.H

full_name: CategoryTheory.ShortComplex.LeftHomologyData.homologyIso_leftHomologyData
code: @[simp]
lemma LeftHomologyData.homologyIso_leftHomologyData [S.HasHomology] :
    S.leftHomologyData.homologyIso = S.leftHomologyIso.symm 
goal: S.leftHomologyData.homologyIso = S.leftHomologyIso.symm

full_name: CategoryTheory.ShortComplex.RightHomologyData.homologyIso_rightHomologyData
code: @[simp]
lemma RightHomologyData.homologyIso_rightHomologyData [S.HasHomology] :
    S.rightHomologyData.homologyIso = S.rightHomologyIso.symm 
goal: S.rightHomologyData.homologyIso = S.rightHomologyIso.symm

full_name: CategoryTheory.ShortComplex.homologyMap'
code: /-- Given a morphism `φ : S₁ ⟶ S₂` of short complexes and homology data `h₁` and `h₂`
for `S₁` and `S₂` respectively, this is the induced homology map `h₁.left.H ⟶ h₁.left.H`. -/
def homologyMap' (φ : S₁ ⟶ S₂) (h₁ : S₁.HomologyData) (h₂ : S₂.HomologyData) :
    h₁.left.H ⟶ h₂.left.H 
goal: h₁.left.H ⟶ h₂.left.H

full_name: CategoryTheory.ShortComplex.homologyMap
code: /-- The homology map `S₁.homology ⟶ S₂.homology` induced by a morphism
`S₁ ⟶ S₂` of short complexes. -/
noncomputable def homologyMap (φ : S₁ ⟶ S₂) [HasHomology S₁] [HasHomology S₂] :
    S₁.homology ⟶ S₂.homology 
goal: S₁.homology ⟶ S₂.homology

full_name: CategoryTheory.ShortComplex.HomologyMapData.homologyMap'_eq
code: lemma homologyMap'_eq : homologyMap' φ h₁ h₂ = γ.left.φH 
goal: CategoryTheory.ShortComplex.homologyMap' φ h₁ h₂ = γ.left.φH

full_name: CategoryTheory.ShortComplex.HomologyMapData.cyclesMap'_eq
code: lemma cyclesMap'_eq : cyclesMap' φ h₁.left h₂.left = γ.left.φK 
goal: CategoryTheory.ShortComplex.cyclesMap' φ h₁.left h₂.left = γ.left.φK

full_name: CategoryTheory.ShortComplex.HomologyMapData.opcyclesMap'_eq
code: lemma opcyclesMap'_eq : opcyclesMap' φ h₁.right h₂.right = γ.right.φQ 
goal: CategoryTheory.ShortComplex.opcyclesMap' φ h₁.right h₂.right = γ.right.φQ

full_name: CategoryTheory.ShortComplex.LeftHomologyMapData.homologyMap_eq
code: lemma homologyMap_eq :
    homologyMap φ = h₁.homologyIso.hom ≫ γ.φH ≫ h₂.homologyIso.inv 
goal: CategoryTheory.ShortComplex.homologyMap φ =
  CategoryTheory.CategoryStruct.comp h₁.homologyIso.hom (CategoryTheory.CategoryStruct.comp γ.φH h₂.homologyIso.inv)

full_name: CategoryTheory.ShortComplex.LeftHomologyMapData.homologyMap_comm
code: lemma homologyMap_comm :
    homologyMap φ ≫ h₂.homologyIso.hom = h₁.homologyIso.hom ≫ γ.φH 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.homologyMap φ) h₂.homologyIso.hom =
  CategoryTheory.CategoryStruct.comp h₁.homologyIso.hom γ.φH

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.homologyMap_eq
code: lemma homologyMap_eq :
    homologyMap φ = h₁.homologyIso.hom ≫ γ.φH ≫ h₂.homologyIso.inv 
goal: CategoryTheory.ShortComplex.homologyMap φ =
  CategoryTheory.CategoryStruct.comp h₁.homologyIso.hom (CategoryTheory.CategoryStruct.comp γ.φH h₂.homologyIso.inv)

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.homologyMap_comm
code: lemma homologyMap_comm :
    homologyMap φ ≫ h₂.homologyIso.hom = h₁.homologyIso.hom ≫ γ.φH 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.homologyMap φ) h₂.homologyIso.hom =
  CategoryTheory.CategoryStruct.comp h₁.homologyIso.hom γ.φH

full_name: CategoryTheory.ShortComplex.homologyMap'_id
code: @[simp]
lemma homologyMap'_id (h : S.HomologyData) :
    homologyMap' (𝟙 S) h h = 𝟙 _ 
goal: CategoryTheory.ShortComplex.homologyMap' (CategoryTheory.CategoryStruct.id S) h h =
  CategoryTheory.CategoryStruct.id h.left.H

full_name: CategoryTheory.ShortComplex.homologyMap_id
code: @[simp]
lemma homologyMap_id [HasHomology S] :
    homologyMap (𝟙 S) = 𝟙 _ 
goal: CategoryTheory.ShortComplex.homologyMap (CategoryTheory.CategoryStruct.id S) =
  CategoryTheory.CategoryStruct.id S.homology

full_name: CategoryTheory.ShortComplex.homologyMap'_zero
code: @[simp]
lemma homologyMap'_zero (h₁ : S₁.HomologyData) (h₂ : S₂.HomologyData) :
    homologyMap' 0 h₁ h₂ = 0 
goal: CategoryTheory.ShortComplex.homologyMap' 0 h₁ h₂ = 0

full_name: CategoryTheory.ShortComplex.homologyMap_zero
code: @[simp]
lemma homologyMap_zero [S₁.HasHomology] [S₂.HasHomology] :
    homologyMap (0 : S₁ ⟶ S₂) = 0 
goal: CategoryTheory.ShortComplex.homologyMap 0 = 0

full_name: CategoryTheory.ShortComplex.homologyMap'_comp
code: lemma homologyMap'_comp (φ₁ : S₁ ⟶ S₂) (φ₂ : S₂ ⟶ S₃)
    (h₁ : S₁.HomologyData) (h₂ : S₂.HomologyData) (h₃ : S₃.HomologyData) :
    homologyMap' (φ₁ ≫ φ₂) h₁ h₃ = homologyMap' φ₁ h₁ h₂ ≫
      homologyMap' φ₂ h₂ h₃ 
goal: CategoryTheory.ShortComplex.homologyMap' (CategoryTheory.CategoryStruct.comp φ₁ φ₂) h₁ h₃ =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.homologyMap' φ₁ h₁ h₂)
    (CategoryTheory.ShortComplex.homologyMap' φ₂ h₂ h₃)

full_name: CategoryTheory.ShortComplex.homologyMap_comp
code: @[simp]
lemma homologyMap_comp [HasHomology S₁] [HasHomology S₂] [HasHomology S₃]
    (φ₁ : S₁ ⟶ S₂) (φ₂ : S₂ ⟶ S₃) :
    homologyMap (φ₁ ≫ φ₂) = homologyMap φ₁ ≫ homologyMap φ₂ 
goal: CategoryTheory.ShortComplex.homologyMap (CategoryTheory.CategoryStruct.comp φ₁ φ₂) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.homologyMap φ₁)
    (CategoryTheory.ShortComplex.homologyMap φ₂)

full_name: CategoryTheory.ShortComplex.homologyMapIso'
code: /-- Given an isomorphism `S₁ ≅ S₂` of short complexes and homology data `h₁` and `h₂`
for `S₁` and `S₂` respectively, this is the induced homology isomorphism `h₁.left.H ≅ h₁.left.H`. -/
@[simps]
def homologyMapIso' (e : S₁ ≅ S₂) (h₁ : S₁.HomologyData)
    (h₂ : S₂.HomologyData) : h₁.left.H ≅ h₂.left.H 
goal: h₁.left.H ≅ h₂.left.H

full_name: CategoryTheory.ShortComplex.homologyMapIso'_hom
code: /-- Given an isomorphism `S₁ ≅ S₂` of short complexes and homology data `h₁` and `h₂`
for `S₁` and `S₂` respectively, this is the induced homology isomorphism `h₁.left.H ≅ h₁.left.H`. -/
@[simps]
def homologyMapIso' (e : S₁ ≅ S₂) (h₁ : S₁.HomologyData)
    (h₂ : S₂.HomologyData) : h₁.left.H ≅ h₂.left.H 
goal: (CategoryTheory.ShortComplex.homologyMapIso' e h₁ h₂).hom = CategoryTheory.ShortComplex.homologyMap' e.hom h₁ h₂

full_name: CategoryTheory.ShortComplex.homologyMapIso'_inv
code: /-- Given an isomorphism `S₁ ≅ S₂` of short complexes and homology data `h₁` and `h₂`
for `S₁` and `S₂` respectively, this is the induced homology isomorphism `h₁.left.H ≅ h₁.left.H`. -/
@[simps]
def homologyMapIso' (e : S₁ ≅ S₂) (h₁ : S₁.HomologyData)
    (h₂ : S₂.HomologyData) : h₁.left.H ≅ h₂.left.H 
goal: (CategoryTheory.ShortComplex.homologyMapIso' e h₁ h₂).inv = CategoryTheory.ShortComplex.homologyMap' e.inv h₂ h₁

full_name: CategoryTheory.ShortComplex.isIso_homologyMap'_of_isIso
code: instance isIso_homologyMap'_of_isIso (φ : S₁ ⟶ S₂) [IsIso φ]
    (h₁ : S₁.HomologyData) (h₂ : S₂.HomologyData) :
    IsIso (homologyMap' φ h₁ h₂) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.homologyMap' φ h₁ h₂)

full_name: CategoryTheory.ShortComplex.homologyMapIso_hom
code: /-- The homology isomorphism `S₁.homology ⟶ S₂.homology` induced by an isomorphism
`S₁ ≅ S₂` of short complexes. -/
@[simps]
noncomputable def homologyMapIso (e : S₁ ≅ S₂) [S₁.HasHomology]
    [S₂.HasHomology] : S₁.homology ≅ S₂.homology 
goal: (CategoryTheory.ShortComplex.homologyMapIso e).hom = CategoryTheory.ShortComplex.homologyMap e.hom

full_name: CategoryTheory.ShortComplex.homologyMapIso_inv
code: /-- The homology isomorphism `S₁.homology ⟶ S₂.homology` induced by an isomorphism
`S₁ ≅ S₂` of short complexes. -/
@[simps]
noncomputable def homologyMapIso (e : S₁ ≅ S₂) [S₁.HasHomology]
    [S₂.HasHomology] : S₁.homology ≅ S₂.homology 
goal: (CategoryTheory.ShortComplex.homologyMapIso e).inv = CategoryTheory.ShortComplex.homologyMap e.inv

full_name: CategoryTheory.ShortComplex.homologyMapIso
code: /-- The homology isomorphism `S₁.homology ⟶ S₂.homology` induced by an isomorphism
`S₁ ≅ S₂` of short complexes. -/
@[simps]
noncomputable def homologyMapIso (e : S₁ ≅ S₂) [S₁.HasHomology]
    [S₂.HasHomology] : S₁.homology ≅ S₂.homology 
goal: S₁.homology ≅ S₂.homology

full_name: CategoryTheory.ShortComplex.isIso_homologyMap_of_iso
code: instance isIso_homologyMap_of_iso (φ : S₁ ⟶ S₂) [IsIso φ] [S₁.HasHomology]
    [S₂.HasHomology] :
    IsIso (homologyMap φ) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.homologyMap φ)

full_name: CategoryTheory.ShortComplex.leftRightHomologyComparison'
code: /-- If a short complex `S` has both a left homology data `h₁` and a right homology data `h₂`,
this is the canonical morphism `h₁.H ⟶ h₂.H`. -/
def leftRightHomologyComparison' : h₁.H ⟶ h₂.H 
goal: h₁.H ⟶ h₂.H

full_name: CategoryTheory.ShortComplex.leftRightHomologyComparison'_eq_liftH
code: lemma leftRightHomologyComparison'_eq_liftH :
    leftRightHomologyComparison' h₁ h₂ =
      h₂.liftH (h₁.descH (h₁.i ≫ h₂.p) (by simp))
        (by rw [← cancel_epi h₁.π, LeftHomologyData.π_descH_assoc, assoc,
          RightHomologyData.p_g', LeftHomologyData.wi, comp_zero]) 
goal: CategoryTheory.ShortComplex.leftRightHomologyComparison' h₁ h₂ =
  h₂.liftH (h₁.descH (CategoryTheory.CategoryStruct.comp h₁.i h₂.p) ⋯) ⋯

full_name: CategoryTheory.ShortComplex.π_leftRightHomologyComparison'_ι
code: @[reassoc (attr := simp)]
lemma π_leftRightHomologyComparison'_ι :
    h₁.π ≫ leftRightHomologyComparison' h₁ h₂ ≫ h₂.ι = h₁.i ≫ h₂.p 
goal: CategoryTheory.CategoryStruct.comp h₁.π
    (CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.leftRightHomologyComparison' h₁ h₂) h₂.ι) =
  CategoryTheory.CategoryStruct.comp h₁.i h₂.p

full_name: CategoryTheory.ShortComplex.leftRightHomologyComparison'_eq_descH
code: lemma leftRightHomologyComparison'_eq_descH :
    leftRightHomologyComparison' h₁ h₂ =
      h₁.descH (h₂.liftH (h₁.i ≫ h₂.p) (by simp))
        (by rw [← cancel_mono h₂.ι, assoc, RightHomologyData.liftH_ι,
          LeftHomologyData.f'_i_assoc, RightHomologyData.wp, zero_comp]) 
goal: CategoryTheory.ShortComplex.leftRightHomologyComparison' h₁ h₂ =
  h₁.descH (h₂.liftH (CategoryTheory.CategoryStruct.comp h₁.i h₂.p) ⋯) ⋯

full_name: CategoryTheory.ShortComplex.leftRightHomologyComparison
code: /-- If a short complex `S` has both a left and right homology,
this is the canonical morphism `S.leftHomology ⟶ S.rightHomology`. -/
noncomputable def leftRightHomologyComparison [S.HasLeftHomology] [S.HasRightHomology] :
    S.leftHomology ⟶ S.rightHomology 
goal: S.leftHomology ⟶ S.rightHomology

full_name: CategoryTheory.ShortComplex.π_leftRightHomologyComparison_ι
code: @[reassoc (attr := simp)]
lemma π_leftRightHomologyComparison_ι [S.HasLeftHomology] [S.HasRightHomology] :
    S.leftHomologyπ ≫ S.leftRightHomologyComparison ≫ S.rightHomologyι =
      S.iCycles ≫ S.pOpcycles 
goal: CategoryTheory.CategoryStruct.comp S.leftHomologyπ
    (CategoryTheory.CategoryStruct.comp S.leftRightHomologyComparison S.rightHomologyι) =
  CategoryTheory.CategoryStruct.comp S.iCycles S.pOpcycles

full_name: CategoryTheory.ShortComplex.leftRightHomologyComparison'_naturality
code: @[reassoc]
lemma leftRightHomologyComparison'_naturality (φ : S₁ ⟶ S₂) (h₁ : S₁.LeftHomologyData)
    (h₂ : S₁.RightHomologyData) (h₁' : S₂.LeftHomologyData) (h₂' : S₂.RightHomologyData) :
    leftHomologyMap' φ h₁ h₁' ≫ leftRightHomologyComparison' h₁' h₂' =
      leftRightHomologyComparison' h₁ h₂ ≫ rightHomologyMap' φ h₂ h₂' 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.leftHomologyMap' φ h₁ h₁')
    (CategoryTheory.ShortComplex.leftRightHomologyComparison' h₁' h₂') =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.leftRightHomologyComparison' h₁ h₂)
    (CategoryTheory.ShortComplex.rightHomologyMap' φ h₂ h₂')

full_name: CategoryTheory.ShortComplex.leftRightHomologyComparison'_compatibility
code: lemma leftRightHomologyComparison'_compatibility (h₁ h₁' : S.LeftHomologyData)
    (h₂ h₂' : S.RightHomologyData) :
    leftRightHomologyComparison' h₁ h₂ = leftHomologyMap' (𝟙 S) h₁ h₁' ≫
      leftRightHomologyComparison' h₁' h₂' ≫ rightHomologyMap' (𝟙 S) _ _ 
goal: CategoryTheory.ShortComplex.leftRightHomologyComparison' h₁ h₂ =
  CategoryTheory.CategoryStruct.comp
    (CategoryTheory.ShortComplex.leftHomologyMap' (CategoryTheory.CategoryStruct.id S) h₁ h₁')
    (CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.leftRightHomologyComparison' h₁' h₂')
      (CategoryTheory.ShortComplex.rightHomologyMap' (CategoryTheory.CategoryStruct.id S) h₂' h₂))

full_name: CategoryTheory.ShortComplex.leftRightHomologyComparison_eq
code: lemma leftRightHomologyComparison_eq [S.HasLeftHomology] [S.HasRightHomology]
    (h₁ : S.LeftHomologyData) (h₂ : S.RightHomologyData) :
    S.leftRightHomologyComparison = h₁.leftHomologyIso.hom ≫
      leftRightHomologyComparison' h₁ h₂ ≫ h₂.rightHomologyIso.inv 
goal: S.leftRightHomologyComparison =
  CategoryTheory.CategoryStruct.comp h₁.leftHomologyIso.hom
    (CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.leftRightHomologyComparison' h₁ h₂)
      h₂.rightHomologyIso.inv)

full_name: CategoryTheory.ShortComplex.HomologyData.leftRightHomologyComparison'_eq
code: @[simp]
lemma HomologyData.leftRightHomologyComparison'_eq (h : S.HomologyData) :
    leftRightHomologyComparison' h.left h.right = h.iso.hom 
goal: CategoryTheory.ShortComplex.leftRightHomologyComparison' h.left h.right = h.iso.hom

full_name: CategoryTheory.ShortComplex.isIso_leftRightHomologyComparison'_of_homologyData
code: instance isIso_leftRightHomologyComparison'_of_homologyData (h : S.HomologyData) :
  IsIso (leftRightHomologyComparison' h.left h.right) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.leftRightHomologyComparison' h.left h.right)

full_name: CategoryTheory.ShortComplex.isIso_leftRightHomologyComparison'
code: instance isIso_leftRightHomologyComparison' [S.HasHomology]
    (h₁ : S.LeftHomologyData) (h₂ : S.RightHomologyData) :
    IsIso (leftRightHomologyComparison' h₁ h₂) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.leftRightHomologyComparison' h₁ h₂)

full_name: CategoryTheory.ShortComplex.isIso_leftRightHomologyComparison
code: instance isIso_leftRightHomologyComparison [S.HasHomology] :
    IsIso S.leftRightHomologyComparison 
goal: CategoryTheory.IsIso S.leftRightHomologyComparison

full_name: CategoryTheory.ShortComplex.HomologyData.ofIsIsoLeftRightHomologyComparison'_iso
code: /-- This is the homology data for a short complex `S` that is obtained
from a left homology data `h₁` and a right homology data `h₂` when the comparison
morphism `leftRightHomologyComparison' h₁ h₂ : h₁.H ⟶ h₂.H` is an isomorphism. -/
@[simps]
noncomputable def ofIsIsoLeftRightHomologyComparison'
    (h₁ : S.LeftHomologyData) (h₂ : S.RightHomologyData)
    [IsIso (leftRightHomologyComparison' h₁ h₂)] :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIsIsoLeftRightHomologyComparison' h₁ h₂).iso =
  CategoryTheory.asIso (CategoryTheory.ShortComplex.leftRightHomologyComparison' h₁ h₂)

full_name: CategoryTheory.ShortComplex.HomologyData.ofIsIsoLeftRightHomologyComparison'
code: /-- This is the homology data for a short complex `S` that is obtained
from a left homology data `h₁` and a right homology data `h₂` when the comparison
morphism `leftRightHomologyComparison' h₁ h₂ : h₁.H ⟶ h₂.H` is an isomorphism. -/
@[simps]
noncomputable def ofIsIsoLeftRightHomologyComparison'
    (h₁ : S.LeftHomologyData) (h₂ : S.RightHomologyData)
    [IsIso (leftRightHomologyComparison' h₁ h₂)] :
    S.HomologyData 
goal: S.HomologyData

full_name: CategoryTheory.ShortComplex.HomologyData.ofIsIsoLeftRightHomologyComparison'_right
code: /-- This is the homology data for a short complex `S` that is obtained
from a left homology data `h₁` and a right homology data `h₂` when the comparison
morphism `leftRightHomologyComparison' h₁ h₂ : h₁.H ⟶ h₂.H` is an isomorphism. -/
@[simps]
noncomputable def ofIsIsoLeftRightHomologyComparison'
    (h₁ : S.LeftHomologyData) (h₂ : S.RightHomologyData)
    [IsIso (leftRightHomologyComparison' h₁ h₂)] :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIsIsoLeftRightHomologyComparison' h₁ h₂).right = h₂

full_name: CategoryTheory.ShortComplex.HomologyData.ofIsIsoLeftRightHomologyComparison'_left
code: /-- This is the homology data for a short complex `S` that is obtained
from a left homology data `h₁` and a right homology data `h₂` when the comparison
morphism `leftRightHomologyComparison' h₁ h₂ : h₁.H ⟶ h₂.H` is an isomorphism. -/
@[simps]
noncomputable def ofIsIsoLeftRightHomologyComparison'
    (h₁ : S.LeftHomologyData) (h₂ : S.RightHomologyData)
    [IsIso (leftRightHomologyComparison' h₁ h₂)] :
    S.HomologyData 
goal: (CategoryTheory.ShortComplex.HomologyData.ofIsIsoLeftRightHomologyComparison' h₁ h₂).left = h₁

full_name: CategoryTheory.ShortComplex.leftRightHomologyComparison'_eq_leftHomologpMap'_comp_iso_hom_comp_rightHomologyMap'
code: lemma leftRightHomologyComparison'_eq_leftHomologpMap'_comp_iso_hom_comp_rightHomologyMap'
    (h : S.HomologyData) (h₁ : S.LeftHomologyData) (h₂ : S.RightHomologyData) :
    leftRightHomologyComparison' h₁ h₂ =
      leftHomologyMap' (𝟙 S) h₁ h.left ≫ h.iso.hom ≫ rightHomologyMap' (𝟙 S) h.right h₂ 
goal: CategoryTheory.ShortComplex.leftRightHomologyComparison' h₁ h₂ =
  CategoryTheory.CategoryStruct.comp
    (CategoryTheory.ShortComplex.leftHomologyMap' (CategoryTheory.CategoryStruct.id S) h₁ h.left)
    (CategoryTheory.CategoryStruct.comp h.iso.hom
      (CategoryTheory.ShortComplex.rightHomologyMap' (CategoryTheory.CategoryStruct.id S) h.right h₂))

full_name: CategoryTheory.ShortComplex.leftRightHomologyComparison'_fac
code: @[reassoc]
lemma leftRightHomologyComparison'_fac (h₁ : S.LeftHomologyData) (h₂ : S.RightHomologyData)
    [S.HasHomology] :
    leftRightHomologyComparison' h₁ h₂ = h₁.homologyIso.inv ≫ h₂.homologyIso.hom 
goal: CategoryTheory.ShortComplex.leftRightHomologyComparison' h₁ h₂ =
  CategoryTheory.CategoryStruct.comp h₁.homologyIso.inv h₂.homologyIso.hom

full_name: CategoryTheory.ShortComplex.leftRightHomologyComparison_fac
code: @[reassoc]
lemma leftRightHomologyComparison_fac [S.HasHomology] :
    S.leftRightHomologyComparison = S.leftHomologyIso.hom ≫ S.rightHomologyIso.inv 
goal: S.leftRightHomologyComparison = CategoryTheory.CategoryStruct.comp S.leftHomologyIso.hom S.rightHomologyIso.inv

full_name: CategoryTheory.ShortComplex.HomologyData.right_homologyIso_eq_left_homologyIso_trans_iso
code: lemma HomologyData.right_homologyIso_eq_left_homologyIso_trans_iso
    (h : S.HomologyData) [S.HasHomology] :
    h.right.homologyIso = h.left.homologyIso ≪≫ h.iso 
goal: h.right.homologyIso = h.left.homologyIso ≪≫ h.iso

full_name: CategoryTheory.ShortComplex.hasHomology_of_isIso_leftRightHomologyComparison'
code: lemma hasHomology_of_isIso_leftRightHomologyComparison'
    (h₁ : S.LeftHomologyData) (h₂ : S.RightHomologyData)
    [IsIso (leftRightHomologyComparison' h₁ h₂)] :
    S.HasHomology 
goal: S.HasHomology

full_name: CategoryTheory.ShortComplex.hasHomology_of_isIsoLeftRightHomologyComparison
code: lemma hasHomology_of_isIsoLeftRightHomologyComparison [S.HasLeftHomology]
    [S.HasRightHomology] [h : IsIso S.leftRightHomologyComparison] :
    S.HasHomology 
goal: S.HasHomology

full_name: CategoryTheory.ShortComplex.LeftHomologyData.leftHomologyIso_hom_naturality
code: @[reassoc]
lemma LeftHomologyData.leftHomologyIso_hom_naturality
    (h₁ : S₁.LeftHomologyData) (h₂ : S₂.LeftHomologyData) :
    h₁.homologyIso.hom ≫ leftHomologyMap' φ h₁ h₂ =
      homologyMap φ ≫ h₂.homologyIso.hom 
goal: CategoryTheory.CategoryStruct.comp h₁.homologyIso.hom (CategoryTheory.ShortComplex.leftHomologyMap' φ h₁ h₂) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.homologyMap φ) h₂.homologyIso.hom

full_name: CategoryTheory.ShortComplex.LeftHomologyData.leftHomologyIso_inv_naturality
code: @[reassoc]
lemma LeftHomologyData.leftHomologyIso_inv_naturality
    (h₁ : S₁.LeftHomologyData) (h₂ : S₂.LeftHomologyData) :
    h₁.homologyIso.inv ≫ homologyMap φ =
      leftHomologyMap' φ h₁ h₂ ≫ h₂.homologyIso.inv 
goal: CategoryTheory.CategoryStruct.comp h₁.homologyIso.inv (CategoryTheory.ShortComplex.homologyMap φ) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.leftHomologyMap' φ h₁ h₂) h₂.homologyIso.inv

full_name: CategoryTheory.ShortComplex.leftHomologyIso_hom_naturality
code: @[reassoc]
lemma leftHomologyIso_hom_naturality :
    S₁.leftHomologyIso.hom ≫ homologyMap φ =
      leftHomologyMap φ ≫ S₂.leftHomologyIso.hom 
goal: CategoryTheory.CategoryStruct.comp S₁.leftHomologyIso.hom (CategoryTheory.ShortComplex.homologyMap φ) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.leftHomologyMap φ) S₂.leftHomologyIso.hom

full_name: CategoryTheory.ShortComplex.leftHomologyIso_inv_naturality
code: @[reassoc]
lemma leftHomologyIso_inv_naturality :
    S₁.leftHomologyIso.inv ≫ leftHomologyMap φ =
      homologyMap φ ≫ S₂.leftHomologyIso.inv 
goal: CategoryTheory.CategoryStruct.comp S₁.leftHomologyIso.inv (CategoryTheory.ShortComplex.leftHomologyMap φ) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.homologyMap φ) S₂.leftHomologyIso.inv

full_name: CategoryTheory.ShortComplex.RightHomologyData.rightHomologyIso_hom_naturality
code: @[reassoc]
lemma RightHomologyData.rightHomologyIso_hom_naturality
    (h₁ : S₁.RightHomologyData) (h₂ : S₂.RightHomologyData) :
    h₁.homologyIso.hom ≫ rightHomologyMap' φ h₁ h₂ =
      homologyMap φ ≫ h₂.homologyIso.hom 
goal: CategoryTheory.CategoryStruct.comp h₁.homologyIso.hom (CategoryTheory.ShortComplex.rightHomologyMap' φ h₁ h₂) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.homologyMap φ) h₂.homologyIso.hom

full_name: CategoryTheory.ShortComplex.RightHomologyData.rightHomologyIso_inv_naturality
code: @[reassoc]
lemma RightHomologyData.rightHomologyIso_inv_naturality
    (h₁ : S₁.RightHomologyData) (h₂ : S₂.RightHomologyData) :
      h₁.homologyIso.inv ≫ homologyMap φ =
        rightHomologyMap' φ h₁ h₂ ≫ h₂.homologyIso.inv 
goal: CategoryTheory.CategoryStruct.comp h₁.homologyIso.inv (CategoryTheory.ShortComplex.homologyMap φ) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.rightHomologyMap' φ h₁ h₂) h₂.homologyIso.inv

full_name: CategoryTheory.ShortComplex.rightHomologyIso_hom_naturality
code: @[reassoc]
lemma rightHomologyIso_hom_naturality :
    S₁.rightHomologyIso.hom ≫ homologyMap φ =
      rightHomologyMap φ ≫ S₂.rightHomologyIso.hom 
goal: CategoryTheory.CategoryStruct.comp S₁.rightHomologyIso.hom (CategoryTheory.ShortComplex.homologyMap φ) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.rightHomologyMap φ) S₂.rightHomologyIso.hom

full_name: CategoryTheory.ShortComplex.rightHomologyIso_inv_naturality
code: @[reassoc]
lemma rightHomologyIso_inv_naturality :
    S₁.rightHomologyIso.inv ≫ rightHomologyMap φ =
      homologyMap φ ≫ S₂.rightHomologyIso.inv 
goal: CategoryTheory.CategoryStruct.comp S₁.rightHomologyIso.inv (CategoryTheory.ShortComplex.rightHomologyMap φ) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.homologyMap φ) S₂.rightHomologyIso.inv

full_name: CategoryTheory.CategoryWithHomology
code: /-- We shall say that a category `C` is a category with homology when all short complexes
have homology. -/
class _root_.CategoryTheory.CategoryWithHomology : Prop where
  hasHomology : ∀ (S : ShortComplex C), S.HasHomology
goal: Prop

full_name: CategoryTheory.CategoryWithHomology.hasHomology
code: /-- We shall say that a category `C` is a category with homology when all short complexes
have homology. -/
class _root_.CategoryTheory.CategoryWithHomology : Prop where
  hasHomology : ∀ (S : ShortComplex C), S.HasHomology
goal: S.HasHomology

full_name: CategoryTheory.ShortComplex.instCategoryWithHomologyOpposite
code: instance [CategoryWithHomology C] : CategoryWithHomology Cᵒᵖ 
goal: CategoryTheory.CategoryWithHomology Cᵒᵖ

full_name: CategoryTheory.ShortComplex.homologyFunctor_obj
code: /-- The homology functor `ShortComplex C ⥤ C` for a category `C` with homology. -/
@[simps]
noncomputable def homologyFunctor [CategoryWithHomology C] :
    ShortComplex C ⥤ C 
goal: (CategoryTheory.ShortComplex.homologyFunctor C).obj S = S.homology

full_name: CategoryTheory.ShortComplex.homologyFunctor_map
code: /-- The homology functor `ShortComplex C ⥤ C` for a category `C` with homology. -/
@[simps]
noncomputable def homologyFunctor [CategoryWithHomology C] :
    ShortComplex C ⥤ C 
goal: ∀ {X Y : CategoryTheory.ShortComplex C} (f : X ⟶ Y),
  (CategoryTheory.ShortComplex.homologyFunctor C).map f = CategoryTheory.ShortComplex.homologyMap f

full_name: CategoryTheory.ShortComplex.homologyFunctor
code: /-- The homology functor `ShortComplex C ⥤ C` for a category `C` with homology. -/
@[simps]
noncomputable def homologyFunctor [CategoryWithHomology C] :
    ShortComplex C ⥤ C 
goal: CategoryTheory.Functor (CategoryTheory.ShortComplex C) C

full_name: CategoryTheory.ShortComplex.isIso_homologyMap'_of_epi_of_isIso_of_mono
code: instance isIso_homologyMap'_of_epi_of_isIso_of_mono (φ : S₁ ⟶ S₂)
    (h₁ : S₁.HomologyData) (h₂ : S₂.HomologyData) [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    IsIso (homologyMap' φ h₁ h₂) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.homologyMap' φ h₁ h₂)

full_name: CategoryTheory.ShortComplex.isIso_homologyMap_of_epi_of_isIso_of_mono'
code: lemma isIso_homologyMap_of_epi_of_isIso_of_mono' (φ : S₁ ⟶ S₂) [S₁.HasHomology] [S₂.HasHomology]
    (h₁ : Epi φ.τ₁) (h₂ : IsIso φ.τ₂) (h₃ : Mono φ.τ₃) :
    IsIso (homologyMap φ) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.homologyMap φ)

full_name: CategoryTheory.ShortComplex.isIso_homologyMap_of_epi_of_isIso_of_mono
code: instance isIso_homologyMap_of_epi_of_isIso_of_mono (φ : S₁ ⟶ S₂) [S₁.HasHomology] [S₂.HasHomology]
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    IsIso (homologyMap φ) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.homologyMap φ)

full_name: CategoryTheory.ShortComplex.isIso_homologyFunctor_map_of_epi_of_isIso_of_mono
code: instance isIso_homologyFunctor_map_of_epi_of_isIso_of_mono (φ : S₁ ⟶ S₂) [CategoryWithHomology C]
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    IsIso ((homologyFunctor C).map φ) 
goal: CategoryTheory.IsIso ((CategoryTheory.ShortComplex.homologyFunctor C).map φ)

full_name: CategoryTheory.ShortComplex.isIso_homologyMap_of_isIso
code: instance isIso_homologyMap_of_isIso (φ : S₁ ⟶ S₂) [S₁.HasHomology] [S₂.HasHomology] [IsIso φ] :
    IsIso (homologyMap φ) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.homologyMap φ)

full_name: CategoryTheory.ShortComplex.homologyπ
code: /-- The canonical morphism `S.cycles ⟶ S.homology` for a short complex `S` that has homology. -/
noncomputable def homologyπ : S.cycles ⟶ S.homology 
goal: S.cycles ⟶ S.homology

full_name: CategoryTheory.ShortComplex.homologyι
code: /-- The canonical morphism `S.homology ⟶ S.opcycles` for a short complex `S` that has homology. -/
noncomputable def homologyι : S.homology ⟶ S.opcycles 
goal: S.homology ⟶ S.opcycles

full_name: CategoryTheory.ShortComplex.homologyπ_comp_leftHomologyIso_inv
code: @[reassoc (attr := simp)]
lemma homologyπ_comp_leftHomologyIso_inv :
    S.homologyπ ≫ S.leftHomologyIso.inv = S.leftHomologyπ 
goal: CategoryTheory.CategoryStruct.comp S.homologyπ S.leftHomologyIso.inv = S.leftHomologyπ

full_name: CategoryTheory.ShortComplex.rightHomologyIso_hom_comp_homologyι
code: @[reassoc (attr := simp)]
lemma rightHomologyIso_hom_comp_homologyι :
    S.rightHomologyIso.hom ≫ S.homologyι = S.rightHomologyι 
goal: CategoryTheory.CategoryStruct.comp S.rightHomologyIso.hom S.homologyι = S.rightHomologyι

full_name: CategoryTheory.ShortComplex.toCycles_comp_homologyπ
code: @[reassoc (attr := simp)]
lemma toCycles_comp_homologyπ :
    S.toCycles ≫ S.homologyπ = 0 
goal: CategoryTheory.CategoryStruct.comp S.toCycles S.homologyπ = 0

full_name: CategoryTheory.ShortComplex.homologyι_comp_fromOpcycles
code: @[reassoc (attr := simp)]
lemma homologyι_comp_fromOpcycles :
    S.homologyι ≫ S.fromOpcycles = 0 
goal: CategoryTheory.CategoryStruct.comp S.homologyι S.fromOpcycles = 0

full_name: CategoryTheory.ShortComplex.homologyIsCokernel
code: /-- The homology `S.homology` of a short complex is
the cokernel of the morphism `S.toCycles : S.X₁ ⟶ S.cycles`. -/
noncomputable def homologyIsCokernel :
    IsColimit (CokernelCofork.ofπ S.homologyπ S.toCycles_comp_homologyπ) 
goal: CategoryTheory.Limits.IsColimit (CategoryTheory.Limits.CokernelCofork.ofπ S.homologyπ ⋯)

full_name: CategoryTheory.ShortComplex.homologyIsKernel
code: /-- The homology `S.homology` of a short complex is
the kernel of the morphism `S.fromOpcycles : S.opcycles ⟶ S.X₃`. -/
noncomputable def homologyIsKernel :
    IsLimit (KernelFork.ofι S.homologyι S.homologyι_comp_fromOpcycles) 
goal: CategoryTheory.Limits.IsLimit (CategoryTheory.Limits.KernelFork.ofι S.homologyι ⋯)

full_name: CategoryTheory.ShortComplex.instEpiHomologyπ
code: instance : Epi S.homologyπ 
goal: CategoryTheory.Epi S.homologyπ

full_name: CategoryTheory.ShortComplex.instMonoHomologyι
code: instance : Mono S.homologyι 
goal: CategoryTheory.Mono S.homologyι

full_name: CategoryTheory.ShortComplex.descHomology
code: /-- Given a morphism `k : S.cycles ⟶ A` such that `S.toCycles ≫ k = 0`, this is the
induced morphism `S.homology ⟶ A`. -/
noncomputable def descHomology (k : S.cycles ⟶ A) (hk : S.toCycles ≫ k = 0) :
    S.homology ⟶ A 
goal: S.homology ⟶ A

full_name: CategoryTheory.ShortComplex.liftHomology
code: /-- Given a morphism `k : A ⟶ S.opcycles` such that `k ≫ S.fromOpcycles = 0`, this is the
induced morphism `A ⟶ S.homology`. -/
noncomputable def liftHomology (k : A ⟶ S.opcycles) (hk : k ≫ S.fromOpcycles = 0) :
    A ⟶ S.homology 
goal: A ⟶ S.homology

full_name: CategoryTheory.ShortComplex.π_descHomology
code: @[reassoc (attr := simp)]
lemma π_descHomology (k : S.cycles ⟶ A) (hk : S.toCycles ≫ k = 0) :
    S.homologyπ ≫ S.descHomology k hk = k 
goal: CategoryTheory.CategoryStruct.comp S.homologyπ (S.descHomology k hk) = k

full_name: CategoryTheory.ShortComplex.liftHomology_ι
code: @[reassoc (attr := simp)]
lemma liftHomology_ι (k : A ⟶ S.opcycles) (hk : k ≫ S.fromOpcycles = 0) :
    S.liftHomology k hk ≫ S.homologyι = k 
goal: CategoryTheory.CategoryStruct.comp (S.liftHomology k hk) S.homologyι = k

full_name: CategoryTheory.ShortComplex.homologyπ_naturality
code: @[reassoc (attr := simp)]
lemma homologyπ_naturality (φ : S₁ ⟶ S₂) [S₁.HasHomology] [S₂.HasHomology] :
    S₁.homologyπ ≫ homologyMap φ = cyclesMap φ ≫ S₂.homologyπ 
goal: CategoryTheory.CategoryStruct.comp S₁.homologyπ (CategoryTheory.ShortComplex.homologyMap φ) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.cyclesMap φ) S₂.homologyπ

full_name: CategoryTheory.ShortComplex.homologyι_naturality
code: @[reassoc (attr := simp)]
lemma homologyι_naturality (φ : S₁ ⟶ S₂) [S₁.HasHomology] [S₂.HasHomology] :
    homologyMap φ ≫ S₂.homologyι = S₁.homologyι ≫ S₁.opcyclesMap φ  
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.homologyMap φ) S₂.homologyι =
  CategoryTheory.CategoryStruct.comp S₁.homologyι (CategoryTheory.ShortComplex.opcyclesMap φ)

full_name: CategoryTheory.ShortComplex.homology_π_ι
code: @[reassoc (attr := simp)]
lemma homology_π_ι :
    S.homologyπ ≫ S.homologyι = S.iCycles ≫ S.pOpcycles 
goal: CategoryTheory.CategoryStruct.comp S.homologyπ S.homologyι = CategoryTheory.CategoryStruct.comp S.iCycles S.pOpcycles

full_name: CategoryTheory.ShortComplex.homologyIsoKernelDesc
code: /-- The homology of a short complex `S` identifies to the kernel of the induced morphism
`cokernel S.f ⟶ S.X₃`. -/
noncomputable def homologyIsoKernelDesc [HasCokernel S.f]
    [HasKernel (cokernel.desc S.f S.g S.zero)] :
  S.homology ≅ kernel (cokernel.desc S.f S.g S.zero) 
goal: S.homology ≅ CategoryTheory.Limits.kernel (CategoryTheory.Limits.cokernel.desc S.f S.g ⋯)

full_name: CategoryTheory.ShortComplex.homologyIsoCokernelLift
code: /-- The homology of a short complex `S` identifies to the cokernel of the induced morphism
`S.X₁ ⟶ kernel S.g`. -/
noncomputable def homologyIsoCokernelLift [HasKernel S.g]
    [HasCokernel (kernel.lift S.g S.f S.zero)] :
  S.homology ≅ cokernel (kernel.lift S.g S.f S.zero) 
goal: S.homology ≅ CategoryTheory.Limits.cokernel (CategoryTheory.Limits.kernel.lift S.g S.f ⋯)

full_name: CategoryTheory.ShortComplex.LeftHomologyData.homologyπ_comp_homologyIso_hom
code: @[reassoc (attr := simp)]
lemma LeftHomologyData.homologyπ_comp_homologyIso_hom (h : S.LeftHomologyData) :
    S.homologyπ ≫ h.homologyIso.hom = h.cyclesIso.hom ≫ h.π 
goal: CategoryTheory.CategoryStruct.comp S.homologyπ h.homologyIso.hom =
  CategoryTheory.CategoryStruct.comp h.cyclesIso.hom h.π

full_name: CategoryTheory.ShortComplex.LeftHomologyData.π_comp_homologyIso_inv
code: @[reassoc (attr := simp)]
lemma LeftHomologyData.π_comp_homologyIso_inv (h : S.LeftHomologyData) :
    h.π ≫ h.homologyIso.inv = h.cyclesIso.inv ≫ S.homologyπ 
goal: CategoryTheory.CategoryStruct.comp h.π h.homologyIso.inv =
  CategoryTheory.CategoryStruct.comp h.cyclesIso.inv S.homologyπ

full_name: CategoryTheory.ShortComplex.RightHomologyData.homologyIso_inv_comp_homologyι
code: @[reassoc (attr := simp)]
lemma RightHomologyData.homologyIso_inv_comp_homologyι (h : S.RightHomologyData) :
    h.homologyIso.inv ≫ S.homologyι = h.ι ≫ h.opcyclesIso.inv 
goal: CategoryTheory.CategoryStruct.comp h.homologyIso.inv S.homologyι =
  CategoryTheory.CategoryStruct.comp h.ι h.opcyclesIso.inv

full_name: CategoryTheory.ShortComplex.RightHomologyData.homologyIso_hom_comp_ι
code: @[reassoc (attr := simp)]
lemma RightHomologyData.homologyIso_hom_comp_ι (h : S.RightHomologyData) :
    h.homologyIso.hom ≫ h.ι = S.homologyι ≫ h.opcyclesIso.hom 
goal: CategoryTheory.CategoryStruct.comp h.homologyIso.hom h.ι =
  CategoryTheory.CategoryStruct.comp S.homologyι h.opcyclesIso.hom

full_name: CategoryTheory.ShortComplex.LeftHomologyData.homologyIso_hom_comp_leftHomologyIso_inv
code: @[reassoc (attr := simp)]
lemma LeftHomologyData.homologyIso_hom_comp_leftHomologyIso_inv (h : S.LeftHomologyData) :
    h.homologyIso.hom ≫ h.leftHomologyIso.inv = S.leftHomologyIso.inv 
goal: CategoryTheory.CategoryStruct.comp h.homologyIso.hom h.leftHomologyIso.inv = S.leftHomologyIso.inv

full_name: CategoryTheory.ShortComplex.LeftHomologyData.leftHomologyIso_hom_comp_homologyIso_inv
code: @[reassoc (attr := simp)]
lemma LeftHomologyData.leftHomologyIso_hom_comp_homologyIso_inv (h : S.LeftHomologyData) :
    h.leftHomologyIso.hom ≫ h.homologyIso.inv = S.leftHomologyIso.hom 
goal: CategoryTheory.CategoryStruct.comp h.leftHomologyIso.hom h.homologyIso.inv = S.leftHomologyIso.hom

full_name: CategoryTheory.ShortComplex.RightHomologyData.homologyIso_hom_comp_rightHomologyIso_inv
code: @[reassoc (attr := simp)]
lemma RightHomologyData.homologyIso_hom_comp_rightHomologyIso_inv (h : S.RightHomologyData) :
    h.homologyIso.hom ≫ h.rightHomologyIso.inv = S.rightHomologyIso.inv 
goal: CategoryTheory.CategoryStruct.comp h.homologyIso.hom h.rightHomologyIso.inv = S.rightHomologyIso.inv

full_name: CategoryTheory.ShortComplex.RightHomologyData.rightHomologyIso_hom_comp_homologyIso_inv
code: @[reassoc (attr := simp)]
lemma RightHomologyData.rightHomologyIso_hom_comp_homologyIso_inv (h : S.RightHomologyData) :
    h.rightHomologyIso.hom ≫ h.homologyIso.inv = S.rightHomologyIso.hom 
goal: CategoryTheory.CategoryStruct.comp h.rightHomologyIso.hom h.homologyIso.inv = S.rightHomologyIso.hom

full_name: CategoryTheory.ShortComplex.comp_homologyMap_comp
code: @[reassoc]
lemma comp_homologyMap_comp [S₁.HasHomology] [S₂.HasHomology] (φ : S₁ ⟶ S₂)
    (h₁ : S₁.LeftHomologyData) (h₂ : S₂.RightHomologyData) :
    h₁.π ≫ h₁.homologyIso.inv ≫ homologyMap φ ≫ h₂.homologyIso.hom ≫ h₂.ι =
      h₁.i ≫ φ.τ₂ ≫ h₂.p 
goal: CategoryTheory.CategoryStruct.comp h₁.π
    (CategoryTheory.CategoryStruct.comp h₁.homologyIso.inv
      (CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.homologyMap φ)
        (CategoryTheory.CategoryStruct.comp h₂.homologyIso.hom h₂.ι))) =
  CategoryTheory.CategoryStruct.comp h₁.i (CategoryTheory.CategoryStruct.comp φ.τ₂ h₂.p)

full_name: CategoryTheory.ShortComplex.π_homologyMap_ι
code: @[reassoc]
lemma π_homologyMap_ι [S₁.HasHomology] [S₂.HasHomology] (φ : S₁ ⟶ S₂) :
    S₁.homologyπ ≫ homologyMap φ ≫ S₂.homologyι = S₁.iCycles ≫ φ.τ₂ ≫ S₂.pOpcycles 
goal: CategoryTheory.CategoryStruct.comp S₁.homologyπ
    (CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.homologyMap φ) S₂.homologyι) =
  CategoryTheory.CategoryStruct.comp S₁.iCycles (CategoryTheory.CategoryStruct.comp φ.τ₂ S₂.pOpcycles)

full_name: CategoryTheory.ShortComplex.homologyOpIso
code: /-- The canonical isomorphism `S.op.homology ≅ Opposite.op S.homology` when a short
complex `S` has homology. -/
noncomputable def homologyOpIso [S.HasHomology] :
    S.op.homology ≅ Opposite.op S.homology 
goal: S.op.homology ≅ Opposite.op S.homology

full_name: CategoryTheory.ShortComplex.homologyMap'_op
code: lemma homologyMap'_op : (homologyMap' φ h₁ h₂).op =
    h₂.iso.inv.op ≫ homologyMap' (opMap φ) h₂.op h₁.op ≫ h₁.iso.hom.op 
goal: (CategoryTheory.ShortComplex.homologyMap' φ h₁ h₂).op =
  CategoryTheory.CategoryStruct.comp h₂.iso.inv.op
    (CategoryTheory.CategoryStruct.comp
      (CategoryTheory.ShortComplex.homologyMap' (CategoryTheory.ShortComplex.opMap φ) h₂.op h₁.op) h₁.iso.hom.op)

full_name: CategoryTheory.ShortComplex.homologyMap_op
code: lemma homologyMap_op [HasHomology S₁] [HasHomology S₂] :
    (homologyMap φ).op =
      (S₂.homologyOpIso).inv ≫ homologyMap (opMap φ) ≫ (S₁.homologyOpIso).hom 
goal: (CategoryTheory.ShortComplex.homologyMap φ).op =
  CategoryTheory.CategoryStruct.comp S₂.homologyOpIso.inv
    (CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.homologyMap (CategoryTheory.ShortComplex.opMap φ))
      S₁.homologyOpIso.hom)

full_name: CategoryTheory.ShortComplex.homologyFunctorOpNatIso
code: /-- The natural isomorphism `(homologyFunctor C).op ≅ opFunctor C ⋙ homologyFunctor Cᵒᵖ`
which relates the homology in `C` and in `Cᵒᵖ`. -/
noncomputable def homologyFunctorOpNatIso [CategoryWithHomology C] :
    (homologyFunctor C).op ≅ opFunctor C ⋙ homologyFunctor Cᵒᵖ 
goal: (CategoryTheory.ShortComplex.homologyFunctor C).op ≅
  (CategoryTheory.ShortComplex.opFunctor C).comp (CategoryTheory.ShortComplex.homologyFunctor Cᵒᵖ)

full_name: CategoryTheory.ShortComplex.liftCycles_homologyπ_eq_zero_of_boundary
code: lemma liftCycles_homologyπ_eq_zero_of_boundary [S.HasHomology]
    (k : A ⟶ S.X₂) (x : A ⟶ S.X₁) (hx : k = x ≫ S.f) :
    S.liftCycles k (by rw [hx, assoc, S.zero, comp_zero]) ≫ S.homologyπ = 0 
goal: CategoryTheory.CategoryStruct.comp (S.liftCycles k ⋯) S.homologyπ = 0

full_name: CategoryTheory.ShortComplex.homologyι_descOpcycles_eq_zero_of_boundary
code: @[reassoc]
lemma homologyι_descOpcycles_eq_zero_of_boundary [S.HasHomology]
    (k : S.X₂ ⟶ A) (x : S.X₃ ⟶ A) (hx : k = S.g ≫ x) :
    S.homologyι ≫ S.descOpcycles k (by rw [hx, S.zero_assoc, zero_comp]) = 0 
goal: CategoryTheory.CategoryStruct.comp S.homologyι (S.descOpcycles k ⋯) = 0

full_name: CategoryTheory.ShortComplex.isIso_homologyMap_of_isIso_cyclesMap_of_epi
code: lemma isIso_homologyMap_of_isIso_cyclesMap_of_epi {φ : S₁ ⟶ S₂}
    [S₁.HasHomology] [S₂.HasHomology] (h₁ : IsIso (cyclesMap φ)) (h₂ : Epi φ.τ₁) :
    IsIso (homologyMap φ) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.homologyMap φ)

full_name: CategoryTheory.ShortComplex.isIso_homologyMap_of_isIso_opcyclesMap_of_mono
code: lemma isIso_homologyMap_of_isIso_opcyclesMap_of_mono {φ : S₁ ⟶ S₂}
    [S₁.HasHomology] [S₂.HasHomology] (h₁ : IsIso (opcyclesMap φ)) (h₂ : Mono φ.τ₃) :
    IsIso (homologyMap φ) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.homologyMap φ)

full_name: CategoryTheory.ShortComplex.isZero_homology_of_isZero_X₂
code: lemma isZero_homology_of_isZero_X₂ (hS : IsZero S.X₂) [S.HasHomology] :
    IsZero S.homology 
goal: CategoryTheory.Limits.IsZero S.homology

full_name: CategoryTheory.ShortComplex.isIso_homologyπ
code: lemma isIso_homologyπ (hf : S.f = 0) [S.HasHomology] :
    IsIso S.homologyπ 
goal: CategoryTheory.IsIso S.homologyπ

full_name: CategoryTheory.ShortComplex.isIso_homologyι
code: lemma isIso_homologyι (hg : S.g = 0) [S.HasHomology] :
    IsIso S.homologyι 
goal: CategoryTheory.IsIso S.homologyι

full_name: CategoryTheory.ShortComplex.asIsoHomologyπ_hom
code: /-- The canonical isomorphism `S.cycles ≅ S.homology` when `S.f = 0`. -/
@[simps! hom]
noncomputable def asIsoHomologyπ (hf : S.f = 0) [S.HasHomology] :
    S.cycles ≅ S.homology 
goal: (S.asIsoHomologyπ hf).hom = S.homologyπ

full_name: CategoryTheory.ShortComplex.asIsoHomologyπ
code: /-- The canonical isomorphism `S.cycles ≅ S.homology` when `S.f = 0`. -/
@[simps! hom]
noncomputable def asIsoHomologyπ (hf : S.f = 0) [S.HasHomology] :
    S.cycles ≅ S.homology 
goal: S.cycles ≅ S.homology

full_name: CategoryTheory.ShortComplex.asIsoHomologyπ_inv_comp_homologyπ
code: @[reassoc (attr := simp)]
lemma asIsoHomologyπ_inv_comp_homologyπ (hf : S.f = 0) [S.HasHomology] :
    (S.asIsoHomologyπ hf).inv ≫ S.homologyπ = 𝟙 _ 
goal: CategoryTheory.CategoryStruct.comp (S.asIsoHomologyπ hf).inv S.homologyπ = CategoryTheory.CategoryStruct.id S.homology

full_name: CategoryTheory.ShortComplex.homologyπ_comp_asIsoHomologyπ_inv
code: @[reassoc (attr := simp)]
lemma homologyπ_comp_asIsoHomologyπ_inv (hf : S.f = 0) [S.HasHomology] :
    S.homologyπ ≫ (S.asIsoHomologyπ hf).inv = 𝟙 _ 
goal: CategoryTheory.CategoryStruct.comp S.homologyπ (S.asIsoHomologyπ hf).inv = CategoryTheory.CategoryStruct.id S.cycles

full_name: CategoryTheory.ShortComplex.asIsoHomologyι
code: /-- The canonical isomorphism `S.homology ≅ S.opcycles` when `S.g = 0`. -/
@[simps! hom]
noncomputable def asIsoHomologyι (hg : S.g = 0) [S.HasHomology] :
    S.homology ≅ S.opcycles 
goal: S.homology ≅ S.opcycles

full_name: CategoryTheory.ShortComplex.asIsoHomologyι_hom
code: /-- The canonical isomorphism `S.homology ≅ S.opcycles` when `S.g = 0`. -/
@[simps! hom]
noncomputable def asIsoHomologyι (hg : S.g = 0) [S.HasHomology] :
    S.homology ≅ S.opcycles 
goal: (S.asIsoHomologyι hg).hom = S.homologyι

full_name: CategoryTheory.ShortComplex.asIsoHomologyι_inv_comp_homologyι
code: @[reassoc (attr := simp)]
lemma asIsoHomologyι_inv_comp_homologyι (hg : S.g = 0) [S.HasHomology] :
    (S.asIsoHomologyι hg).inv ≫ S.homologyι = 𝟙 _ 
goal: CategoryTheory.CategoryStruct.comp (S.asIsoHomologyι hg).inv S.homologyι = CategoryTheory.CategoryStruct.id S.opcycles

full_name: CategoryTheory.ShortComplex.homologyι_comp_asIsoHomologyι_inv
code: @[reassoc (attr := simp)]
lemma homologyι_comp_asIsoHomologyι_inv (hg : S.g = 0) [S.HasHomology] :
    S.homologyι ≫ (S.asIsoHomologyι hg).inv  = 𝟙 _ 
goal: CategoryTheory.CategoryStruct.comp S.homologyι (S.asIsoHomologyι hg).inv = CategoryTheory.CategoryStruct.id S.homology

full_name: CategoryTheory.ShortComplex.mono_homologyMap_of_mono_opcyclesMap'
code: lemma mono_homologyMap_of_mono_opcyclesMap'
    [S₁.HasHomology] [S₂.HasHomology] (h : Mono (opcyclesMap φ)) :
    Mono (homologyMap φ) 
goal: CategoryTheory.Mono (CategoryTheory.ShortComplex.homologyMap φ)

full_name: CategoryTheory.ShortComplex.mono_homologyMap_of_mono_opcyclesMap
code: instance mono_homologyMap_of_mono_opcyclesMap
    [S₁.HasHomology] [S₂.HasHomology] [Mono (opcyclesMap φ)] :
    Mono (homologyMap φ) 
goal: CategoryTheory.Mono (CategoryTheory.ShortComplex.homologyMap φ)

full_name: CategoryTheory.ShortComplex.epi_homologyMap_of_epi_cyclesMap'
code: lemma epi_homologyMap_of_epi_cyclesMap'
    [S₁.HasHomology] [S₂.HasHomology] (h : Epi (cyclesMap φ)) :
    Epi (homologyMap φ) 
goal: CategoryTheory.Epi (CategoryTheory.ShortComplex.homologyMap φ)

full_name: CategoryTheory.ShortComplex.epi_homologyMap_of_epi_cyclesMap
code: instance epi_homologyMap_of_epi_cyclesMap
    [S₁.HasHomology] [S₂.HasHomology] [Epi (cyclesMap φ)] :
    Epi (homologyMap φ) 
goal: CategoryTheory.Epi (CategoryTheory.ShortComplex.homologyMap φ)