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

full_name: CategoryTheory.ShortComplex.RightHomologyData.H
code: /-- A right homology data for a short complex `S` consists of morphisms `p : S.X₂ ⟶ Q` and
`ι : H ⟶ Q` such that `p` identifies `Q` to the kernel of `f : S.X₁ ⟶ S.X₂`,
and that `ι` identifies `H` to the kernel of the induced map `g' : Q ⟶ S.X₃` -/
structure RightHomologyData where
  /-- a choice of cokernel of `S.f : S.X₁ ⟶ S.X₂`-/
  Q : C
  /-- a choice of kernel of the induced morphism `S.g' : S.Q ⟶ X₃`-/
  H : C
  /-- the projection from `S.X₂` -/
  p : S.X₂ ⟶ Q
  /-- the inclusion of the (right) homology in the chosen cokernel of `S.f` -/
  ι : H ⟶ Q
  /-- the cokernel condition for `p` -/
  wp : S.f ≫ p = 0
  /-- `p : S.X₂ ⟶ Q` is a cokernel of `S.f : S.X₁ ⟶ S.X₂` -/
  hp : IsColimit (CokernelCofork.ofπ p wp)
  /-- the kernel condition for `ι` -/
  wι : ι ≫ hp.desc (CokernelCofork.ofπ _ S.zero) = 0
  /-- `ι : H ⟶ Q` is a kernel of `S.g' : Q ⟶ S.X₃` -/
  hι : IsLimit (KernelFork.ofι ι wι)
goal: C

full_name: CategoryTheory.ShortComplex.RightHomologyData.wι
code: /-- A right homology data for a short complex `S` consists of morphisms `p : S.X₂ ⟶ Q` and
`ι : H ⟶ Q` such that `p` identifies `Q` to the kernel of `f : S.X₁ ⟶ S.X₂`,
and that `ι` identifies `H` to the kernel of the induced map `g' : Q ⟶ S.X₃` -/
structure RightHomologyData where
  /-- a choice of cokernel of `S.f : S.X₁ ⟶ S.X₂`-/
  Q : C
  /-- a choice of kernel of the induced morphism `S.g' : S.Q ⟶ X₃`-/
  H : C
  /-- the projection from `S.X₂` -/
  p : S.X₂ ⟶ Q
  /-- the inclusion of the (right) homology in the chosen cokernel of `S.f` -/
  ι : H ⟶ Q
  /-- the cokernel condition for `p` -/
  wp : S.f ≫ p = 0
  /-- `p : S.X₂ ⟶ Q` is a cokernel of `S.f : S.X₁ ⟶ S.X₂` -/
  hp : IsColimit (CokernelCofork.ofπ p wp)
  /-- the kernel condition for `ι` -/
  wι : ι ≫ hp.desc (CokernelCofork.ofπ _ S.zero) = 0
  /-- `ι : H ⟶ Q` is a kernel of `S.g' : Q ⟶ S.X₃` -/
  hι : IsLimit (KernelFork.ofι ι wι)
goal: CategoryTheory.CategoryStruct.comp self.ι (self.hp.desc (CategoryTheory.Limits.CokernelCofork.ofπ S.g ⋯)) = 0

full_name: CategoryTheory.ShortComplex.RightHomologyData.wp
code: /-- A right homology data for a short complex `S` consists of morphisms `p : S.X₂ ⟶ Q` and
`ι : H ⟶ Q` such that `p` identifies `Q` to the kernel of `f : S.X₁ ⟶ S.X₂`,
and that `ι` identifies `H` to the kernel of the induced map `g' : Q ⟶ S.X₃` -/
structure RightHomologyData where
  /-- a choice of cokernel of `S.f : S.X₁ ⟶ S.X₂`-/
  Q : C
  /-- a choice of kernel of the induced morphism `S.g' : S.Q ⟶ X₃`-/
  H : C
  /-- the projection from `S.X₂` -/
  p : S.X₂ ⟶ Q
  /-- the inclusion of the (right) homology in the chosen cokernel of `S.f` -/
  ι : H ⟶ Q
  /-- the cokernel condition for `p` -/
  wp : S.f ≫ p = 0
  /-- `p : S.X₂ ⟶ Q` is a cokernel of `S.f : S.X₁ ⟶ S.X₂` -/
  hp : IsColimit (CokernelCofork.ofπ p wp)
  /-- the kernel condition for `ι` -/
  wι : ι ≫ hp.desc (CokernelCofork.ofπ _ S.zero) = 0
  /-- `ι : H ⟶ Q` is a kernel of `S.g' : Q ⟶ S.X₃` -/
  hι : IsLimit (KernelFork.ofι ι wι)
goal: CategoryTheory.CategoryStruct.comp S.f self.p = 0

full_name: CategoryTheory.ShortComplex.RightHomologyData
code: /-- A right homology data for a short complex `S` consists of morphisms `p : S.X₂ ⟶ Q` and
`ι : H ⟶ Q` such that `p` identifies `Q` to the kernel of `f : S.X₁ ⟶ S.X₂`,
and that `ι` identifies `H` to the kernel of the induced map `g' : Q ⟶ S.X₃` -/
structure RightHomologyData where
  /-- a choice of cokernel of `S.f : S.X₁ ⟶ S.X₂`-/
  Q : C
  /-- a choice of kernel of the induced morphism `S.g' : S.Q ⟶ X₃`-/
  H : C
  /-- the projection from `S.X₂` -/
  p : S.X₂ ⟶ Q
  /-- the inclusion of the (right) homology in the chosen cokernel of `S.f` -/
  ι : H ⟶ Q
  /-- the cokernel condition for `p` -/
  wp : S.f ≫ p = 0
  /-- `p : S.X₂ ⟶ Q` is a cokernel of `S.f : S.X₁ ⟶ S.X₂` -/
  hp : IsColimit (CokernelCofork.ofπ p wp)
  /-- the kernel condition for `ι` -/
  wι : ι ≫ hp.desc (CokernelCofork.ofπ _ S.zero) = 0
  /-- `ι : H ⟶ Q` is a kernel of `S.g' : Q ⟶ S.X₃` -/
  hι : IsLimit (KernelFork.ofι ι wι)
goal: Type (max u_1 u_2)

full_name: CategoryTheory.ShortComplex.RightHomologyData.ι
code: /-- A right homology data for a short complex `S` consists of morphisms `p : S.X₂ ⟶ Q` and
`ι : H ⟶ Q` such that `p` identifies `Q` to the kernel of `f : S.X₁ ⟶ S.X₂`,
and that `ι` identifies `H` to the kernel of the induced map `g' : Q ⟶ S.X₃` -/
structure RightHomologyData where
  /-- a choice of cokernel of `S.f : S.X₁ ⟶ S.X₂`-/
  Q : C
  /-- a choice of kernel of the induced morphism `S.g' : S.Q ⟶ X₃`-/
  H : C
  /-- the projection from `S.X₂` -/
  p : S.X₂ ⟶ Q
  /-- the inclusion of the (right) homology in the chosen cokernel of `S.f` -/
  ι : H ⟶ Q
  /-- the cokernel condition for `p` -/
  wp : S.f ≫ p = 0
  /-- `p : S.X₂ ⟶ Q` is a cokernel of `S.f : S.X₁ ⟶ S.X₂` -/
  hp : IsColimit (CokernelCofork.ofπ p wp)
  /-- the kernel condition for `ι` -/
  wι : ι ≫ hp.desc (CokernelCofork.ofπ _ S.zero) = 0
  /-- `ι : H ⟶ Q` is a kernel of `S.g' : Q ⟶ S.X₃` -/
  hι : IsLimit (KernelFork.ofι ι wι)
goal: self.H ⟶ self.Q

full_name: CategoryTheory.ShortComplex.RightHomologyData.p
code: /-- A right homology data for a short complex `S` consists of morphisms `p : S.X₂ ⟶ Q` and
`ι : H ⟶ Q` such that `p` identifies `Q` to the kernel of `f : S.X₁ ⟶ S.X₂`,
and that `ι` identifies `H` to the kernel of the induced map `g' : Q ⟶ S.X₃` -/
structure RightHomologyData where
  /-- a choice of cokernel of `S.f : S.X₁ ⟶ S.X₂`-/
  Q : C
  /-- a choice of kernel of the induced morphism `S.g' : S.Q ⟶ X₃`-/
  H : C
  /-- the projection from `S.X₂` -/
  p : S.X₂ ⟶ Q
  /-- the inclusion of the (right) homology in the chosen cokernel of `S.f` -/
  ι : H ⟶ Q
  /-- the cokernel condition for `p` -/
  wp : S.f ≫ p = 0
  /-- `p : S.X₂ ⟶ Q` is a cokernel of `S.f : S.X₁ ⟶ S.X₂` -/
  hp : IsColimit (CokernelCofork.ofπ p wp)
  /-- the kernel condition for `ι` -/
  wι : ι ≫ hp.desc (CokernelCofork.ofπ _ S.zero) = 0
  /-- `ι : H ⟶ Q` is a kernel of `S.g' : Q ⟶ S.X₃` -/
  hι : IsLimit (KernelFork.ofι ι wι)
goal: S.X₂ ⟶ self.Q

full_name: CategoryTheory.ShortComplex.RightHomologyData.hp
code: /-- A right homology data for a short complex `S` consists of morphisms `p : S.X₂ ⟶ Q` and
`ι : H ⟶ Q` such that `p` identifies `Q` to the kernel of `f : S.X₁ ⟶ S.X₂`,
and that `ι` identifies `H` to the kernel of the induced map `g' : Q ⟶ S.X₃` -/
structure RightHomologyData where
  /-- a choice of cokernel of `S.f : S.X₁ ⟶ S.X₂`-/
  Q : C
  /-- a choice of kernel of the induced morphism `S.g' : S.Q ⟶ X₃`-/
  H : C
  /-- the projection from `S.X₂` -/
  p : S.X₂ ⟶ Q
  /-- the inclusion of the (right) homology in the chosen cokernel of `S.f` -/
  ι : H ⟶ Q
  /-- the cokernel condition for `p` -/
  wp : S.f ≫ p = 0
  /-- `p : S.X₂ ⟶ Q` is a cokernel of `S.f : S.X₁ ⟶ S.X₂` -/
  hp : IsColimit (CokernelCofork.ofπ p wp)
  /-- the kernel condition for `ι` -/
  wι : ι ≫ hp.desc (CokernelCofork.ofπ _ S.zero) = 0
  /-- `ι : H ⟶ Q` is a kernel of `S.g' : Q ⟶ S.X₃` -/
  hι : IsLimit (KernelFork.ofι ι wι)
goal: CategoryTheory.Limits.IsColimit (CategoryTheory.Limits.CokernelCofork.ofπ self.p ⋯)

full_name: CategoryTheory.ShortComplex.RightHomologyData.hι
code: /-- A right homology data for a short complex `S` consists of morphisms `p : S.X₂ ⟶ Q` and
`ι : H ⟶ Q` such that `p` identifies `Q` to the kernel of `f : S.X₁ ⟶ S.X₂`,
and that `ι` identifies `H` to the kernel of the induced map `g' : Q ⟶ S.X₃` -/
structure RightHomologyData where
  /-- a choice of cokernel of `S.f : S.X₁ ⟶ S.X₂`-/
  Q : C
  /-- a choice of kernel of the induced morphism `S.g' : S.Q ⟶ X₃`-/
  H : C
  /-- the projection from `S.X₂` -/
  p : S.X₂ ⟶ Q
  /-- the inclusion of the (right) homology in the chosen cokernel of `S.f` -/
  ι : H ⟶ Q
  /-- the cokernel condition for `p` -/
  wp : S.f ≫ p = 0
  /-- `p : S.X₂ ⟶ Q` is a cokernel of `S.f : S.X₁ ⟶ S.X₂` -/
  hp : IsColimit (CokernelCofork.ofπ p wp)
  /-- the kernel condition for `ι` -/
  wι : ι ≫ hp.desc (CokernelCofork.ofπ _ S.zero) = 0
  /-- `ι : H ⟶ Q` is a kernel of `S.g' : Q ⟶ S.X₃` -/
  hι : IsLimit (KernelFork.ofι ι wι)
