l3lab/ntp-mathlib huggingface dataset:
lemma HomologyData.right_homologyIso_eq_left_homologyIso_trans_iso
    (h : S.HomologyData) [S.HasHomology] :
    h.right.homologyIso = h.left.homologyIso ≪≫ h.iso := by
  suffices h.iso = h.left.homologyIso.symm ≪≫ h.right.homologyIso by
    rw [this, Iso.self_symm_id_assoc]
  ext
  dsimp
  

Proof state:
case w
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
h : HomologyData S
inst✝ : HasHomology S
⊢ h.iso.hom = (LeftHomologyData.homologyIso h.left).inv ≫ (RightHomologyData.homologyIso h.right).hom

Next tactic:
rw [← leftRightHomologyComparison'_fac, leftRightHomologyComparison'_eq]
lemma hasHomology_of_isIsoLeftRightHomologyComparison [S.HasLeftHomology]
    [S.HasRightHomology] [h : IsIso S.leftRightHomologyComparison] :
    S.HasHomology := by
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
inst✝¹ : HasLeftHomology S
inst✝ : HasRightHomology S
h : IsIso (leftRightHomologyComparison S)
⊢ HasHomology S

Next tactic:
haveI : IsIso (leftRightHomologyComparison' S.leftHomologyData S.rightHomologyData) := h
lemma hasHomology_of_isIsoLeftRightHomologyComparison [S.HasLeftHomology]
    [S.HasRightHomology] [h : IsIso S.leftRightHomologyComparison] :
    S.HasHomology := by
  haveI : IsIso (leftRightHomologyComparison' S.leftHomologyData S.rightHomologyData) := h
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
inst✝¹ : HasLeftHomology S
inst✝ : HasRightHomology S
h : IsIso (leftRightHomologyComparison S)
this : IsIso (leftRightHomologyComparison' (leftHomologyData S) (rightHomologyData S))
⊢ HasHomology S

Next tactic:
exact hasHomology_of_isIso_leftRightHomologyComparison' S.leftHomologyData S.rightHomologyData
@[reassoc]
lemma LeftHomologyData.leftHomologyIso_hom_naturality
    (h₁ : S₁.LeftHomologyData) (h₂ : S₂.LeftHomologyData) :
    h₁.homologyIso.hom ≫ leftHomologyMap' φ h₁ h₂ =
      homologyMap φ ≫ h₂.homologyIso.hom := by
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁✝ : HomologyData S₁
h₂✝ : HomologyData S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ (homologyIso h₁).hom ≫ leftHomologyMap' φ h₁ h₂ = homologyMap φ ≫ (homologyIso h₂).hom

Next tactic:
dsimp [homologyIso, ShortComplex.leftHomologyIso, homologyMap, homologyMap', leftHomologyIso]
@[reassoc]
lemma LeftHomologyData.leftHomologyIso_hom_naturality
    (h₁ : S₁.LeftHomologyData) (h₂ : S₂.LeftHomologyData) :
    h₁.homologyIso.hom ≫ leftHomologyMap' φ h₁ h₂ =
      homologyMap φ ≫ h₂.homologyIso.hom := by
  dsimp [homologyIso, ShortComplex.leftHomologyIso, homologyMap, homologyMap', leftHomologyIso]
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁✝ : HomologyData S₁
h₂✝ : HomologyData S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ (leftHomologyMap' (𝟙 S₁) (homologyData S₁).left (leftHomologyData S₁) ≫
        leftHomologyMap' (𝟙 S₁) (leftHomologyData S₁) h₁) ≫
      leftHomologyMap' φ h₁ h₂ =
    leftHomologyMap' φ (homologyData S₁).left (homologyData S₂).left ≫
      leftHomologyMap' (𝟙 S₂) (homologyData S₂).left (leftHomologyData S₂) ≫
        leftHomologyMap' (𝟙 S₂) (leftHomologyData S₂) h₂

Next tactic:
simp only [← leftHomologyMap'_comp, id_comp, comp_id]
@[reassoc]
lemma LeftHomologyData.leftHomologyIso_inv_naturality
    (h₁ : S₁.LeftHomologyData) (h₂ : S₂.LeftHomologyData) :
    h₁.homologyIso.inv ≫ homologyMap φ =
      leftHomologyMap' φ h₁ h₂ ≫ h₂.homologyIso.inv := by
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁✝ : HomologyData S₁
h₂✝ : HomologyData S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ (homologyIso h₁).inv ≫ homologyMap φ = leftHomologyMap' φ h₁ h₂ ≫ (homologyIso h₂).inv

Next tactic:
dsimp [homologyIso, ShortComplex.leftHomologyIso, homologyMap, homologyMap', leftHomologyIso]
@[reassoc]
lemma LeftHomologyData.leftHomologyIso_inv_naturality
    (h₁ : S₁.LeftHomologyData) (h₂ : S₂.LeftHomologyData) :
    h₁.homologyIso.inv ≫ homologyMap φ =
      leftHomologyMap' φ h₁ h₂ ≫ h₂.homologyIso.inv := by
  dsimp [homologyIso, ShortComplex.leftHomologyIso, homologyMap, homologyMap', leftHomologyIso]
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁✝ : HomologyData S₁
h₂✝ : HomologyData S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ (leftHomologyMap' (𝟙 S₁) h₁ (leftHomologyData S₁) ≫
        leftHomologyMap' (𝟙 S₁) (leftHomologyData S₁) (homologyData S₁).left) ≫
      leftHomologyMap' φ (homologyData S₁).left (homologyData S₂).left =
    leftHomologyMap' φ h₁ h₂ ≫
      leftHomologyMap' (𝟙 S₂) h₂ (leftHomologyData S₂) ≫
        leftHomologyMap' (𝟙 S₂) (leftHomologyData S₂) (homologyData S₂).left

Next tactic:
simp only [← leftHomologyMap'_comp, id_comp, comp_id]
@[reassoc]
lemma leftHomologyIso_hom_naturality :
    S₁.leftHomologyIso.hom ≫ homologyMap φ =
      leftHomologyMap φ ≫ S₂.leftHomologyIso.hom := by
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
φ : S₁ ⟶ S₂
⊢ (leftHomologyIso S₁).hom ≫ homologyMap φ = leftHomologyMap φ ≫ (leftHomologyIso S₂).hom

Next tactic:
simpa only [LeftHomologyData.homologyIso_leftHomologyData, Iso.symm_inv] using
    LeftHomologyData.leftHomologyIso_inv_naturality φ S₁.leftHomologyData S₂.leftHomologyData
@[reassoc]
lemma leftHomologyIso_inv_naturality :
    S₁.leftHomologyIso.inv ≫ leftHomologyMap φ =
      homologyMap φ ≫ S₂.leftHomologyIso.inv := by
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
φ : S₁ ⟶ S₂
⊢ (leftHomologyIso S₁).inv ≫ leftHomologyMap φ = homologyMap φ ≫ (leftHomologyIso S₂).inv

Next tactic:
simpa only [LeftHomologyData.homologyIso_leftHomologyData, Iso.symm_inv] using
    LeftHomologyData.leftHomologyIso_hom_naturality φ S₁.leftHomologyData S₂.leftHomologyData
@[reassoc]
lemma RightHomologyData.rightHomologyIso_hom_naturality
    (h₁ : S₁.RightHomologyData) (h₂ : S₂.RightHomologyData) :
    h₁.homologyIso.hom ≫ rightHomologyMap' φ h₁ h₂ =
      homologyMap φ ≫ h₂.homologyIso.hom := by
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁✝ : HomologyData S₁
h₂✝ : HomologyData S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
φ : S₁ ⟶ S₂
h₁ : RightHomologyData S₁
h₂ : RightHomologyData S₂
⊢ (homologyIso h₁).hom ≫ rightHomologyMap' φ h₁ h₂ = homologyMap φ ≫ (homologyIso h₂).hom

Next tactic:
rw [← cancel_epi h₁.homologyIso.inv, Iso.inv_hom_id_assoc,
    ← cancel_epi (leftRightHomologyComparison' S₁.leftHomologyData h₁),
    ← leftRightHomologyComparison'_naturality φ S₁.leftHomologyData h₁ S₂.leftHomologyData h₂,
    ← cancel_epi (S₁.leftHomologyData.homologyIso.hom),
    LeftHomologyData.leftHomologyIso_hom_naturality_assoc,
    leftRightHomologyComparison'_fac, leftRightHomologyComparison'_fac, assoc,
    Iso.hom_inv_id_assoc, Iso.hom_inv_id_assoc, Iso.hom_inv_id_assoc]
@[reassoc]
lemma RightHomologyData.rightHomologyIso_inv_naturality
    (h₁ : S₁.RightHomologyData) (h₂ : S₂.RightHomologyData) :
      h₁.homologyIso.inv ≫ homologyMap φ =
        rightHomologyMap' φ h₁ h₂ ≫ h₂.homologyIso.inv := by
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁✝ : HomologyData S₁
h₂✝ : HomologyData S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
φ : S₁ ⟶ S₂
h₁ : RightHomologyData S₁
h₂ : RightHomologyData S₂
⊢ (homologyIso h₁).inv ≫ homologyMap φ = rightHomologyMap' φ h₁ h₂ ≫ (homologyIso h₂).inv

Next tactic:
simp only [← cancel_mono h₂.homologyIso.hom, assoc, Iso.inv_hom_id_assoc, comp_id,
    ← RightHomologyData.rightHomologyIso_hom_naturality φ h₁ h₂, Iso.inv_hom_id]
@[reassoc]
lemma rightHomologyIso_hom_naturality :
    S₁.rightHomologyIso.hom ≫ homologyMap φ =
      rightHomologyMap φ ≫ S₂.rightHomologyIso.hom := by
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
φ : S₁ ⟶ S₂
⊢ (rightHomologyIso S₁).hom ≫ homologyMap φ = rightHomologyMap φ ≫ (rightHomologyIso S₂).hom

Next tactic:
simpa only [RightHomologyData.homologyIso_rightHomologyData, Iso.symm_inv] using
    RightHomologyData.rightHomologyIso_inv_naturality φ S₁.rightHomologyData S₂.rightHomologyData
@[reassoc]
lemma rightHomologyIso_inv_naturality :
    S₁.rightHomologyIso.inv ≫ rightHomologyMap φ =
      homologyMap φ ≫ S₂.rightHomologyIso.inv := by
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
φ : S₁ ⟶ S₂
⊢ (rightHomologyIso S₁).inv ≫ rightHomologyMap φ = homologyMap φ ≫ (rightHomologyIso S₂).inv

Next tactic:
simpa only [RightHomologyData.homologyIso_rightHomologyData, Iso.symm_inv] using
    RightHomologyData.rightHomologyIso_hom_naturality φ S₁.rightHomologyData S₂.rightHomologyData
instance isIso_homologyMap'_of_epi_of_isIso_of_mono (φ : S₁ ⟶ S₂)
    (h₁ : S₁.HomologyData) (h₂ : S₂.HomologyData) [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    IsIso (homologyMap' φ h₁ h₂) := by
  

Proof state:
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁✝ : HomologyData S₁
h₂✝ : HomologyData S₂
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
⊢ IsIso (homologyMap' φ h₁ h₂)

Next tactic:
dsimp only [homologyMap']
instance isIso_homologyMap'_of_epi_of_isIso_of_mono (φ : S₁ ⟶ S₂)
    (h₁ : S₁.HomologyData) (h₂ : S₂.HomologyData) [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    IsIso (homologyMap' φ h₁ h₂) := by
  dsimp only [homologyMap']
  

Proof state:
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁✝ : HomologyData S₁
h₂✝ : HomologyData S₂
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
⊢ IsIso (leftHomologyMap' φ h₁.left h₂.left)

Next tactic:
infer_instance
lemma isIso_homologyMap_of_epi_of_isIso_of_mono' (φ : S₁ ⟶ S₂) [S₁.HasHomology] [S₂.HasHomology]
    (h₁ : Epi φ.τ₁) (h₂ : IsIso φ.τ₂) (h₃ : Mono φ.τ₃) :
    IsIso (homologyMap φ) := by
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁✝ : HomologyData S₁
h₂✝ : HomologyData S₂
φ : S₁ ⟶ S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
h₁ : Epi φ.τ₁
h₂ : IsIso φ.τ₂
h₃ : Mono φ.τ₃
⊢ IsIso (homologyMap φ)

Next tactic:
dsimp only [homologyMap]
lemma isIso_homologyMap_of_epi_of_isIso_of_mono' (φ : S₁ ⟶ S₂) [S₁.HasHomology] [S₂.HasHomology]
    (h₁ : Epi φ.τ₁) (h₂ : IsIso φ.τ₂) (h₃ : Mono φ.τ₃) :
    IsIso (homologyMap φ) := by
  dsimp only [homologyMap]
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁✝ : HomologyData S₁
h₂✝ : HomologyData S₂
φ : S₁ ⟶ S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
h₁ : Epi φ.τ₁
h₂ : IsIso φ.τ₂
h₃ : Mono φ.τ₃
⊢ IsIso (homologyMap' φ (homologyData S₁) (homologyData S₂))

Next tactic:
infer_instance
instance isIso_homologyMap_of_isIso (φ : S₁ ⟶ S₂) [S₁.HasHomology] [S₂.HasHomology] [IsIso φ] :
    IsIso (homologyMap φ) := by
  

Proof state:
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
φ : S₁ ⟶ S₂
inst✝² : HasHomology S₁
inst✝¹ : HasHomology S₂
inst✝ : IsIso φ
⊢ IsIso (homologyMap φ)

Next tactic:
dsimp only [homologyMap, homologyMap']
instance isIso_homologyMap_of_isIso (φ : S₁ ⟶ S₂) [S₁.HasHomology] [S₂.HasHomology] [IsIso φ] :
    IsIso (homologyMap φ) := by
  dsimp only [homologyMap, homologyMap']
  

Proof state:
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
φ : S₁ ⟶ S₂
inst✝² : HasHomology S₁
inst✝¹ : HasHomology S₂
inst✝ : IsIso φ
⊢ IsIso (leftHomologyMap' φ (homologyData S₁).left (homologyData S₂).left)

Next tactic:
infer_instance
@[reassoc (attr := simp)]
lemma homologyπ_comp_leftHomologyIso_inv:
    S.homologyπ ≫ S.leftHomologyIso.inv = S.leftHomologyπ := by
  

Proof state:
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝ : HasHomology S
⊢ homologyπ S ≫ (leftHomologyIso S).inv = leftHomologyπ S

Next tactic:
dsimp only [homologyπ]
@[reassoc (attr := simp)]
lemma homologyπ_comp_leftHomologyIso_inv:
    S.homologyπ ≫ S.leftHomologyIso.inv = S.leftHomologyπ := by
  dsimp only [homologyπ]
  

Proof state:
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝ : HasHomology S
⊢ (leftHomologyπ S ≫ (leftHomologyIso S).hom) ≫ (leftHomologyIso S).inv = leftHomologyπ S

Next tactic:
simp only [assoc, Iso.hom_inv_id, comp_id]
@[reassoc (attr := simp)]
lemma rightHomologyIso_hom_comp_homologyι :
    S.rightHomologyIso.hom ≫ S.homologyι = S.rightHomologyι := by
  

Proof state:
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝ : HasHomology S
⊢ (rightHomologyIso S).hom ≫ homologyι S = rightHomologyι S

Next tactic:
dsimp only [homologyι]
@[reassoc (attr := simp)]
lemma rightHomologyIso_hom_comp_homologyι :
    S.rightHomologyIso.hom ≫ S.homologyι = S.rightHomologyι := by
  dsimp only [homologyι]
  

Proof state:
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝ : HasHomology S
⊢ (rightHomologyIso S).hom ≫ (rightHomologyIso S).inv ≫ rightHomologyι S = rightHomologyι S

Next tactic:
simp only [Iso.hom_inv_id_assoc]
@[reassoc (attr := simp)]
lemma toCycles_comp_homologyπ :
    S.toCycles ≫ S.homologyπ = 0 := by
  

Proof state:
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝ : HasHomology S
⊢ toCycles S ≫ homologyπ S = 0

Next tactic:
dsimp only [homologyπ]
@[reassoc (attr := simp)]
lemma toCycles_comp_homologyπ :
    S.toCycles ≫ S.homologyπ = 0 := by
  dsimp only [homologyπ]
  

Proof state:
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝ : HasHomology S
⊢ toCycles S ≫ leftHomologyπ S ≫ (leftHomologyIso S).hom = 0

Next tactic:
simp only [toCycles_comp_leftHomologyπ_assoc, zero_comp]
@[reassoc (attr := simp)]
lemma homologyι_comp_fromOpcycles :
    S.homologyι ≫ S.fromOpcycles = 0 := by
  

Proof state:
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝ : HasHomology S
⊢ homologyι S ≫ fromOpcycles S = 0

Next tactic:
dsimp only [homologyι]
@[reassoc (attr := simp)]
lemma homologyι_comp_fromOpcycles :
    S.homologyι ≫ S.fromOpcycles = 0 := by
  dsimp only [homologyι]
  

Proof state:
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝ : HasHomology S
⊢ ((rightHomologyIso S).inv ≫ rightHomologyι S) ≫ fromOpcycles S = 0

Next tactic:
simp only [assoc, rightHomologyι_comp_fromOpcycles, comp_zero]
/-- The homology `S.homology` of a short complex is
the kernel of the morphism `S.fromOpcycles : S.opcycles ⟶ S.X₃`. -/
noncomputable def homologyIsKernel :
    IsLimit (KernelFork.ofι S.homologyι S.homologyι_comp_fromOpcycles) :=
  IsLimit.ofIsoLimit S.rightHomologyIsKernel
    (Fork.ext S.rightHomologyIso (by 

Proof state:
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝ : HasHomology S
⊢ (rightHomologyIso S).hom ≫ Fork.ι (KernelFork.ofι (homologyι S) (_ : homologyι S ≫ fromOpcycles S = 0)) =
    Fork.ι (KernelFork.ofι (rightHomologyι S) (_ : rightHomologyι S ≫ fromOpcycles S = 0))

Next tactic:
simp
@[reassoc (attr := simp)]
lemma homologyπ_naturality (φ : S₁ ⟶ S₂) [S₁.HasHomology] [S₂.HasHomology] :
    S₁.homologyπ ≫ homologyMap φ = cyclesMap φ ≫ S₂.homologyπ := by
  

Proof state:
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝² : HasHomology S
φ : S₁ ⟶ S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
⊢ homologyπ S₁ ≫ homologyMap φ = cyclesMap φ ≫ homologyπ S₂

Next tactic:
simp only [← cancel_mono S₂.leftHomologyIso.inv, assoc, ← leftHomologyIso_inv_naturality φ,
    homologyπ_comp_leftHomologyIso_inv]
@[reassoc (attr := simp)]
lemma homologyπ_naturality (φ : S₁ ⟶ S₂) [S₁.HasHomology] [S₂.HasHomology] :
    S₁.homologyπ ≫ homologyMap φ = cyclesMap φ ≫ S₂.homologyπ := by
  simp only [← cancel_mono S₂.leftHomologyIso.inv, assoc, ← leftHomologyIso_inv_naturality φ,
    homologyπ_comp_leftHomologyIso_inv]
  

Proof state:
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝² : HasHomology S
φ : S₁ ⟶ S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
⊢ homologyπ S₁ ≫ (leftHomologyIso S₁).inv ≫ leftHomologyMap φ = cyclesMap φ ≫ leftHomologyπ S₂

Next tactic:
simp only [homologyπ, assoc, Iso.hom_inv_id_assoc, leftHomologyπ_naturality]
@[reassoc (attr := simp)]
lemma homologyι_naturality (φ : S₁ ⟶ S₂) [S₁.HasHomology] [S₂.HasHomology] :
    homologyMap φ ≫ S₂.homologyι = S₁.homologyι ≫ S₁.opcyclesMap φ  := by
  

Proof state:
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝² : HasHomology S
φ : S₁ ⟶ S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
⊢ homologyMap φ ≫ homologyι S₂ = homologyι S₁ ≫ opcyclesMap φ

Next tactic:
simp only [← cancel_epi S₁.rightHomologyIso.hom, rightHomologyIso_hom_naturality_assoc φ,
    rightHomologyIso_hom_comp_homologyι, rightHomologyι_naturality]
@[reassoc (attr := simp)]
lemma homologyι_naturality (φ : S₁ ⟶ S₂) [S₁.HasHomology] [S₂.HasHomology] :
    homologyMap φ ≫ S₂.homologyι = S₁.homologyι ≫ S₁.opcyclesMap φ  := by
  simp only [← cancel_epi S₁.rightHomologyIso.hom, rightHomologyIso_hom_naturality_assoc φ,
    rightHomologyIso_hom_comp_homologyι, rightHomologyι_naturality]
  

Proof state:
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝² : HasHomology S
φ : S₁ ⟶ S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
⊢ rightHomologyι S₁ ≫ opcyclesMap φ = (rightHomologyIso S₁).hom ≫ homologyι S₁ ≫ opcyclesMap φ

Next tactic:
simp only [homologyι, assoc, Iso.hom_inv_id_assoc]
@[reassoc (attr := simp)]
lemma homology_π_ι :
    S.homologyπ ≫ S.homologyι = S.iCycles ≫ S.pOpcycles := by
  

Proof state:
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝ : HasHomology S
⊢ homologyπ S ≫ homologyι S = iCycles S ≫ pOpcycles S

Next tactic:
dsimp only [homologyπ, homologyι]
@[reassoc (attr := simp)]
lemma homology_π_ι :
    S.homologyπ ≫ S.homologyι = S.iCycles ≫ S.pOpcycles := by
  dsimp only [homologyπ, homologyι]
  

Proof state:
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝ : HasHomology S
⊢ (leftHomologyπ S ≫ (leftHomologyIso S).hom) ≫ (rightHomologyIso S).inv ≫ rightHomologyι S = iCycles S ≫ pOpcycles S

Next tactic:
simpa only [assoc, S.leftRightHomologyComparison_fac] using S.π_leftRightHomologyComparison_ι
@[reassoc (attr := simp)]
lemma LeftHomologyData.homologyπ_comp_homologyIso_hom (h : S.LeftHomologyData) [S.HasHomology] :
    S.homologyπ ≫ h.homologyIso.hom = h.cyclesIso.hom ≫ h.π := by
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝¹ : HasHomology S
h : LeftHomologyData S
inst✝ : HasHomology S
⊢ homologyπ S ≫ (homologyIso h).hom = (cyclesIso h).hom ≫ h.π

Next tactic:
dsimp only [homologyπ, homologyIso]
@[reassoc (attr := simp)]
lemma LeftHomologyData.homologyπ_comp_homologyIso_hom (h : S.LeftHomologyData) [S.HasHomology] :
    S.homologyπ ≫ h.homologyIso.hom = h.cyclesIso.hom ≫ h.π := by
  dsimp only [homologyπ, homologyIso]
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝¹ : HasHomology S
h : LeftHomologyData S
inst✝ : HasHomology S
⊢ (leftHomologyπ S ≫ (ShortComplex.leftHomologyIso S).hom) ≫
      ((ShortComplex.leftHomologyIso S).symm ≪≫ leftHomologyIso h).hom =
    (cyclesIso h).hom ≫ h.π

Next tactic:
simp only [Iso.trans_hom, Iso.symm_hom, assoc, Iso.hom_inv_id_assoc,
    leftHomologyπ_comp_leftHomologyIso_hom]
@[reassoc (attr := simp)]
lemma LeftHomologyData.π_comp_homologyIso_inv (h : S.LeftHomologyData) [S.HasHomology] :
    h.π ≫ h.homologyIso.inv = h.cyclesIso.inv ≫ S.homologyπ := by
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝¹ : HasHomology S
h : LeftHomologyData S
inst✝ : HasHomology S
⊢ h.π ≫ (homologyIso h).inv = (cyclesIso h).inv ≫ homologyπ S

Next tactic:
dsimp only [homologyπ, homologyIso]
@[reassoc (attr := simp)]
lemma LeftHomologyData.π_comp_homologyIso_inv (h : S.LeftHomologyData) [S.HasHomology] :
    h.π ≫ h.homologyIso.inv = h.cyclesIso.inv ≫ S.homologyπ := by
  dsimp only [homologyπ, homologyIso]
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝¹ : HasHomology S
h : LeftHomologyData S
inst✝ : HasHomology S
⊢ h.π ≫ ((ShortComplex.leftHomologyIso S).symm ≪≫ leftHomologyIso h).inv =
    (cyclesIso h).inv ≫ leftHomologyπ S ≫ (ShortComplex.leftHomologyIso S).hom

Next tactic:
simp only [Iso.trans_inv, Iso.symm_inv, π_comp_leftHomologyIso_inv_assoc]
@[reassoc (attr := simp)]
lemma RightHomologyData.homologyIso_inv_comp_homologyι
    (h : S.RightHomologyData) [S.HasHomology] :
    h.homologyIso.inv ≫ S.homologyι = h.ι ≫ h.opcyclesIso.inv := by
  

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ S₄ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : HomologyData S₁
h₂ : HomologyData S₂
A : C
inst✝¹ : HasHomology S
h : RightHomologyData S
inst✝ : HasHomology S
⊢ (homologyIso h).inv ≫ homologyι S = h.ι ≫ (opcyclesIso h).inv

Next tactic:
dsimp only [homologyι, homologyIso]