goal: CategoryTheory.Limits.IsLimit (CategoryTheory.Limits.KernelFork.ofι self.ι ⋯)

full_name: CategoryTheory.ShortComplex.RightHomologyData.Q
code: /-- A right homology data for a short complex `S` consists of morphisms `p : S.X₂ ⟶ Q` and
`ι : H ⟶ Q` such that `p` identifies `Q` to the kernel of `f : S.X₁ ⟶ S.X₂`,
and that `ι` identifies `H` to the kernel of the induced map `g' : Q ⟶ S.X₃` -/
structure RightHomologyData where
  /-- a choice of cokernel of `S.f : S.X₁ ⟶ S.X₂`-/
  Q : C
  /-- a choice of kernel of the induced morphism `S.g' : S.Q ⟶ X₃`-/
  H : C
  /-- the projection from `S.X₂` -/
  p : S.X₂ ⟶ Q
  /-- the inclusion of the (right) homology in the chosen cokernel of `S.f` -/
  ι : H ⟶ Q
  /-- the cokernel condition for `p` -/
  wp : S.f ≫ p = 0
  /-- `p : S.X₂ ⟶ Q` is a cokernel of `S.f : S.X₁ ⟶ S.X₂` -/
  hp : IsColimit (CokernelCofork.ofπ p wp)
  /-- the kernel condition for `ι` -/
  wι : ι ≫ hp.desc (CokernelCofork.ofπ _ S.zero) = 0
  /-- `ι : H ⟶ Q` is a kernel of `S.g' : Q ⟶ S.X₃` -/
  hι : IsLimit (KernelFork.ofι ι wι)
goal: C

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofHasCokernelOfHasKernel_ι
code: /-- The chosen cokernels and kernels of the limits API give a `RightHomologyData` -/
@[simps]
noncomputable def ofHasCokernelOfHasKernel
    [HasCokernel S.f] [HasKernel (cokernel.desc S.f S.g S.zero)] :
    S.RightHomologyData 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofHasCokernelOfHasKernel S).ι =
  CategoryTheory.Limits.kernel.ι (CategoryTheory.Limits.cokernel.desc S.f S.g ⋯)

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofHasCokernelOfHasKernel_Q
code: /-- The chosen cokernels and kernels of the limits API give a `RightHomologyData` -/
@[simps]
noncomputable def ofHasCokernelOfHasKernel
    [HasCokernel S.f] [HasKernel (cokernel.desc S.f S.g S.zero)] :
    S.RightHomologyData 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofHasCokernelOfHasKernel S).Q = CategoryTheory.Limits.cokernel S.f

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofHasCokernelOfHasKernel
code: /-- The chosen cokernels and kernels of the limits API give a `RightHomologyData` -/
@[simps]
noncomputable def ofHasCokernelOfHasKernel
    [HasCokernel S.f] [HasKernel (cokernel.desc S.f S.g S.zero)] :
    S.RightHomologyData 
goal: S.RightHomologyData

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofHasCokernelOfHasKernel_p
code: /-- The chosen cokernels and kernels of the limits API give a `RightHomologyData` -/
@[simps]
noncomputable def ofHasCokernelOfHasKernel
    [HasCokernel S.f] [HasKernel (cokernel.desc S.f S.g S.zero)] :
    S.RightHomologyData 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofHasCokernelOfHasKernel S).p = CategoryTheory.Limits.cokernel.π S.f

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofHasCokernelOfHasKernel_H
code: /-- The chosen cokernels and kernels of the limits API give a `RightHomologyData` -/
@[simps]
noncomputable def ofHasCokernelOfHasKernel
    [HasCokernel S.f] [HasKernel (cokernel.desc S.f S.g S.zero)] :
    S.RightHomologyData 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofHasCokernelOfHasKernel S).H =
  CategoryTheory.Limits.kernel (CategoryTheory.Limits.cokernel.desc S.f S.g ⋯)

full_name: CategoryTheory.ShortComplex.RightHomologyData.instEpiP
code: instance : Epi h.p 
goal: CategoryTheory.Epi h.p

full_name: CategoryTheory.ShortComplex.RightHomologyData.instMonoι
code: instance : Mono h.ι 
goal: CategoryTheory.Mono h.ι

full_name: CategoryTheory.ShortComplex.RightHomologyData.descQ
code: /-- Any morphism `k : S.X₂ ⟶ A` such that `S.f ≫ k = 0` descends
to a morphism `Q ⟶ A` -/
def descQ (k : S.X₂ ⟶ A) (hk : S.f ≫ k = 0) : h.Q ⟶ A 
goal: h.Q ⟶ A

full_name: CategoryTheory.ShortComplex.RightHomologyData.p_descQ
code: @[reassoc (attr := simp)]
lemma p_descQ (k : S.X₂ ⟶ A) (hk : S.f ≫ k = 0) : h.p ≫ h.descQ k hk = k 
goal: CategoryTheory.CategoryStruct.comp h.p (h.descQ k hk) = k

full_name: CategoryTheory.ShortComplex.RightHomologyData.descH
code: /-- The morphism from the (right) homology attached to a morphism
`k : S.X₂ ⟶ A` such that `S.f ≫ k = 0`. -/
@[simp]
def descH (k : S.X₂ ⟶ A) (hk : S.f ≫ k = 0) : h.H ⟶ A 
goal: h.H ⟶ A

full_name: CategoryTheory.ShortComplex.RightHomologyData.g'
code: /-- The morphism `h.Q ⟶ S.X₃` induced by `S.g : S.X₂ ⟶ S.X₃` and the fact that
`h.Q` is a cokernel of `S.f : S.X₁ ⟶ S.X₂`. -/
def g' : h.Q ⟶ S.X₃ 
goal: h.Q ⟶ S.X₃

full_name: CategoryTheory.ShortComplex.RightHomologyData.p_g'
code: @[reassoc (attr := simp)] lemma p_g' : h.p ≫ h.g' = S.g 
goal: CategoryTheory.CategoryStruct.comp h.p h.g' = S.g

full_name: CategoryTheory.ShortComplex.RightHomologyData.ι_g'
code: @[reassoc (attr := simp)] lemma ι_g' : h.ι ≫ h.g' = 0 
goal: CategoryTheory.CategoryStruct.comp h.ι h.g' = 0

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

full_name: CategoryTheory.ShortComplex.RightHomologyData.hι'
code: /-- For `h : S.RightHomologyData`, this is a restatement of `h.hι`, saying that
`ι : h.H ⟶ h.Q` is a kernel of `h.g' : h.Q ⟶ S.X₃`. -/
def hι' : IsLimit (KernelFork.ofι h.ι h.ι_g') 
goal: CategoryTheory.Limits.IsLimit (CategoryTheory.Limits.KernelFork.ofι h.ι ⋯)

full_name: CategoryTheory.ShortComplex.RightHomologyData.liftH
code: /-- The morphism `A ⟶ H` induced by a morphism `k : A ⟶ Q` such that `k ≫ g' = 0` -/
def liftH (k : A ⟶ h.Q) (hk : k ≫ h.g' = 0) : A ⟶ h.H 
goal: A ⟶ h.H

full_name: CategoryTheory.ShortComplex.RightHomologyData.liftH_ι
code: @[reassoc (attr := simp)]
lemma liftH_ι (k : A ⟶ h.Q) (hk : k ≫ h.g' = 0) : h.liftH k hk ≫ h.ι = k 
goal: CategoryTheory.CategoryStruct.comp (h.liftH k hk) h.ι = k

full_name: CategoryTheory.ShortComplex.RightHomologyData.isIso_p
code: lemma isIso_p (hf : S.f = 0) : IsIso h.p 
goal: CategoryTheory.IsIso h.p

full_name: CategoryTheory.ShortComplex.RightHomologyData.isIso_ι
code: lemma isIso_ι (hg : S.g = 0) : IsIso h.ι 
goal: CategoryTheory.IsIso h.ι

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofIsLimitKernelFork
code: /-- When the first map `S.f` is zero, this is the right 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.RightHomologyData 
goal: S.RightHomologyData

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofIsLimitKernelFork_ι
code: /-- When the first map `S.f` is zero, this is the right 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.RightHomologyData 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofIsLimitKernelFork S hf c hc).ι = CategoryTheory.Limits.Fork.ι c

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofIsLimitKernelFork_p
code: /-- When the first map `S.f` is zero, this is the right 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.RightHomologyData 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofIsLimitKernelFork S hf c hc).p = CategoryTheory.CategoryStruct.id S.X₂

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofIsLimitKernelFork_Q
code: /-- When the first map `S.f` is zero, this is the right 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.RightHomologyData 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofIsLimitKernelFork S hf c hc).Q = S.X₂

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofIsLimitKernelFork_H
code: /-- When the first map `S.f` is zero, this is the right 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.RightHomologyData 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofIsLimitKernelFork S hf c hc).H = c.pt

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofIsLimitKernelFork_g'
code: @[simp] lemma ofIsLimitKernelFork_g' (hf : S.f = 0) (c : KernelFork S.g)
    (hc : IsLimit c) : (ofIsLimitKernelFork S hf c hc).g' = S.g 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofIsLimitKernelFork S hf c hc).g' = S.g

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

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

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

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

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

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

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

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

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

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

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofIsColimitCokernelCofork_g'
code: @[simp] lemma ofIsColimitCokernelCofork_g' (hg : S.g = 0) (c : CokernelCofork S.f)
  (hc : IsColimit c) : (ofIsColimitCokernelCofork S hg c hc).g' = 0 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofIsColimitCokernelCofork S hg c hc).g' = 0

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

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

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

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

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

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

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofZeros_g'
code: @[simp]
lemma ofZeros_g' (hf : S.f = 0) (hg : S.g = 0) :
    (ofZeros S hf hg).g' = 0 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofZeros S hf hg).g' = 0

full_name: CategoryTheory.ShortComplex.HasRightHomology
code: /-- A short complex `S` has right homology when there exists a `S.RightHomologyData` -/
class HasRightHomology : Prop where
  condition : Nonempty S.RightHomologyData
goal: Prop

full_name: CategoryTheory.ShortComplex.HasRightHomology.condition
code: /-- A short complex `S` has right homology when there exists a `S.RightHomologyData` -/
class HasRightHomology : Prop where
  condition : Nonempty S.RightHomologyData
goal: Nonempty S.RightHomologyData

full_name: CategoryTheory.ShortComplex.rightHomologyData
code: /-- A chosen `S.RightHomologyData` for a short complex `S` that has right homology -/
noncomputable def rightHomologyData [HasRightHomology S] :
  S.RightHomologyData 
goal: S.RightHomologyData

full_name: CategoryTheory.ShortComplex.HasRightHomology.mk'
code: lemma mk' (h : S.RightHomologyData) : HasRightHomology S 
goal: S.HasRightHomology

full_name: CategoryTheory.ShortComplex.HasRightHomology.of_hasCokernel_of_hasKernel
code: instance of_hasCokernel_of_hasKernel
    [HasCokernel S.f] [HasKernel (cokernel.desc S.f S.g S.zero)] :
  S.HasRightHomology 
goal: S.HasRightHomology

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

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

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

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

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

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

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

full_name: CategoryTheory.ShortComplex.RightHomologyData.op_K
code: /-- A right homology data for a short complex `S` induces a left homology data for `S.op`. -/
@[simps]
def op (h : S.RightHomologyData) : S.op.LeftHomologyData 
goal: h.op.K = Opposite.op h.Q

full_name: CategoryTheory.ShortComplex.RightHomologyData.op_f'
code: @[simp] lemma op_f' (h : S.RightHomologyData) :
    h.op.f' = h.g'.op 
goal: h.op.f' = h.g'.op

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

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

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

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

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

full_name: CategoryTheory.ShortComplex.RightHomologyData.unop_f'
code: @[simp] lemma unop_f' {S : ShortComplex Cᵒᵖ} (h : S.RightHomologyData) :
    h.unop.f' = h.g'.unop 
goal: h.unop.f' = h.g'.unop

full_name: CategoryTheory.ShortComplex.LeftHomologyData.op_Q
code: /-- A left homology data for a short complex `S` induces a right homology data for `S.op`. -/
@[simps]
def op (h : S.LeftHomologyData) : S.op.RightHomologyData 
goal: h.op.Q = Opposite.op h.K

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

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

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

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

full_name: CategoryTheory.ShortComplex.LeftHomologyData.op_g'
code: @[simp] lemma op_g' (h : S.LeftHomologyData) :
    h.op.g' = h.f'.op 
goal: h.op.g' = h.f'.op

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

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

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

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

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

full_name: CategoryTheory.ShortComplex.LeftHomologyData.unop_g'
code: @[simp] lemma unop_g' {S : ShortComplex Cᵒᵖ} (h : S.LeftHomologyData) :
    h.unop.g' = h.f'.unop 
goal: h.unop.g' = h.f'.unop

full_name: CategoryTheory.ShortComplex.instHasRightHomologyOppositeOpOfHasLeftHomology
code: instance [S.HasLeftHomology] : HasRightHomology S.op 
goal: S.op.HasRightHomology

full_name: CategoryTheory.ShortComplex.instHasLeftHomologyOppositeOpOfHasRightHomology
code: instance [S.HasRightHomology] : HasLeftHomology S.op 
goal: S.op.HasLeftHomology

full_name: CategoryTheory.ShortComplex.hasLeftHomology_iff_op
code: lemma hasLeftHomology_iff_op (S : ShortComplex C) :
    S.HasLeftHomology ↔ S.op.HasRightHomology 
goal: S.HasLeftHomology ↔ S.op.HasRightHomology

full_name: CategoryTheory.ShortComplex.hasRightHomology_iff_op
code: lemma hasRightHomology_iff_op (S : ShortComplex C) :
    S.HasRightHomology ↔ S.op.HasLeftHomology 
goal: S.HasRightHomology ↔ S.op.HasLeftHomology

full_name: CategoryTheory.ShortComplex.hasLeftHomology_iff_unop
code: lemma hasLeftHomology_iff_unop (S : ShortComplex Cᵒᵖ) :
    S.HasLeftHomology ↔ S.unop.HasRightHomology 
goal: S.HasLeftHomology ↔ S.unop.HasRightHomology

full_name: CategoryTheory.ShortComplex.hasRightHomology_iff_unop
code: lemma hasRightHomology_iff_unop (S : ShortComplex Cᵒᵖ) :
    S.HasRightHomology ↔ S.unop.HasLeftHomology 
goal: S.HasRightHomology ↔ S.unop.HasLeftHomology

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.commι
code: /-- Given right homology data `h₁` and `h₂` for two short complexes `S₁` and `S₂`,
a `RightHomologyMapData` for a morphism `φ : S₁ ⟶ S₂`
consists of a description of the induced morphisms on the `Q` (opcycles)
and `H` (right homology) fields of `h₁` and `h₂`. -/
structure RightHomologyMapData where
  /-- the induced map on opcycles -/
  φQ : h₁.Q ⟶ h₂.Q
  /-- the induced map on right homology -/
  φH : h₁.H ⟶ h₂.H
  /-- commutation with `p` -/
  commp : h₁.p ≫ φQ = φ.τ₂ ≫ h₂.p := by aesop_cat
  /-- commutation with `g'` -/
  commg' : φQ ≫ h₂.g' = h₁.g' ≫ φ.τ₃ := by aesop_cat
  /-- commutation with `ι` -/
  commι : φH ≫ h₂.ι = h₁.ι ≫ φQ := by aesop_cat
goal: CategoryTheory.CategoryStruct.comp self.φH h₂.ι = CategoryTheory.CategoryStruct.comp h₁.ι self.φQ

full_name: CategoryTheory.ShortComplex.RightHomologyMapData
code: /-- Given right homology data `h₁` and `h₂` for two short complexes `S₁` and `S₂`,
a `RightHomologyMapData` for a morphism `φ : S₁ ⟶ S₂`
consists of a description of the induced morphisms on the `Q` (opcycles)
and `H` (right homology) fields of `h₁` and `h₂`. -/
structure RightHomologyMapData where
  /-- the induced map on opcycles -/
  φQ : h₁.Q ⟶ h₂.Q
  /-- the induced map on right homology -/
  φH : h₁.H ⟶ h₂.H
  /-- commutation with `p` -/
  commp : h₁.p ≫ φQ = φ.τ₂ ≫ h₂.p := by aesop_cat
  /-- commutation with `g'` -/
  commg' : φQ ≫ h₂.g' = h₁.g' ≫ φ.τ₃ := by aesop_cat
  /-- commutation with `ι` -/
  commι : φH ≫ h₂.ι = h₁.ι ≫ φQ := by aesop_cat
goal: Type u_2

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.commp
code: /-- Given right homology data `h₁` and `h₂` for two short complexes `S₁` and `S₂`,
a `RightHomologyMapData` for a morphism `φ : S₁ ⟶ S₂`
consists of a description of the induced morphisms on the `Q` (opcycles)
and `H` (right homology) fields of `h₁` and `h₂`. -/
structure RightHomologyMapData where
  /-- the induced map on opcycles -/
  φQ : h₁.Q ⟶ h₂.Q
  /-- the induced map on right homology -/
  φH : h₁.H ⟶ h₂.H
  /-- commutation with `p` -/
  commp : h₁.p ≫ φQ = φ.τ₂ ≫ h₂.p := by aesop_cat
  /-- commutation with `g'` -/
  commg' : φQ ≫ h₂.g' = h₁.g' ≫ φ.τ₃ := by aesop_cat
  /-- commutation with `ι` -/
  commι : φH ≫ h₂.ι = h₁.ι ≫ φQ := by aesop_cat
goal: CategoryTheory.CategoryStruct.comp h₁.p self.φQ = CategoryTheory.CategoryStruct.comp φ.τ₂ h₂.p

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.φQ
code: /-- Given right homology data `h₁` and `h₂` for two short complexes `S₁` and `S₂`,
a `RightHomologyMapData` for a morphism `φ : S₁ ⟶ S₂`
consists of a description of the induced morphisms on the `Q` (opcycles)
and `H` (right homology) fields of `h₁` and `h₂`. -/
structure RightHomologyMapData where
  /-- the induced map on opcycles -/
  φQ : h₁.Q ⟶ h₂.Q
  /-- the induced map on right homology -/
  φH : h₁.H ⟶ h₂.H
  /-- commutation with `p` -/
  commp : h₁.p ≫ φQ = φ.τ₂ ≫ h₂.p := by aesop_cat
  /-- commutation with `g'` -/
  commg' : φQ ≫ h₂.g' = h₁.g' ≫ φ.τ₃ := by aesop_cat
  /-- commutation with `ι` -/
  commι : φH ≫ h₂.ι = h₁.ι ≫ φQ := by aesop_cat
goal: h₁.Q ⟶ h₂.Q

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.φH
code: /-- Given right homology data `h₁` and `h₂` for two short complexes `S₁` and `S₂`,
a `RightHomologyMapData` for a morphism `φ : S₁ ⟶ S₂`
consists of a description of the induced morphisms on the `Q` (opcycles)
and `H` (right homology) fields of `h₁` and `h₂`. -/
structure RightHomologyMapData where
  /-- the induced map on opcycles -/
  φQ : h₁.Q ⟶ h₂.Q
  /-- the induced map on right homology -/
  φH : h₁.H ⟶ h₂.H
  /-- commutation with `p` -/
  commp : h₁.p ≫ φQ = φ.τ₂ ≫ h₂.p := by aesop_cat
  /-- commutation with `g'` -/
  commg' : φQ ≫ h₂.g' = h₁.g' ≫ φ.τ₃ := by aesop_cat
  /-- commutation with `ι` -/
  commι : φH ≫ h₂.ι = h₁.ι ≫ φQ := by aesop_cat
goal: h₁.H ⟶ h₂.H

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.commg'
code: /-- Given right homology data `h₁` and `h₂` for two short complexes `S₁` and `S₂`,
a `RightHomologyMapData` for a morphism `φ : S₁ ⟶ S₂`
consists of a description of the induced morphisms on the `Q` (opcycles)
and `H` (right homology) fields of `h₁` and `h₂`. -/
structure RightHomologyMapData where
  /-- the induced map on opcycles -/
  φQ : h₁.Q ⟶ h₂.Q
  /-- the induced map on right homology -/
  φH : h₁.H ⟶ h₂.H
  /-- commutation with `p` -/
  commp : h₁.p ≫ φQ = φ.τ₂ ≫ h₂.p := by aesop_cat
  /-- commutation with `g'` -/
  commg' : φQ ≫ h₂.g' = h₁.g' ≫ φ.τ₃ := by aesop_cat
  /-- commutation with `ι` -/
  commι : φH ≫ h₂.ι = h₁.ι ≫ φQ := by aesop_cat
goal: CategoryTheory.CategoryStruct.comp self.φQ h₂.g' = CategoryTheory.CategoryStruct.comp h₁.g' φ.τ₃

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

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

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

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

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

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

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

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

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

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

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

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

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

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.congr_φQ
code: lemma congr_φQ {γ₁ γ₂ : RightHomologyMapData φ h₁ h₂} (eq : γ₁ = γ₂) : γ₁.φQ = γ₂.φQ 
goal: γ₁.φQ = γ₂.φQ

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.ofZeros
code: /-- When `S₁.f`, `S₁.g`, `S₂.f` and `S₂.g` are all zero, the action on right 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) :
    RightHomologyMapData φ (RightHomologyData.ofZeros S₁ hf₁ hg₁)
    (RightHomologyData.ofZeros S₂ hf₂ hg₂) 
goal: CategoryTheory.ShortComplex.RightHomologyMapData φ (CategoryTheory.ShortComplex.RightHomologyData.ofZeros S₁ hf₁ hg₁)
  (CategoryTheory.ShortComplex.RightHomologyData.ofZeros S₂ hf₂ hg₂)

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.ofZeros_φQ
code: /-- When `S₁.f`, `S₁.g`, `S₂.f` and `S₂.g` are all zero, the action on right 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) :
    RightHomologyMapData φ (RightHomologyData.ofZeros S₁ hf₁ hg₁)
    (RightHomologyData.ofZeros S₂ hf₂ hg₂) 
goal: (CategoryTheory.ShortComplex.RightHomologyMapData.ofZeros φ hf₁ hg₁ hf₂ hg₂).φQ = φ.τ₂

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.ofZeros_φH
code: /-- When `S₁.f`, `S₁.g`, `S₂.f` and `S₂.g` are all zero, the action on right 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) :
    RightHomologyMapData φ (RightHomologyData.ofZeros S₁ hf₁ hg₁)
    (RightHomologyData.ofZeros S₂ hf₂ hg₂) 
goal: (CategoryTheory.ShortComplex.RightHomologyMapData.ofZeros φ hf₁ hg₁ hf₂ hg₂).φH = φ.τ₂

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.ofIsLimitKernelFork_φH
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 right 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₂.ι) :
    RightHomologyMapData φ (RightHomologyData.ofIsLimitKernelFork S₁ hf₁ c₁ hc₁)
      (RightHomologyData.ofIsLimitKernelFork S₂ hf₂ c₂ hc₂) 
goal: (CategoryTheory.ShortComplex.RightHomologyMapData.ofIsLimitKernelFork φ hf₁ c₁ hc₁ hf₂ c₂ hc₂ f comm).φH = f

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.ofIsLimitKernelFork_φQ
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 right 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₂.ι) :
    RightHomologyMapData φ (RightHomologyData.ofIsLimitKernelFork S₁ hf₁ c₁ hc₁)
      (RightHomologyData.ofIsLimitKernelFork S₂ hf₂ c₂ hc₂) 
goal: (CategoryTheory.ShortComplex.RightHomologyMapData.ofIsLimitKernelFork φ hf₁ c₁ hc₁ hf₂ c₂ hc₂ f comm).φQ = φ.τ₂

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.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 right 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₂.ι) :
    RightHomologyMapData φ (RightHomologyData.ofIsLimitKernelFork S₁ hf₁ c₁ hc₁)
      (RightHomologyData.ofIsLimitKernelFork S₂ hf₂ c₂ hc₂) 
goal: CategoryTheory.ShortComplex.RightHomologyMapData φ
  (CategoryTheory.ShortComplex.RightHomologyData.ofIsLimitKernelFork S₁ hf₁ c₁ hc₁)
  (CategoryTheory.ShortComplex.RightHomologyData.ofIsLimitKernelFork S₂ hf₂ c₂ hc₂)

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.ofIsColimitCokernelCofork_φQ
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 right 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) :
    RightHomologyMapData φ (RightHomologyData.ofIsColimitCokernelCofork S₁ hg₁ c₁ hc₁)
      (RightHomologyData.ofIsColimitCokernelCofork S₂ hg₂ c₂ hc₂) 
goal: (CategoryTheory.ShortComplex.RightHomologyMapData.ofIsColimitCokernelCofork φ hg₁ c₁ hc₁ hg₂ c₂ hc₂ f comm).φQ = f

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.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 right 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) :
    RightHomologyMapData φ (RightHomologyData.ofIsColimitCokernelCofork S₁ hg₁ c₁ hc₁)
      (RightHomologyData.ofIsColimitCokernelCofork S₂ hg₂ c₂ hc₂) 
goal: CategoryTheory.ShortComplex.RightHomologyMapData φ
  (CategoryTheory.ShortComplex.RightHomologyData.ofIsColimitCokernelCofork S₁ hg₁ c₁ hc₁)
  (CategoryTheory.ShortComplex.RightHomologyData.ofIsColimitCokernelCofork S₂ hg₂ c₂ hc₂)

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.ofIsColimitCokernelCofork_φH
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 right 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) :
    RightHomologyMapData φ (RightHomologyData.ofIsColimitCokernelCofork S₁ hg₁ c₁ hc₁)
      (RightHomologyData.ofIsColimitCokernelCofork S₂ hg₂ c₂ hc₂) 
goal: (CategoryTheory.ShortComplex.RightHomologyMapData.ofIsColimitCokernelCofork φ hg₁ c₁ hc₁ hg₂ c₂ hc₂ f comm).φH = f

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

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

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

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

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.compatibilityOfZerosOfIsColimitCokernelCofork_φH
code: /-- When both maps `S.f` and `S.g` of a short complex `S` are zero, this is the right homology map
data (for the identity of `S`) which relates the right homology data `ofZeros` and
`ofIsColimitCokernelCofork`. -/
@[simps]
def compatibilityOfZerosOfIsColimitCokernelCofork (hf : S.f = 0) (hg : S.g = 0)
    (c : CokernelCofork S.f) (hc : IsColimit c) :
    RightHomologyMapData (𝟙 S)
      (RightHomologyData.ofZeros S hf hg)
      (RightHomologyData.ofIsColimitCokernelCofork S hg c hc) 
goal: (CategoryTheory.ShortComplex.RightHomologyMapData.compatibilityOfZerosOfIsColimitCokernelCofork S hf hg c hc).φH =
  CategoryTheory.Limits.Cofork.π c

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.compatibilityOfZerosOfIsColimitCokernelCofork_φQ
code: /-- When both maps `S.f` and `S.g` of a short complex `S` are zero, this is the right homology map
data (for the identity of `S`) which relates the right homology data `ofZeros` and
`ofIsColimitCokernelCofork`. -/
@[simps]
def compatibilityOfZerosOfIsColimitCokernelCofork (hf : S.f = 0) (hg : S.g = 0)
    (c : CokernelCofork S.f) (hc : IsColimit c) :
    RightHomologyMapData (𝟙 S)
      (RightHomologyData.ofZeros S hf hg)
      (RightHomologyData.ofIsColimitCokernelCofork S hg c hc) 
goal: (CategoryTheory.ShortComplex.RightHomologyMapData.compatibilityOfZerosOfIsColimitCokernelCofork S hf hg c hc).φQ =
  CategoryTheory.Limits.Cofork.π c

full_name: CategoryTheory.ShortComplex.rightHomology
code: /-- The right homology of a short complex,
given by the `H` field of a chosen right homology data. -/
noncomputable def rightHomology : C 
goal: C

full_name: CategoryTheory.ShortComplex.opcycles
code: /-- The "opcycles" of a short complex, given by the `Q` field of a chosen right homology data.
This is the dual notion to cycles. -/
noncomputable def opcycles : C 
goal: C

full_name: CategoryTheory.ShortComplex.rightHomologyι
code: /-- The canonical map `S.rightHomology ⟶ S.opcycles`. -/
noncomputable def rightHomologyι : S.rightHomology ⟶ S.opcycles 
goal: S.rightHomology ⟶ S.opcycles

full_name: CategoryTheory.ShortComplex.pOpcycles
code: /-- The projection `S.X₂ ⟶ S.opcycles`. -/
noncomputable def pOpcycles : S.X₂ ⟶ S.opcycles 
goal: S.X₂ ⟶ S.opcycles

full_name: CategoryTheory.ShortComplex.fromOpcycles
code: /-- The canonical map `S.opcycles ⟶ X₃`. -/
noncomputable def fromOpcycles : S.opcycles ⟶ S.X₃ 
goal: S.opcycles ⟶ S.X₃

full_name: CategoryTheory.ShortComplex.f_pOpcycles
code: @[reassoc (attr := simp)]
lemma f_pOpcycles : S.f ≫ S.pOpcycles = 0 
goal: CategoryTheory.CategoryStruct.comp S.f S.pOpcycles = 0

full_name: CategoryTheory.ShortComplex.p_fromOpcycles
code: @[reassoc (attr := simp)]
lemma p_fromOpcycles : S.pOpcycles ≫ S.fromOpcycles = S.g 
goal: CategoryTheory.CategoryStruct.comp S.pOpcycles S.fromOpcycles = S.g

full_name: CategoryTheory.ShortComplex.instEpiPOpcycles
code: instance : Epi S.pOpcycles 
goal: CategoryTheory.Epi S.pOpcycles

full_name: CategoryTheory.ShortComplex.instMonoRightHomologyι
code: instance : Mono S.rightHomologyι 
goal: CategoryTheory.Mono S.rightHomologyι

full_name: CategoryTheory.ShortComplex.rightHomology_ext_iff
code: lemma rightHomology_ext_iff {A : C} (f₁ f₂ : A ⟶ S.rightHomology) :
    f₁ = f₂ ↔ f₁ ≫ S.rightHomologyι = f₂ ≫ S.rightHomologyι 
goal: f₁ = f₂ ↔
  CategoryTheory.CategoryStruct.comp f₁ S.rightHomologyι = CategoryTheory.CategoryStruct.comp f₂ S.rightHomologyι

full_name: CategoryTheory.ShortComplex.rightHomology_ext
code: @[ext]
lemma rightHomology_ext {A : C} (f₁ f₂ : A ⟶ S.rightHomology)
    (h : f₁ ≫ S.rightHomologyι = f₂ ≫ S.rightHomologyι) : f₁ = f₂ 
goal: f₁ = f₂

full_name: CategoryTheory.ShortComplex.opcycles_ext_iff
code: lemma opcycles_ext_iff {A : C} (f₁ f₂ : S.opcycles ⟶ A) :
    f₁ = f₂ ↔ S.pOpcycles ≫ f₁ = S.pOpcycles ≫ f₂ 
goal: f₁ = f₂ ↔ CategoryTheory.CategoryStruct.comp S.pOpcycles f₁ = CategoryTheory.CategoryStruct.comp S.pOpcycles f₂

full_name: CategoryTheory.ShortComplex.opcycles_ext
code: @[ext]
lemma opcycles_ext {A : C} (f₁ f₂ : S.opcycles ⟶ A)
    (h : S.pOpcycles ≫ f₁ = S.pOpcycles ≫ f₂) : f₁ = f₂ 
goal: f₁ = f₂

full_name: CategoryTheory.ShortComplex.isIso_pOpcycles
code: lemma isIso_pOpcycles (hf : S.f = 0) : IsIso S.pOpcycles 
goal: CategoryTheory.IsIso S.pOpcycles

full_name: CategoryTheory.ShortComplex.opcyclesIsoX₂
code: /-- When `S.f = 0`, this is the canonical isomorphism `S.opcycles ≅ S.X₂`
induced by `S.pOpcycles`. -/
@[simps! inv]
noncomputable def opcyclesIsoX₂ (hf : S.f = 0) : S.opcycles ≅ S.X₂ 
goal: S.opcycles ≅ S.X₂

full_name: CategoryTheory.ShortComplex.opcyclesIsoX₂_inv
code: /-- When `S.f = 0`, this is the canonical isomorphism `S.opcycles ≅ S.X₂`
induced by `S.pOpcycles`. -/
@[simps! inv]
noncomputable def opcyclesIsoX₂ (hf : S.f = 0) : S.opcycles ≅ S.X₂ 
goal: (S.opcyclesIsoX₂ hf).inv = S.pOpcycles

full_name: CategoryTheory.ShortComplex.opcyclesIsoX₂_inv_hom_id
code: @[reassoc (attr := simp)]
lemma opcyclesIsoX₂_inv_hom_id (hf : S.f = 0) :
    S.pOpcycles ≫ (S.opcyclesIsoX₂ hf).hom = 𝟙 _ 
goal: CategoryTheory.CategoryStruct.comp S.pOpcycles (S.opcyclesIsoX₂ hf).hom = CategoryTheory.CategoryStruct.id S.X₂

full_name: CategoryTheory.ShortComplex.opcyclesIsoX₂_hom_inv_id
code: @[reassoc (attr := simp)]
lemma opcyclesIsoX₂_hom_inv_id (hf : S.f = 0) :
    (S.opcyclesIsoX₂ hf).hom ≫ S.pOpcycles = 𝟙 _ 
goal: CategoryTheory.CategoryStruct.comp (S.opcyclesIsoX₂ hf).hom S.pOpcycles = CategoryTheory.CategoryStruct.id S.opcycles

full_name: CategoryTheory.ShortComplex.isIso_rightHomologyι
code: lemma isIso_rightHomologyι (hg : S.g = 0) : IsIso S.rightHomologyι 
goal: CategoryTheory.IsIso S.rightHomologyι

full_name: CategoryTheory.ShortComplex.opcyclesIsoRightHomology_inv
code: /-- When `S.g = 0`, this is the canonical isomorphism `S.opcycles ≅ S.rightHomology` induced
by `S.rightHomologyι`. -/
@[simps! inv]
noncomputable def opcyclesIsoRightHomology (hg : S.g = 0) : S.opcycles ≅ S.rightHomology 
goal: (S.opcyclesIsoRightHomology hg).inv = S.rightHomologyι

full_name: CategoryTheory.ShortComplex.opcyclesIsoRightHomology
code: /-- When `S.g = 0`, this is the canonical isomorphism `S.opcycles ≅ S.rightHomology` induced
by `S.rightHomologyι`. -/
@[simps! inv]
noncomputable def opcyclesIsoRightHomology (hg : S.g = 0) : S.opcycles ≅ S.rightHomology 
goal: S.opcycles ≅ S.rightHomology

full_name: CategoryTheory.ShortComplex.opcyclesIsoRightHomology_inv_hom_id
code: @[reassoc (attr := simp)]
lemma opcyclesIsoRightHomology_inv_hom_id (hg : S.g = 0) :
    S.rightHomologyι ≫ (S.opcyclesIsoRightHomology hg).hom = 𝟙 _ 
goal: CategoryTheory.CategoryStruct.comp S.rightHomologyι (S.opcyclesIsoRightHomology hg).hom =
  CategoryTheory.CategoryStruct.id S.rightHomology

full_name: CategoryTheory.ShortComplex.opcyclesIsoRightHomology_hom_inv_id
code: @[reassoc (attr := simp)]
lemma opcyclesIsoRightHomology_hom_inv_id (hg : S.g = 0) :
    (S.opcyclesIsoRightHomology hg).hom ≫ S.rightHomologyι  = 𝟙 _ 
goal: CategoryTheory.CategoryStruct.comp (S.opcyclesIsoRightHomology hg).hom S.rightHomologyι =
  CategoryTheory.CategoryStruct.id S.opcycles

full_name: CategoryTheory.ShortComplex.rightHomologyMapData
code: /-- The (unique) right homology map data associated to a morphism of short complexes that
are both equipped with right homology data. -/
def rightHomologyMapData : RightHomologyMapData φ h₁ h₂ 
goal: CategoryTheory.ShortComplex.RightHomologyMapData φ h₁ h₂

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

full_name: CategoryTheory.ShortComplex.opcyclesMap'
code: /-- Given a morphism `φ : S₁ ⟶ S₂` of short complexes and right homology data `h₁` and `h₂`
for `S₁` and `S₂` respectively, this is the induced morphism `h₁.K ⟶ h₁.K` on opcycles. -/
def opcyclesMap' : h₁.Q ⟶ h₂.Q 
goal: h₁.Q ⟶ h₂.Q

full_name: CategoryTheory.ShortComplex.p_opcyclesMap'
code: @[reassoc (attr := simp)]
lemma p_opcyclesMap' : h₁.p ≫ opcyclesMap' φ h₁ h₂ = φ.τ₂ ≫ h₂.p 
goal: CategoryTheory.CategoryStruct.comp h₁.p (CategoryTheory.ShortComplex.opcyclesMap' φ h₁ h₂) =
  CategoryTheory.CategoryStruct.comp φ.τ₂ h₂.p

full_name: CategoryTheory.ShortComplex.opcyclesMap'_g'
code: @[reassoc (attr := simp)]
lemma opcyclesMap'_g' : opcyclesMap' φ h₁ h₂ ≫ h₂.g' = h₁.g' ≫ φ.τ₃ 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.opcyclesMap' φ h₁ h₂) h₂.g' =
  CategoryTheory.CategoryStruct.comp h₁.g' φ.τ₃

full_name: CategoryTheory.ShortComplex.rightHomologyι_naturality'
code: @[reassoc (attr := simp)]
lemma rightHomologyι_naturality' :
    rightHomologyMap' φ h₁ h₂ ≫ h₂.ι = h₁.ι ≫ opcyclesMap' φ h₁ h₂ 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.rightHomologyMap' φ h₁ h₂) h₂.ι =
  CategoryTheory.CategoryStruct.comp h₁.ι (CategoryTheory.ShortComplex.opcyclesMap' φ h₁ h₂)

full_name: CategoryTheory.ShortComplex.rightHomologyMap
code: /-- The (right) homology map `S₁.rightHomology ⟶ S₂.rightHomology` induced by a morphism
`S₁ ⟶ S₂` of short complexes. -/
noncomputable def rightHomologyMap : S₁.rightHomology ⟶ S₂.rightHomology 
goal: S₁.rightHomology ⟶ S₂.rightHomology

full_name: CategoryTheory.ShortComplex.opcyclesMap
code: /-- The morphism `S₁.opcycles ⟶ S₂.opcycles` induced by a morphism `S₁ ⟶ S₂` of short complexes. -/
noncomputable def opcyclesMap : S₁.opcycles ⟶ S₂.opcycles 
goal: S₁.opcycles ⟶ S₂.opcycles

full_name: CategoryTheory.ShortComplex.p_opcyclesMap
code: @[reassoc (attr := simp)]
lemma p_opcyclesMap : S₁.pOpcycles ≫ opcyclesMap φ = φ.τ₂ ≫ S₂.pOpcycles 
goal: CategoryTheory.CategoryStruct.comp S₁.pOpcycles (CategoryTheory.ShortComplex.opcyclesMap φ) =
  CategoryTheory.CategoryStruct.comp φ.τ₂ S₂.pOpcycles

full_name: CategoryTheory.ShortComplex.fromOpcycles_naturality
code: @[reassoc (attr := simp)]
lemma fromOpcycles_naturality : opcyclesMap φ ≫ S₂.fromOpcycles = S₁.fromOpcycles ≫ φ.τ₃ 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.opcyclesMap φ) S₂.fromOpcycles =
  CategoryTheory.CategoryStruct.comp S₁.fromOpcycles φ.τ₃

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

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.rightHomologyMap'_eq
code: lemma rightHomologyMap'_eq : rightHomologyMap' φ h₁ h₂ = γ.φH 
goal: CategoryTheory.ShortComplex.rightHomologyMap' φ h₁ h₂ = γ.φH

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

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

full_name: CategoryTheory.ShortComplex.opcyclesMap'_id
code: @[simp]
lemma opcyclesMap'_id (h : S.RightHomologyData) :
    opcyclesMap' (𝟙 S) h h = 𝟙 _ 
goal: CategoryTheory.ShortComplex.opcyclesMap' (CategoryTheory.CategoryStruct.id S) h h = CategoryTheory.CategoryStruct.id h.Q

full_name: CategoryTheory.ShortComplex.rightHomologyMap_id
code: @[simp]
lemma rightHomologyMap_id [HasRightHomology S] :
    rightHomologyMap (𝟙 S) = 𝟙 _ 
goal: CategoryTheory.ShortComplex.rightHomologyMap (CategoryTheory.CategoryStruct.id S) =
  CategoryTheory.CategoryStruct.id S.rightHomology

full_name: CategoryTheory.ShortComplex.opcyclesMap_id
code: @[simp]
lemma opcyclesMap_id [HasRightHomology S] :
    opcyclesMap (𝟙 S) = 𝟙 _ 
goal: CategoryTheory.ShortComplex.opcyclesMap (CategoryTheory.CategoryStruct.id S) =
  CategoryTheory.CategoryStruct.id S.opcycles

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

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

full_name: CategoryTheory.ShortComplex.rightHomologyMap_zero
code: @[simp]
lemma rightHomologyMap_zero [HasRightHomology S₁] [HasRightHomology S₂] :
    rightHomologyMap (0 : S₁ ⟶ S₂) = 0 
goal: CategoryTheory.ShortComplex.rightHomologyMap 0 = 0

full_name: CategoryTheory.ShortComplex.opcyclesMap_zero
code: @[simp]
lemma opcyclesMap_zero [HasRightHomology S₁] [HasRightHomology S₂] :
    opcyclesMap (0 : S₁ ⟶ S₂) = 0 
goal: CategoryTheory.ShortComplex.opcyclesMap 0 = 0

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

full_name: CategoryTheory.ShortComplex.opcyclesMap'_comp
code: @[reassoc]
lemma opcyclesMap'_comp (φ₁ : S₁ ⟶ S₂) (φ₂ : S₂ ⟶ S₃)
    (h₁ : S₁.RightHomologyData) (h₂ : S₂.RightHomologyData) (h₃ : S₃.RightHomologyData) :
    opcyclesMap' (φ₁ ≫ φ₂) h₁ h₃ = opcyclesMap' φ₁ h₁ h₂ ≫ opcyclesMap' φ₂ h₂ h₃ 
goal: CategoryTheory.ShortComplex.opcyclesMap' (CategoryTheory.CategoryStruct.comp φ₁ φ₂) h₁ h₃ =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.opcyclesMap' φ₁ h₁ h₂)
    (CategoryTheory.ShortComplex.opcyclesMap' φ₂ h₂ h₃)

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

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

full_name: CategoryTheory.ShortComplex.rightHomologyMapIso'_inv
code: /-- An isomorphism of short complexes `S₁ ≅ S₂` induces an isomorphism on the `H` fields
of right homology data of `S₁` and `S₂`. -/
@[simps]
def rightHomologyMapIso' (e : S₁ ≅ S₂) (h₁ : S₁.RightHomologyData)
    (h₂ : S₂.RightHomologyData) : h₁.H ≅ h₂.H 
goal: (CategoryTheory.ShortComplex.rightHomologyMapIso' e h₁ h₂).inv =
  CategoryTheory.ShortComplex.rightHomologyMap' e.inv h₂ h₁

full_name: CategoryTheory.ShortComplex.rightHomologyMapIso'_hom
code: /-- An isomorphism of short complexes `S₁ ≅ S₂` induces an isomorphism on the `H` fields
of right homology data of `S₁` and `S₂`. -/
@[simps]
def rightHomologyMapIso' (e : S₁ ≅ S₂) (h₁ : S₁.RightHomologyData)
    (h₂ : S₂.RightHomologyData) : h₁.H ≅ h₂.H 
goal: (CategoryTheory.ShortComplex.rightHomologyMapIso' e h₁ h₂).hom =
  CategoryTheory.ShortComplex.rightHomologyMap' e.hom h₁ h₂

full_name: CategoryTheory.ShortComplex.rightHomologyMapIso'
code: /-- An isomorphism of short complexes `S₁ ≅ S₂` induces an isomorphism on the `H` fields
of right homology data of `S₁` and `S₂`. -/
@[simps]
def rightHomologyMapIso' (e : S₁ ≅ S₂) (h₁ : S₁.RightHomologyData)
    (h₂ : S₂.RightHomologyData) : h₁.H ≅ h₂.H 
goal: h₁.H ≅ h₂.H

full_name: CategoryTheory.ShortComplex.isIso_rightHomologyMap'_of_isIso
code: instance isIso_rightHomologyMap'_of_isIso (φ : S₁ ⟶ S₂) [IsIso φ]
    (h₁ : S₁.RightHomologyData) (h₂ : S₂.RightHomologyData) :
    IsIso (rightHomologyMap' φ h₁ h₂) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.rightHomologyMap' φ h₁ h₂)

full_name: CategoryTheory.ShortComplex.opcyclesMapIso'_inv
code: /-- An isomorphism of short complexes `S₁ ≅ S₂` induces an isomorphism on the `Q` fields
of right homology data of `S₁` and `S₂`. -/
@[simps]
def opcyclesMapIso' (e : S₁ ≅ S₂) (h₁ : S₁.RightHomologyData)
    (h₂ : S₂.RightHomologyData) : h₁.Q ≅ h₂.Q 
goal: (CategoryTheory.ShortComplex.opcyclesMapIso' e h₁ h₂).inv = CategoryTheory.ShortComplex.opcyclesMap' e.inv h₂ h₁

full_name: CategoryTheory.ShortComplex.opcyclesMapIso'_hom
code: /-- An isomorphism of short complexes `S₁ ≅ S₂` induces an isomorphism on the `Q` fields
of right homology data of `S₁` and `S₂`. -/
@[simps]
def opcyclesMapIso' (e : S₁ ≅ S₂) (h₁ : S₁.RightHomologyData)
    (h₂ : S₂.RightHomologyData) : h₁.Q ≅ h₂.Q 
goal: (CategoryTheory.ShortComplex.opcyclesMapIso' e h₁ h₂).hom = CategoryTheory.ShortComplex.opcyclesMap' e.hom h₁ h₂

full_name: CategoryTheory.ShortComplex.opcyclesMapIso'
code: /-- An isomorphism of short complexes `S₁ ≅ S₂` induces an isomorphism on the `Q` fields
of right homology data of `S₁` and `S₂`. -/
@[simps]
def opcyclesMapIso' (e : S₁ ≅ S₂) (h₁ : S₁.RightHomologyData)
    (h₂ : S₂.RightHomologyData) : h₁.Q ≅ h₂.Q 
goal: h₁.Q ≅ h₂.Q

full_name: CategoryTheory.ShortComplex.isIso_opcyclesMap'_of_isIso
code: instance isIso_opcyclesMap'_of_isIso (φ : S₁ ⟶ S₂) [IsIso φ]
    (h₁ : S₁.RightHomologyData) (h₂ : S₂.RightHomologyData) :
    IsIso (opcyclesMap' φ h₁ h₂) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.opcyclesMap' φ h₁ h₂)

full_name: CategoryTheory.ShortComplex.rightHomologyMapIso_inv
code: /-- The isomorphism `S₁.rightHomology ≅ S₂.rightHomology` induced by an isomorphism of
short complexes `S₁ ≅ S₂`. -/
@[simps]
noncomputable def rightHomologyMapIso (e : S₁ ≅ S₂) [S₁.HasRightHomology]
    [S₂.HasRightHomology] : S₁.rightHomology ≅ S₂.rightHomology 
goal: (CategoryTheory.ShortComplex.rightHomologyMapIso e).inv = CategoryTheory.ShortComplex.rightHomologyMap e.inv

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

full_name: CategoryTheory.ShortComplex.rightHomologyMapIso_hom
code: /-- The isomorphism `S₁.rightHomology ≅ S₂.rightHomology` induced by an isomorphism of
short complexes `S₁ ≅ S₂`. -/
@[simps]
noncomputable def rightHomologyMapIso (e : S₁ ≅ S₂) [S₁.HasRightHomology]
    [S₂.HasRightHomology] : S₁.rightHomology ≅ S₂.rightHomology 
goal: (CategoryTheory.ShortComplex.rightHomologyMapIso e).hom = CategoryTheory.ShortComplex.rightHomologyMap e.hom

full_name: CategoryTheory.ShortComplex.isIso_rightHomologyMap_of_iso
code: instance isIso_rightHomologyMap_of_iso (φ : S₁ ⟶ S₂) [IsIso φ] [S₁.HasRightHomology]
    [S₂.HasRightHomology] :
    IsIso (rightHomologyMap φ) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.rightHomologyMap φ)

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

full_name: CategoryTheory.ShortComplex.opcyclesMapIso_hom
code: /-- The isomorphism `S₁.opcycles ≅ S₂.opcycles` induced by an isomorphism
of short complexes `S₁ ≅ S₂`. -/
@[simps]
noncomputable def opcyclesMapIso (e : S₁ ≅ S₂) [S₁.HasRightHomology]
    [S₂.HasRightHomology] : S₁.opcycles ≅ S₂.opcycles 
goal: (CategoryTheory.ShortComplex.opcyclesMapIso e).hom = CategoryTheory.ShortComplex.opcyclesMap e.hom

full_name: CategoryTheory.ShortComplex.opcyclesMapIso_inv
code: /-- The isomorphism `S₁.opcycles ≅ S₂.opcycles` induced by an isomorphism
of short complexes `S₁ ≅ S₂`. -/
@[simps]
noncomputable def opcyclesMapIso (e : S₁ ≅ S₂) [S₁.HasRightHomology]
    [S₂.HasRightHomology] : S₁.opcycles ≅ S₂.opcycles 
goal: (CategoryTheory.ShortComplex.opcyclesMapIso e).inv = CategoryTheory.ShortComplex.opcyclesMap e.inv

full_name: CategoryTheory.ShortComplex.isIso_opcyclesMap_of_iso
code: instance isIso_opcyclesMap_of_iso (φ : S₁ ⟶ S₂) [IsIso φ] [S₁.HasRightHomology]
    [S₂.HasRightHomology] : IsIso (opcyclesMap φ) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.opcyclesMap φ)

full_name: CategoryTheory.ShortComplex.RightHomologyData.rightHomologyIso
code: /-- The isomorphism `S.rightHomology ≅ h.H` induced by a right homology data `h` for a
short complex `S`. -/
noncomputable def rightHomologyIso : S.rightHomology ≅ h.H 
goal: S.rightHomology ≅ h.H

full_name: CategoryTheory.ShortComplex.RightHomologyData.opcyclesIso
code: /-- The isomorphism `S.opcycles ≅ h.Q` induced by a right homology data `h` for a
short complex `S`. -/
noncomputable def opcyclesIso : S.opcycles ≅ h.Q 
goal: S.opcycles ≅ h.Q

full_name: CategoryTheory.ShortComplex.RightHomologyData.p_comp_opcyclesIso_inv
code: @[reassoc (attr := simp)]
lemma p_comp_opcyclesIso_inv : h.p ≫ h.opcyclesIso.inv = S.pOpcycles 
goal: CategoryTheory.CategoryStruct.comp h.p h.opcyclesIso.inv = S.pOpcycles

full_name: CategoryTheory.ShortComplex.RightHomologyData.pOpcycles_comp_opcyclesIso_hom
code: @[reassoc (attr := simp)]
lemma pOpcycles_comp_opcyclesIso_hom : S.pOpcycles ≫ h.opcyclesIso.hom = h.p 
goal: CategoryTheory.CategoryStruct.comp S.pOpcycles h.opcyclesIso.hom = h.p

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

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

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.rightHomologyMap_eq
code: lemma rightHomologyMap_eq [S₁.HasRightHomology] [S₂.HasRightHomology] :
    rightHomologyMap φ = h₁.rightHomologyIso.hom ≫ γ.φH ≫ h₂.rightHomologyIso.inv 
goal: CategoryTheory.ShortComplex.rightHomologyMap φ =
  CategoryTheory.CategoryStruct.comp h₁.rightHomologyIso.hom
    (CategoryTheory.CategoryStruct.comp γ.φH h₂.rightHomologyIso.inv)

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.opcyclesMap_eq
code: lemma opcyclesMap_eq [S₁.HasRightHomology] [S₂.HasRightHomology] :
    opcyclesMap φ = h₁.opcyclesIso.hom ≫ γ.φQ ≫ h₂.opcyclesIso.inv 
goal: CategoryTheory.ShortComplex.opcyclesMap φ =
  CategoryTheory.CategoryStruct.comp h₁.opcyclesIso.hom (CategoryTheory.CategoryStruct.comp γ.φQ h₂.opcyclesIso.inv)

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.rightHomologyMap_comm
code: lemma rightHomologyMap_comm [S₁.HasRightHomology] [S₂.HasRightHomology] :
    rightHomologyMap φ ≫ h₂.rightHomologyIso.hom = h₁.rightHomologyIso.hom ≫ γ.φH 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.rightHomologyMap φ) h₂.rightHomologyIso.hom =
  CategoryTheory.CategoryStruct.comp h₁.rightHomologyIso.hom γ.φH

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.opcyclesMap_comm
code: lemma opcyclesMap_comm [S₁.HasRightHomology] [S₂.HasRightHomology] :
    opcyclesMap φ ≫ h₂.opcyclesIso.hom = h₁.opcyclesIso.hom ≫ γ.φQ 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.opcyclesMap φ) h₂.opcyclesIso.hom =
  CategoryTheory.CategoryStruct.comp h₁.opcyclesIso.hom γ.φQ

full_name: CategoryTheory.ShortComplex.rightHomologyFunctor_obj
code: /-- The right homology functor `ShortComplex C ⥤ C`, where the right homology of a
short complex `S` is understood as a kernel of the obvious map `S.fromOpcycles : S.opcycles ⟶ S.X₃`
where `S.opcycles` is a cokernel of `S.f : S.X₁ ⟶ S.X₂`. -/
@[simps]
noncomputable def rightHomologyFunctor : ShortComplex C ⥤ C 
goal: (CategoryTheory.ShortComplex.rightHomologyFunctor C).obj S = S.rightHomology

full_name: CategoryTheory.ShortComplex.rightHomologyFunctor_map
code: /-- The right homology functor `ShortComplex C ⥤ C`, where the right homology of a
short complex `S` is understood as a kernel of the obvious map `S.fromOpcycles : S.opcycles ⟶ S.X₃`
where `S.opcycles` is a cokernel of `S.f : S.X₁ ⟶ S.X₂`. -/
@[simps]
noncomputable def rightHomologyFunctor : ShortComplex C ⥤ C 
goal: ∀ {X Y : CategoryTheory.ShortComplex C} (φ : X ⟶ Y),
  (CategoryTheory.ShortComplex.rightHomologyFunctor C).map φ = CategoryTheory.ShortComplex.rightHomologyMap φ

full_name: CategoryTheory.ShortComplex.rightHomologyFunctor
code: /-- The right homology functor `ShortComplex C ⥤ C`, where the right homology of a
short complex `S` is understood as a kernel of the obvious map `S.fromOpcycles : S.opcycles ⟶ S.X₃`
where `S.opcycles` is a cokernel of `S.f : S.X₁ ⟶ S.X₂`. -/
@[simps]
noncomputable def rightHomologyFunctor : ShortComplex C ⥤ C 
goal: CategoryTheory.Functor (CategoryTheory.ShortComplex C) C

full_name: CategoryTheory.ShortComplex.opcyclesFunctor_obj
code: /-- The opcycles functor `ShortComplex C ⥤ C` which sends a short complex `S` to `S.opcycles`
which is a cokernel of `S.f : S.X₁ ⟶ S.X₂`. -/
@[simps]
noncomputable def opcyclesFunctor :
    ShortComplex C ⥤ C 
goal: (CategoryTheory.ShortComplex.opcyclesFunctor C).obj S = S.opcycles

full_name: CategoryTheory.ShortComplex.opcyclesFunctor
code: /-- The opcycles functor `ShortComplex C ⥤ C` which sends a short complex `S` to `S.opcycles`
which is a cokernel of `S.f : S.X₁ ⟶ S.X₂`. -/
@[simps]
noncomputable def opcyclesFunctor :
    ShortComplex C ⥤ C 
goal: CategoryTheory.Functor (CategoryTheory.ShortComplex C) C

full_name: CategoryTheory.ShortComplex.opcyclesFunctor_map
code: /-- The opcycles functor `ShortComplex C ⥤ C` which sends a short complex `S` to `S.opcycles`
which is a cokernel of `S.f : S.X₁ ⟶ S.X₂`. -/
@[simps]
noncomputable def opcyclesFunctor :
    ShortComplex C ⥤ C 
goal: ∀ {X Y : CategoryTheory.ShortComplex C} (φ : X ⟶ Y),
  (CategoryTheory.ShortComplex.opcyclesFunctor C).map φ = CategoryTheory.ShortComplex.opcyclesMap φ

full_name: CategoryTheory.ShortComplex.rightHomologyιNatTrans
code: /-- The natural transformation `S.rightHomology ⟶ S.opcycles` for all short complexes `S`. -/
@[simps]
noncomputable def rightHomologyιNatTrans :
    rightHomologyFunctor C ⟶ opcyclesFunctor C 
goal: CategoryTheory.ShortComplex.rightHomologyFunctor C ⟶ CategoryTheory.ShortComplex.opcyclesFunctor C

full_name: CategoryTheory.ShortComplex.rightHomologyιNatTrans_app
code: /-- The natural transformation `S.rightHomology ⟶ S.opcycles` for all short complexes `S`. -/
@[simps]
noncomputable def rightHomologyιNatTrans :
    rightHomologyFunctor C ⟶ opcyclesFunctor C 
goal: (CategoryTheory.ShortComplex.rightHomologyιNatTrans C).app S = S.rightHomologyι

full_name: CategoryTheory.ShortComplex.pOpcyclesNatTrans_app
code: /-- The natural transformation `S.X₂ ⟶ S.opcycles` for all short complexes `S`. -/
@[simps]
noncomputable def pOpcyclesNatTrans :
    ShortComplex.π₂ ⟶ opcyclesFunctor C 
goal: (CategoryTheory.ShortComplex.pOpcyclesNatTrans C).app S = S.pOpcycles

full_name: CategoryTheory.ShortComplex.pOpcyclesNatTrans
code: /-- The natural transformation `S.X₂ ⟶ S.opcycles` for all short complexes `S`. -/
@[simps]
noncomputable def pOpcyclesNatTrans :
    ShortComplex.π₂ ⟶ opcyclesFunctor C 
goal: CategoryTheory.ShortComplex.π₂ ⟶ CategoryTheory.ShortComplex.opcyclesFunctor C

full_name: CategoryTheory.ShortComplex.fromOpcyclesNatTrans
code: /-- The natural transformation `S.opcycles ⟶ S.X₃` for all short complexes `S`. -/
@[simps]
noncomputable def fromOpcyclesNatTrans :
    opcyclesFunctor C ⟶ π₃ 
goal: CategoryTheory.ShortComplex.opcyclesFunctor C ⟶ CategoryTheory.ShortComplex.π₃

full_name: CategoryTheory.ShortComplex.fromOpcyclesNatTrans_app
code: /-- The natural transformation `S.opcycles ⟶ S.X₃` for all short complexes `S`. -/
@[simps]
noncomputable def fromOpcyclesNatTrans :
    opcyclesFunctor C ⟶ π₃ 
goal: (CategoryTheory.ShortComplex.fromOpcyclesNatTrans C).app S = S.fromOpcycles

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

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

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

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

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

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

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

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

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

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

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

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

full_name: CategoryTheory.ShortComplex.rightHomologyOpIso
code: /-- The right homology in the opposite category of the opposite of a short complex identifies
to the left homology of this short complex. -/
noncomputable def rightHomologyOpIso [S.HasLeftHomology] :
    S.op.rightHomology ≅ Opposite.op S.leftHomology 
goal: S.op.rightHomology ≅ Opposite.op S.leftHomology

full_name: CategoryTheory.ShortComplex.leftHomologyOpIso
code: /-- The left homology in the opposite category of the opposite of a short complex identifies
to the right homology of this short complex. -/
noncomputable def leftHomologyOpIso [S.HasRightHomology] :
    S.op.leftHomology ≅ Opposite.op S.rightHomology 
goal: S.op.leftHomology ≅ Opposite.op S.rightHomology

full_name: CategoryTheory.ShortComplex.opcyclesOpIso
code: /-- The opcycles in the opposite category of the opposite of a short complex identifies
to the cycles of this short complex. -/
noncomputable def opcyclesOpIso [S.HasLeftHomology] :
    S.op.opcycles ≅ Opposite.op S.cycles 
goal: S.op.opcycles ≅ Opposite.op S.cycles

full_name: CategoryTheory.ShortComplex.cyclesOpIso
code: /-- The cycles in the opposite category of the opposite of a short complex identifies
to the opcycles of this short complex. -/
noncomputable def cyclesOpIso [S.HasRightHomology] :
    S.op.cycles ≅ Opposite.op S.opcycles 
goal: S.op.cycles ≅ Opposite.op S.opcycles

full_name: CategoryTheory.ShortComplex.leftHomologyMap'_op
code: @[simp]
lemma leftHomologyMap'_op
    (φ : S₁ ⟶ S₂) (h₁ : S₁.LeftHomologyData) (h₂ : S₂.LeftHomologyData) :
    (leftHomologyMap' φ h₁ h₂).op = rightHomologyMap' (opMap φ) h₂.op h₁.op 
goal: (CategoryTheory.ShortComplex.leftHomologyMap' φ h₁ h₂).op =
  CategoryTheory.ShortComplex.rightHomologyMap' (CategoryTheory.ShortComplex.opMap φ) h₂.op h₁.op

full_name: CategoryTheory.ShortComplex.leftHomologyMap_op
code: lemma leftHomologyMap_op (φ : S₁ ⟶ S₂) [S₁.HasLeftHomology] [S₂.HasLeftHomology] :
    (leftHomologyMap φ).op = S₂.rightHomologyOpIso.inv ≫ rightHomologyMap (opMap φ) ≫
      S₁.rightHomologyOpIso.hom 
goal: (CategoryTheory.ShortComplex.leftHomologyMap φ).op =
  CategoryTheory.CategoryStruct.comp S₂.rightHomologyOpIso.inv
    (CategoryTheory.CategoryStruct.comp
      (CategoryTheory.ShortComplex.rightHomologyMap (CategoryTheory.ShortComplex.opMap φ)) S₁.rightHomologyOpIso.hom)

full_name: CategoryTheory.ShortComplex.rightHomologyMap'_op
code: @[simp]
lemma rightHomologyMap'_op
    (φ : S₁ ⟶ S₂) (h₁ : S₁.RightHomologyData) (h₂ : S₂.RightHomologyData) :
    (rightHomologyMap' φ h₁ h₂).op = leftHomologyMap' (opMap φ) h₂.op h₁.op 
goal: (CategoryTheory.ShortComplex.rightHomologyMap' φ h₁ h₂).op =
  CategoryTheory.ShortComplex.leftHomologyMap' (CategoryTheory.ShortComplex.opMap φ) h₂.op h₁.op

full_name: CategoryTheory.ShortComplex.rightHomologyMap_op
code: lemma rightHomologyMap_op (φ : S₁ ⟶ S₂) [S₁.HasRightHomology] [S₂.HasRightHomology] :
    (rightHomologyMap φ).op = S₂.leftHomologyOpIso.inv ≫ leftHomologyMap (opMap φ) ≫
      S₁.leftHomologyOpIso.hom 
goal: (CategoryTheory.ShortComplex.rightHomologyMap φ).op =
  CategoryTheory.CategoryStruct.comp S₂.leftHomologyOpIso.inv
    (CategoryTheory.CategoryStruct.comp
      (CategoryTheory.ShortComplex.leftHomologyMap (CategoryTheory.ShortComplex.opMap φ)) S₁.leftHomologyOpIso.hom)

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono
code: /-- If `φ : S₁ ⟶ S₂` is a morphism of short complexes such that `φ.τ₁` is epi, `φ.τ₂` is an iso
and `φ.τ₃` is mono, then a right homology data for `S₁` induces a right homology data for `S₂` with
the same `Q` and `H` fields. This is obtained by dualising `LeftHomologyData.ofEpiOfIsIsoOfMono'`.
The inverse construction is `ofEpiOfIsIsoOfMono'`.  -/
noncomputable def ofEpiOfIsIsoOfMono : RightHomologyData S₂ 
goal: S₂.RightHomologyData

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono_Q
code: @[simp] lemma ofEpiOfIsIsoOfMono_Q : (ofEpiOfIsIsoOfMono φ h).Q = h.Q 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono φ h).Q = h.Q

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono_H
code: @[simp] lemma ofEpiOfIsIsoOfMono_H : (ofEpiOfIsIsoOfMono φ h).H = h.H 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono φ h).H = h.H

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono_p
code: @[simp] lemma ofEpiOfIsIsoOfMono_p : (ofEpiOfIsIsoOfMono φ h).p = inv φ.τ₂ ≫ h.p 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono φ h).p =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.inv φ.τ₂) h.p

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono_ι
code: @[simp] lemma ofEpiOfIsIsoOfMono_ι : (ofEpiOfIsIsoOfMono φ h).ι = h.ι 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono φ h).ι = h.ι

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono_g'
code: @[simp] lemma ofEpiOfIsIsoOfMono_g' : (ofEpiOfIsIsoOfMono φ h).g' = h.g' ≫ φ.τ₃ 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono φ h).g' = CategoryTheory.CategoryStruct.comp h.g' φ.τ₃

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono'
code: /-- If `φ : S₁ ⟶ S₂` is a morphism of short complexes such that `φ.τ₁` is epi, `φ.τ₂` is an iso
and `φ.τ₃` is mono, then a right homology data for `S₂` induces a right homology data for `S₁` with
the same `Q` and `H` fields. This is obtained by dualising `LeftHomologyData.ofEpiOfIsIsoOfMono`.
The inverse construction is `ofEpiOfIsIsoOfMono`.  -/
noncomputable def ofEpiOfIsIsoOfMono' : RightHomologyData S₁ 
goal: S₁.RightHomologyData

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono'_Q
code: @[simp] lemma ofEpiOfIsIsoOfMono'_Q : (ofEpiOfIsIsoOfMono' φ h).Q = h.Q 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono' φ h).Q = h.Q

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono'_H
code: @[simp] lemma ofEpiOfIsIsoOfMono'_H : (ofEpiOfIsIsoOfMono' φ h).H = h.H 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono' φ h).H = h.H

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono'_p
code: @[simp] lemma ofEpiOfIsIsoOfMono'_p : (ofEpiOfIsIsoOfMono' φ h).p = φ.τ₂ ≫ h.p 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono' φ h).p = CategoryTheory.CategoryStruct.comp φ.τ₂ h.p

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono'_ι
code: @[simp] lemma ofEpiOfIsIsoOfMono'_ι : (ofEpiOfIsIsoOfMono' φ h).ι = h.ι 
goal: (CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono' φ h).ι = h.ι

full_name: CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono'_g'_τ₃
code: @[simp] lemma ofEpiOfIsIsoOfMono'_g'_τ₃ : (ofEpiOfIsIsoOfMono' φ h).g' ≫ φ.τ₃ = h.g' 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono' φ h).g' φ.τ₃ =
  h.g'

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

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

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

full_name: CategoryTheory.ShortComplex.hasRightHomology_of_iso
code: lemma hasRightHomology_of_iso {S₁ S₂ : ShortComplex C}
    (e : S₁ ≅ S₂) [HasRightHomology S₁] : HasRightHomology S₂ 
goal: S₂.HasRightHomology

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

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.ofEpiOfIsIsoOfMono_φQ
code: /-- This right homology map data expresses compatibilities of the right homology data
constructed by `RightHomologyData.ofEpiOfIsIsoOfMono` -/
@[simps]
def ofEpiOfIsIsoOfMono (φ : S₁ ⟶ S₂) (h : RightHomologyData S₁)
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    RightHomologyMapData φ h (RightHomologyData.ofEpiOfIsIsoOfMono φ h) 
goal: (CategoryTheory.ShortComplex.RightHomologyMapData.ofEpiOfIsIsoOfMono φ h).φQ = CategoryTheory.CategoryStruct.id h.Q

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.ofEpiOfIsIsoOfMono_φH
code: /-- This right homology map data expresses compatibilities of the right homology data
constructed by `RightHomologyData.ofEpiOfIsIsoOfMono` -/
@[simps]
def ofEpiOfIsIsoOfMono (φ : S₁ ⟶ S₂) (h : RightHomologyData S₁)
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    RightHomologyMapData φ h (RightHomologyData.ofEpiOfIsIsoOfMono φ h) 
goal: (CategoryTheory.ShortComplex.RightHomologyMapData.ofEpiOfIsIsoOfMono φ h).φH = CategoryTheory.CategoryStruct.id h.H

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.ofEpiOfIsIsoOfMono'_φQ
code: /-- This right homology map data expresses compatibilities of the right homology data
constructed by `RightHomologyData.ofEpiOfIsIsoOfMono'` -/
@[simps]
noncomputable def ofEpiOfIsIsoOfMono' (φ : S₁ ⟶ S₂) (h : RightHomologyData S₂)
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    RightHomologyMapData φ (RightHomologyData.ofEpiOfIsIsoOfMono' φ h) h 
goal: (CategoryTheory.ShortComplex.RightHomologyMapData.ofEpiOfIsIsoOfMono' φ h).φQ =
  CategoryTheory.CategoryStruct.id (CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono' φ h).Q

full_name: CategoryTheory.ShortComplex.RightHomologyMapData.ofEpiOfIsIsoOfMono'_φH
code: /-- This right homology map data expresses compatibilities of the right homology data
constructed by `RightHomologyData.ofEpiOfIsIsoOfMono'` -/
@[simps]
noncomputable def ofEpiOfIsIsoOfMono' (φ : S₁ ⟶ S₂) (h : RightHomologyData S₂)
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    RightHomologyMapData φ (RightHomologyData.ofEpiOfIsIsoOfMono' φ h) h 
goal: (CategoryTheory.ShortComplex.RightHomologyMapData.ofEpiOfIsIsoOfMono' φ h).φH =
  CategoryTheory.CategoryStruct.id (CategoryTheory.ShortComplex.RightHomologyData.ofEpiOfIsIsoOfMono' φ h).H

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

full_name: CategoryTheory.ShortComplex.instIsIsoRightHomologyMap'OfEpiτ₁Ofτ₂OfMonoτ₃
code: instance (φ : S₁ ⟶ S₂) (h₁ : S₁.RightHomologyData) (h₂ : S₂.RightHomologyData)
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    IsIso (rightHomologyMap' φ h₁ h₂) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.rightHomologyMap' φ h₁ h₂)

full_name: CategoryTheory.ShortComplex.instIsIsoRightHomologyMapOfEpiτ₁Ofτ₂OfMonoτ₃
code: /-- If a morphism of short complexes `φ : S₁ ⟶ S₂` is such that `φ.τ₁` is epi, `φ.τ₂` is an iso,
and `φ.τ₃` is mono, then the induced morphism on right homology is an isomorphism. -/
instance (φ : S₁ ⟶ S₂) [S₁.HasRightHomology] [S₂.HasRightHomology]
    [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    IsIso (rightHomologyMap φ) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.rightHomologyMap φ)

full_name: CategoryTheory.ShortComplex.rightHomologyFunctorOpNatIso_hom_app
code: /-- The opposite of the right homology functor is the left homology functor. -/
@[simps!]
noncomputable def rightHomologyFunctorOpNatIso :
    (rightHomologyFunctor C).op ≅ opFunctor C ⋙ leftHomologyFunctor Cᵒᵖ 
goal: (CategoryTheory.ShortComplex.rightHomologyFunctorOpNatIso C).hom.app X = (Opposite.unop X).leftHomologyOpIso.inv

full_name: CategoryTheory.ShortComplex.rightHomologyFunctorOpNatIso_inv_app
code: /-- The opposite of the right homology functor is the left homology functor. -/
@[simps!]
noncomputable def rightHomologyFunctorOpNatIso :
    (rightHomologyFunctor C).op ≅ opFunctor C ⋙ leftHomologyFunctor Cᵒᵖ 
goal: (CategoryTheory.ShortComplex.rightHomologyFunctorOpNatIso C).inv.app X = (Opposite.unop X).leftHomologyOpIso.hom

full_name: CategoryTheory.ShortComplex.rightHomologyFunctorOpNatIso
code: /-- The opposite of the right homology functor is the left homology functor. -/
@[simps!]
noncomputable def rightHomologyFunctorOpNatIso :
    (rightHomologyFunctor C).op ≅ opFunctor C ⋙ leftHomologyFunctor Cᵒᵖ 
goal: (CategoryTheory.ShortComplex.rightHomologyFunctor C).op ≅
  (CategoryTheory.ShortComplex.opFunctor C).comp (CategoryTheory.ShortComplex.leftHomologyFunctor Cᵒᵖ)

full_name: CategoryTheory.ShortComplex.leftHomologyFunctorOpNatIso_hom_app
code: /-- The opposite of the left homology functor is the right homology functor. -/
@[simps!]
noncomputable def leftHomologyFunctorOpNatIso :
    (leftHomologyFunctor C).op ≅ opFunctor C ⋙ rightHomologyFunctor Cᵒᵖ 
goal: (CategoryTheory.ShortComplex.leftHomologyFunctorOpNatIso C).hom.app X = (Opposite.unop X).rightHomologyOpIso.inv

full_name: CategoryTheory.ShortComplex.leftHomologyFunctorOpNatIso
code: /-- The opposite of the left homology functor is the right homology functor. -/
@[simps!]
noncomputable def leftHomologyFunctorOpNatIso :
    (leftHomologyFunctor C).op ≅ opFunctor C ⋙ rightHomologyFunctor Cᵒᵖ 
goal: (CategoryTheory.ShortComplex.leftHomologyFunctor C).op ≅
  (CategoryTheory.ShortComplex.opFunctor C).comp (CategoryTheory.ShortComplex.rightHomologyFunctor Cᵒᵖ)

full_name: CategoryTheory.ShortComplex.leftHomologyFunctorOpNatIso_inv_app
code: /-- The opposite of the left homology functor is the right homology functor. -/
@[simps!]
noncomputable def leftHomologyFunctorOpNatIso :
    (leftHomologyFunctor C).op ≅ opFunctor C ⋙ rightHomologyFunctor Cᵒᵖ 
goal: (CategoryTheory.ShortComplex.leftHomologyFunctorOpNatIso C).inv.app X = (Opposite.unop X).rightHomologyOpIso.hom

full_name: CategoryTheory.ShortComplex.descOpcycles
code: /-- A morphism `k : S.X₂ ⟶ A` such that `S.f ≫ k = 0` descends to a morphism `S.opcycles ⟶ A`. -/
noncomputable def descOpcycles : S.opcycles ⟶ A 
goal: S.opcycles ⟶ A

full_name: CategoryTheory.ShortComplex.p_descOpcycles
code: @[reassoc (attr := simp)]
lemma p_descOpcycles : S.pOpcycles ≫ S.descOpcycles k hk = k 
goal: CategoryTheory.CategoryStruct.comp S.pOpcycles (S.descOpcycles k hk) = k

full_name: CategoryTheory.ShortComplex.descOpcycles_comp
code: @[reassoc]
lemma descOpcycles_comp {A' : C} (α : A ⟶ A') :
    S.descOpcycles k hk ≫ α = S.descOpcycles (k ≫ α) (by rw [reassoc_of% hk, zero_comp]) 
goal: CategoryTheory.CategoryStruct.comp (S.descOpcycles k hk) α = S.descOpcycles (CategoryTheory.CategoryStruct.comp k α) ⋯

full_name: CategoryTheory.ShortComplex.opcyclesIsCokernel
code: /-- Via `S.pOpcycles : S.X₂ ⟶ S.opcycles`, the object `S.opcycles` identifies to the
cokernel of `S.f : S.X₁ ⟶ S.X₂`. -/
noncomputable def opcyclesIsCokernel :
    IsColimit (CokernelCofork.ofπ S.pOpcycles S.f_pOpcycles) 
goal: CategoryTheory.Limits.IsColimit (CategoryTheory.Limits.CokernelCofork.ofπ S.pOpcycles ⋯)

full_name: CategoryTheory.ShortComplex.opcyclesIsoCokernel_hom
code: /-- The canonical isomorphism `S.opcycles ≅ cokernel S.f`. -/
@[simps]
noncomputable def opcyclesIsoCokernel [HasCokernel S.f] : S.opcycles ≅ cokernel S.f 
goal: S.opcyclesIsoCokernel.hom = S.descOpcycles (CategoryTheory.Limits.cokernel.π S.f) ⋯

full_name: CategoryTheory.ShortComplex.opcyclesIsoCokernel
code: /-- The canonical isomorphism `S.opcycles ≅ cokernel S.f`. -/
@[simps]
noncomputable def opcyclesIsoCokernel [HasCokernel S.f] : S.opcycles ≅ cokernel S.f 
goal: S.opcycles ≅ CategoryTheory.Limits.cokernel S.f

full_name: CategoryTheory.ShortComplex.opcyclesIsoCokernel_inv
code: /-- The canonical isomorphism `S.opcycles ≅ cokernel S.f`. -/
@[simps]
noncomputable def opcyclesIsoCokernel [HasCokernel S.f] : S.opcycles ≅ cokernel S.f 
goal: S.opcyclesIsoCokernel.inv = CategoryTheory.Limits.cokernel.desc S.f S.pOpcycles ⋯

full_name: CategoryTheory.ShortComplex.descRightHomology
code: /-- The morphism `S.rightHomology ⟶ A` obtained from a morphism `k : S.X₂ ⟶ A`
such that `S.f ≫ k = 0.` -/
@[simp]
noncomputable def descRightHomology : S.rightHomology ⟶ A 
goal: S.rightHomology ⟶ A

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

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

full_name: CategoryTheory.ShortComplex.rightHomologyIsKernel
code: /-- Via `S.rightHomologyι : S.rightHomology ⟶ S.opcycles`, the object `S.rightHomology` identifies
to the kernel of `S.fromOpcycles : S.opcycles ⟶ S.X₃`. -/
noncomputable def rightHomologyIsKernel :
    IsLimit (KernelFork.ofι S.rightHomologyι S.rightHomologyι_comp_fromOpcycles) 
goal: CategoryTheory.Limits.IsLimit (CategoryTheory.Limits.KernelFork.ofι S.rightHomologyι ⋯)

full_name: CategoryTheory.ShortComplex.opcyclesMap_comp_descOpcycles
code: @[reassoc (attr := simp)]
lemma opcyclesMap_comp_descOpcycles (φ : S₁ ⟶ S) [S₁.HasRightHomology] :
    opcyclesMap φ ≫ S.descOpcycles k hk =
      S₁.descOpcycles (φ.τ₂ ≫ k) (by rw [← φ.comm₁₂_assoc, hk, comp_zero]) 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.ShortComplex.opcyclesMap φ) (S.descOpcycles k hk) =
  S₁.descOpcycles (CategoryTheory.CategoryStruct.comp φ.τ₂ k) ⋯

full_name: CategoryTheory.ShortComplex.RightHomologyData.opcyclesIso_inv_comp_descOpcycles
code: @[reassoc (attr := simp)]
lemma RightHomologyData.opcyclesIso_inv_comp_descOpcycles :
    h.opcyclesIso.inv ≫ S.descOpcycles k hk = h.descQ k hk 
goal: CategoryTheory.CategoryStruct.comp h.opcyclesIso.inv (S.descOpcycles k hk) = h.descQ k hk

full_name: CategoryTheory.ShortComplex.RightHomologyData.opcyclesIso_hom_comp_descQ
code: @[simp]
lemma RightHomologyData.opcyclesIso_hom_comp_descQ :
    h.opcyclesIso.hom ≫ h.descQ k hk = S.descOpcycles k hk 
goal: CategoryTheory.CategoryStruct.comp h.opcyclesIso.hom (h.descQ k hk) = S.descOpcycles k hk

full_name: CategoryTheory.ShortComplex.HasRightHomology.hasCokernel
code: lemma hasCokernel [S.HasRightHomology] : HasCokernel S.f 
goal: CategoryTheory.Limits.HasCokernel S.f

full_name: CategoryTheory.ShortComplex.HasRightHomology.hasKernel
code: lemma hasKernel [S.HasRightHomology] [HasCokernel S.f] :
    HasKernel (cokernel.desc S.f S.g S.zero) 
goal: CategoryTheory.Limits.HasKernel (CategoryTheory.Limits.cokernel.desc S.f S.g ⋯)

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

full_name: CategoryTheory.ShortComplex.isIso_opcyclesMap'_of_isIso_of_epi
code: lemma isIso_opcyclesMap'_of_isIso_of_epi (φ : S₁ ⟶ S₂) (h₂ : IsIso φ.τ₂) (h₁ : Epi φ.τ₁)
    (h₁ : S₁.RightHomologyData) (h₂ : S₂.RightHomologyData) :
    IsIso (opcyclesMap' φ h₁ h₂) 
goal: ∀ (h₁ : S₁.RightHomologyData) (h₂ : S₂.RightHomologyData),
  CategoryTheory.IsIso (CategoryTheory.ShortComplex.opcyclesMap' φ h₁ h₂)

full_name: CategoryTheory.ShortComplex.isIso_opcyclesMap_of_isIso_of_epi'
code: lemma isIso_opcyclesMap_of_isIso_of_epi' (φ : S₁ ⟶ S₂) (h₂ : IsIso φ.τ₂) (h₁ : Epi φ.τ₁)
    [S₁.HasRightHomology] [S₂.HasRightHomology] :
    IsIso (opcyclesMap φ) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.opcyclesMap φ)

full_name: CategoryTheory.ShortComplex.isIso_opcyclesMap_of_isIso_of_epi
code: instance isIso_opcyclesMap_of_isIso_of_epi (φ : S₁ ⟶ S₂) [IsIso φ.τ₂] [Epi φ.τ₁]
    [S₁.HasRightHomology] [S₂.HasRightHomology] :
    IsIso (opcyclesMap φ) 
goal: CategoryTheory.IsIso (CategoryTheory.ShortComplex.opcyclesMap φ)