l3lab/ntp-mathlib huggingface dataset:
@[reassoc (attr := simp)]
lemma RightHomologyData.homologyIso_inv_comp_homologyι
    (h : S.RightHomologyData) [S.HasHomology] :
    h.homologyIso.inv ≫ S.homologyι = h.ι ≫ h.opcyclesIso.inv := 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 : RightHomologyData S
inst✝ : HasHomology S
⊢ ((ShortComplex.rightHomologyIso S).symm ≪≫ rightHomologyIso h).inv ≫
      (ShortComplex.rightHomologyIso S).inv ≫ rightHomologyι S =
    h.ι ≫ (opcyclesIso h).inv

Next tactic:
simp only [Iso.trans_inv, Iso.symm_inv, assoc, Iso.hom_inv_id_assoc,
    rightHomologyIso_inv_comp_rightHomologyι]
@[reassoc (attr := simp)]
lemma RightHomologyData.homologyIso_hom_comp_ι
    (h : S.RightHomologyData) [S.HasHomology] :
    h.homologyIso.hom ≫ h.ι = S.homologyι ≫ h.opcyclesIso.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₂
A : C
inst✝¹ : HasHomology S
h : RightHomologyData S
inst✝ : HasHomology S
⊢ (homologyIso h).hom ≫ h.ι = homologyι S ≫ (opcyclesIso h).hom

Next tactic:
dsimp only [homologyι, homologyIso]
@[reassoc (attr := simp)]
lemma RightHomologyData.homologyIso_hom_comp_ι
    (h : S.RightHomologyData) [S.HasHomology] :
    h.homologyIso.hom ≫ h.ι = S.homologyι ≫ h.opcyclesIso.hom := 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 : RightHomologyData S
inst✝ : HasHomology S
⊢ ((ShortComplex.rightHomologyIso S).symm ≪≫ rightHomologyIso h).hom ≫ h.ι =
    ((ShortComplex.rightHomologyIso S).inv ≫ rightHomologyι S) ≫ (opcyclesIso h).hom

Next tactic:
simp only [Iso.trans_hom, Iso.symm_hom, assoc, rightHomologyIso_hom_comp_ι]
@[reassoc (attr := simp)]
lemma LeftHomologyData.homologyIso_hom_comp_leftHomologyIso_inv
    (h : S.LeftHomologyData) [S.HasHomology] :
    h.homologyIso.hom ≫ h.leftHomologyIso.inv = 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₂
A : C
inst✝¹ : HasHomology S
h : LeftHomologyData S
inst✝ : HasHomology S
⊢ (homologyIso h).hom ≫ (leftHomologyIso h).inv = (ShortComplex.leftHomologyIso S).inv

Next tactic:
dsimp only [homologyIso]
@[reassoc (attr := simp)]
lemma LeftHomologyData.homologyIso_hom_comp_leftHomologyIso_inv
    (h : S.LeftHomologyData) [S.HasHomology] :
    h.homologyIso.hom ≫ h.leftHomologyIso.inv = S.leftHomologyIso.inv := by
  dsimp only [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
⊢ ((ShortComplex.leftHomologyIso S).symm ≪≫ leftHomologyIso h).hom ≫ (leftHomologyIso h).inv =
    (ShortComplex.leftHomologyIso S).inv

Next tactic:
simp only [Iso.trans_hom, Iso.symm_hom, assoc, Iso.hom_inv_id, comp_id]
@[reassoc (attr := simp)]
lemma LeftHomologyData.leftHomologyIso_hom_comp_homologyIso_inv
    (h : S.LeftHomologyData) [S.HasHomology] :
    h.leftHomologyIso.hom ≫ h.homologyIso.inv = 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₂
A : C
inst✝¹ : HasHomology S
h : LeftHomologyData S
inst✝ : HasHomology S
⊢ (leftHomologyIso h).hom ≫ (homologyIso h).inv = (ShortComplex.leftHomologyIso S).hom

Next tactic:
dsimp only [homologyIso]
@[reassoc (attr := simp)]
lemma LeftHomologyData.leftHomologyIso_hom_comp_homologyIso_inv
    (h : S.LeftHomologyData) [S.HasHomology] :
    h.leftHomologyIso.hom ≫ h.homologyIso.inv = S.leftHomologyIso.hom := by
  dsimp only [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
⊢ (leftHomologyIso h).hom ≫ ((ShortComplex.leftHomologyIso S).symm ≪≫ leftHomologyIso h).inv =
    (ShortComplex.leftHomologyIso S).hom

Next tactic:
simp only [Iso.trans_inv, Iso.symm_inv, Iso.hom_inv_id_assoc]
@[reassoc (attr := simp)]
lemma RightHomologyData.homologyIso_hom_comp_rightHomologyIso_inv
    (h : S.RightHomologyData) [S.HasHomology] :
    h.homologyIso.hom ≫ h.rightHomologyIso.inv = 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₂
A : C
inst✝¹ : HasHomology S
h : RightHomologyData S
inst✝ : HasHomology S
⊢ (homologyIso h).hom ≫ (rightHomologyIso h).inv = (ShortComplex.rightHomologyIso S).inv

Next tactic:
dsimp only [homologyIso]
@[reassoc (attr := simp)]
lemma RightHomologyData.homologyIso_hom_comp_rightHomologyIso_inv
    (h : S.RightHomologyData) [S.HasHomology] :
    h.homologyIso.hom ≫ h.rightHomologyIso.inv = S.rightHomologyIso.inv := by
  dsimp only [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 : RightHomologyData S
inst✝ : HasHomology S
⊢ ((ShortComplex.rightHomologyIso S).symm ≪≫ rightHomologyIso h).hom ≫ (rightHomologyIso h).inv =
    (ShortComplex.rightHomologyIso S).inv

Next tactic:
simp only [Iso.trans_hom, Iso.symm_hom, assoc, Iso.hom_inv_id, comp_id]
@[reassoc (attr := simp)]
lemma RightHomologyData.rightHomologyIso_hom_comp_homologyIso_inv
    (h : S.RightHomologyData) [S.HasHomology] :
    h.rightHomologyIso.hom ≫ h.homologyIso.inv = 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₂
A : C
inst✝¹ : HasHomology S
h : RightHomologyData S
inst✝ : HasHomology S
⊢ (rightHomologyIso h).hom ≫ (homologyIso h).inv = (ShortComplex.rightHomologyIso S).hom

Next tactic:
dsimp only [homologyIso]
@[reassoc (attr := simp)]
lemma RightHomologyData.rightHomologyIso_hom_comp_homologyIso_inv
    (h : S.RightHomologyData) [S.HasHomology] :
    h.rightHomologyIso.hom ≫ h.homologyIso.inv = S.rightHomologyIso.hom := by
  dsimp only [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 : RightHomologyData S
inst✝ : HasHomology S
⊢ (rightHomologyIso h).hom ≫ ((ShortComplex.rightHomologyIso S).symm ≪≫ rightHomologyIso h).inv =
    (ShortComplex.rightHomologyIso S).hom

Next tactic:
simp only [Iso.trans_inv, Iso.symm_inv, Iso.hom_inv_id_assoc]
@[reassoc]
lemma comp_homologyMap_comp [S₁.HasHomology] [S₂.HasHomology] (φ : S₁ ⟶ S₂)
    (h₁ : S₁.LeftHomologyData) (h₂ : S₂.RightHomologyData) :
    h₁.π ≫ h₁.homologyIso.inv ≫ homologyMap φ ≫ h₂.homologyIso.hom ≫ h₂.ι =
      h₁.i ≫ φ.τ₂ ≫ h₂.p := 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
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : RightHomologyData S₂
⊢ h₁.π ≫ (LeftHomologyData.homologyIso h₁).inv ≫ homologyMap φ ≫ (RightHomologyData.homologyIso h₂).hom ≫ h₂.ι =
    h₁.i ≫ φ.τ₂ ≫ h₂.p

Next tactic:
dsimp only [LeftHomologyData.homologyIso, RightHomologyData.homologyIso,
    Iso.symm, Iso.trans, Iso.refl, leftHomologyIso, rightHomologyIso,
    leftHomologyMapIso', rightHomologyMapIso',
    LeftHomologyData.cyclesIso, RightHomologyData.opcyclesIso,
    LeftHomologyData.leftHomologyIso, RightHomologyData.rightHomologyIso,
    homologyMap, homologyMap']
@[reassoc]
lemma comp_homologyMap_comp [S₁.HasHomology] [S₂.HasHomology] (φ : S₁ ⟶ S₂)
    (h₁ : S₁.LeftHomologyData) (h₂ : S₂.RightHomologyData) :
    h₁.π ≫ h₁.homologyIso.inv ≫ homologyMap φ ≫ h₂.homologyIso.hom ≫ h₂.ι =
      h₁.i ≫ φ.τ₂ ≫ h₂.p := by
  dsimp only [LeftHomologyData.homologyIso, RightHomologyData.homologyIso,
    Iso.symm, Iso.trans, Iso.refl, leftHomologyIso, rightHomologyIso,
    leftHomologyMapIso', rightHomologyMapIso',
    LeftHomologyData.cyclesIso, RightHomologyData.opcyclesIso,
    LeftHomologyData.leftHomologyIso, RightHomologyData.rightHomologyIso,
    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₂
A : C
inst✝² : HasHomology S
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : RightHomologyData S₂
⊢ h₁.π ≫
      (leftHomologyMap' (𝟙 S₁) h₁ (leftHomologyData S₁) ≫
          leftHomologyMap' (𝟙 S₁) (leftHomologyData S₁) (homologyData S₁).left) ≫
        leftHomologyMap' φ (homologyData S₁).left (homologyData S₂).left ≫
          (((homologyData S₂).iso.hom ≫ rightHomologyMap' (𝟙 S₂) (homologyData S₂).right (rightHomologyData S₂)) ≫
              rightHomologyMap' (𝟙 S₂) (rightHomologyData S₂) h₂) ≫
            h₂.ι =
    h₁.i ≫ φ.τ₂ ≫ h₂.p

Next tactic:
simp only [assoc, rightHomologyι_naturality', rightHomologyι_naturality'_assoc,
    leftHomologyπ_naturality'_assoc, HomologyData.comm_assoc, p_opcyclesMap'_assoc,
    id_τ₂, p_opcyclesMap', id_comp, cyclesMap'_i_assoc]
@[reassoc]
lemma π_homologyMap_ι [S₁.HasHomology] [S₂.HasHomology] (φ : S₁ ⟶ S₂) :
    S₁.homologyπ ≫ homologyMap φ ≫ 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
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
φ : S₁ ⟶ S₂
⊢ homologyπ S₁ ≫ homologyMap φ ≫ homologyι S₂ = iCycles S₁ ≫ φ.τ₂ ≫ pOpcycles S₂

Next tactic:
simp only [homologyι_naturality, homology_π_ι_assoc, p_opcyclesMap]
lemma homologyMap'_op : (homologyMap' φ h₁ h₂).op =
    h₂.iso.inv.op ≫ homologyMap' (opMap φ) h₂.op h₁.op ≫ h₁.iso.hom.op :=
  Quiver.Hom.unop_inj (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₂
⊢ (homologyMap' φ h₁ h₂).op.unop =
    (h₂.iso.inv.op ≫ homologyMap' (opMap φ) (HomologyData.op h₂) (HomologyData.op h₁) ≫ h₁.iso.hom.op).unop

Next tactic:
dsimp
lemma homologyMap'_op : (homologyMap' φ h₁ h₂).op =
    h₂.iso.inv.op ≫ homologyMap' (opMap φ) h₂.op h₁.op ≫ h₁.iso.hom.op :=
  Quiver.Hom.unop_inj (by
    dsimp
    

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₂
⊢ homologyMap' φ h₁ h₂ =
    (h₁.iso.hom ≫ (homologyMap' (opMap φ) (HomologyData.op h₂) (HomologyData.op h₁)).unop) ≫ h₂.iso.inv

Next tactic:
have γ : HomologyMapData φ h₁ h₂ := default
lemma homologyMap'_op : (homologyMap' φ h₁ h₂).op =
    h₂.iso.inv.op ≫ homologyMap' (opMap φ) h₂.op h₁.op ≫ h₁.iso.hom.op :=
  Quiver.Hom.unop_inj (by
    dsimp
    have γ : HomologyMapData φ h₁ h₂ := default
    

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₂
γ : HomologyMapData φ h₁ h₂
⊢ homologyMap' φ h₁ h₂ =
    (h₁.iso.hom ≫ (homologyMap' (opMap φ) (HomologyData.op h₂) (HomologyData.op h₁)).unop) ≫ h₂.iso.inv

Next tactic:
simp only [γ.homologyMap'_eq, γ.op.homologyMap'_eq, HomologyData.op_left,
      HomologyMapData.op_left, RightHomologyMapData.op_φH, Quiver.Hom.unop_op, assoc,
      ← γ.comm_assoc, Iso.hom_inv_id, comp_id]
lemma homologyMap_op [HasHomology S₁] [HasHomology S₂] :
    (homologyMap φ).op =
      (S₂.homologyOpIso).inv ≫ homologyMap (opMap φ) ≫ (S₁.homologyOpIso).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₂
⊢ (homologyMap φ).op = (homologyOpIso S₂).inv ≫ homologyMap (opMap φ) ≫ (homologyOpIso S₁).hom

Next tactic:
dsimp only [homologyMap, homologyOpIso]
lemma homologyMap_op [HasHomology S₁] [HasHomology S₂] :
    (homologyMap φ).op =
      (S₂.homologyOpIso).inv ≫ homologyMap (opMap φ) ≫ (S₁.homologyOpIso).hom := by
  dsimp only [homologyMap, homologyOpIso]
  

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₂
⊢ (homologyMap' φ (homologyData S₁) (homologyData S₂)).op =
    ((leftHomologyIso (op S₂)).symm ≪≫ leftHomologyOpIso S₂ ≪≫ Iso.op (rightHomologyIso S₂).symm).inv ≫
      homologyMap' (opMap φ) (homologyData (op S₂)) (homologyData (op S₁)) ≫
        ((leftHomologyIso (op S₁)).symm ≪≫ leftHomologyOpIso S₁ ≪≫ Iso.op (rightHomologyIso S₁).symm).hom

Next tactic:
rw [homologyMap'_op]
lemma homologyMap_op [HasHomology S₁] [HasHomology S₂] :
    (homologyMap φ).op =
      (S₂.homologyOpIso).inv ≫ homologyMap (opMap φ) ≫ (S₁.homologyOpIso).hom := by
  dsimp only [homologyMap, homologyOpIso]
  rw [homologyMap'_op]
  

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₂
⊢ (homologyData S₂).iso.inv.op ≫
      homologyMap' (opMap φ) (HomologyData.op (homologyData S₂)) (HomologyData.op (homologyData S₁)) ≫
        (homologyData S₁).iso.hom.op =
    ((leftHomologyIso (op S₂)).symm ≪≫ leftHomologyOpIso S₂ ≪≫ Iso.op (rightHomologyIso S₂).symm).inv ≫
      homologyMap' (opMap φ) (homologyData (op S₂)) (homologyData (op S₁)) ≫
        ((leftHomologyIso (op S₁)).symm ≪≫ leftHomologyOpIso S₁ ≪≫ Iso.op (rightHomologyIso S₁).symm).hom

Next tactic:
dsimp only [Iso.symm, Iso.trans, Iso.op, Iso.refl, rightHomologyIso, leftHomologyIso,
    leftHomologyOpIso, leftHomologyMapIso', rightHomologyMapIso',
    LeftHomologyData.leftHomologyIso, homologyMap']
lemma homologyMap_op [HasHomology S₁] [HasHomology S₂] :
    (homologyMap φ).op =
      (S₂.homologyOpIso).inv ≫ homologyMap (opMap φ) ≫ (S₁.homologyOpIso).hom := by
  dsimp only [homologyMap, homologyOpIso]
  rw [homologyMap'_op]
  dsimp only [Iso.symm, Iso.trans, Iso.op, Iso.refl, rightHomologyIso, leftHomologyIso,
    leftHomologyOpIso, leftHomologyMapIso', rightHomologyMapIso',
    LeftHomologyData.leftHomologyIso, 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₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
⊢ (homologyData S₂).iso.inv.op ≫
      leftHomologyMap' (opMap φ) (HomologyData.op (homologyData S₂)).left (HomologyData.op (homologyData S₁)).left ≫
        (homologyData S₁).iso.hom.op =
    (((rightHomologyMap' (𝟙 S₂) (rightHomologyData S₂) (homologyData S₂).right ≫ (homologyData S₂).iso.inv).op ≫
          leftHomologyMap' (𝟙 (op S₂)) (RightHomologyData.op (rightHomologyData S₂)) (leftHomologyData (op S₂))) ≫
        leftHomologyMap' (𝟙 (op S₂)) (leftHomologyData (op S₂)) (homologyData (op S₂)).left) ≫
      leftHomologyMap' (opMap φ) (homologyData (op S₂)).left (homologyData (op S₁)).left ≫
        leftHomologyMap' (𝟙 (op S₁)) (homologyData (op S₁)).left (leftHomologyData (op S₁)) ≫
          leftHomologyMap' (𝟙 (op S₁)) (leftHomologyData (op S₁)) (RightHomologyData.op (rightHomologyData S₁)) ≫
            ((homologyData S₁).iso.hom ≫ rightHomologyMap' (𝟙 S₁) (homologyData S₁).right (rightHomologyData S₁)).op

Next tactic:
simp only [assoc, rightHomologyMap'_op, op_comp, ← leftHomologyMap'_comp_assoc, id_comp,
    opMap_id, comp_id, HomologyData.op_left]
/-- The natural isomorphism `(homologyFunctor C).op ≅ opFunctor C ⋙ homologyFunctor Cᵒᵖ`
which relates the homology in `C` and in `Cᵒᵖ`. -/
noncomputable def homologyFunctorOpNatIso [CategoryWithHomology C] :
    (homologyFunctor C).op ≅ opFunctor C ⋙ homologyFunctor Cᵒᵖ :=
  NatIso.ofComponents (fun S => S.unop.homologyOpIso.symm)
    (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✝ : CategoryWithHomology C
⊢ ∀ {X Y : (ShortComplex C)ᵒᵖ} (f : X ⟶ Y),
    (homologyFunctor C).op.map f ≫ ((fun S => (homologyOpIso S.unop).symm) Y).hom =
      ((fun S => (homologyOpIso S.unop).symm) X).hom ≫ (opFunctor C ⋙ homologyFunctor Cᵒᵖ).map f

Next tactic:
simp [homologyMap_op]
lemma liftCycles_homologyπ_eq_zero_of_boundary [S.HasHomology]
    (k : A ⟶ S.X₂) (x : A ⟶ S.X₁) (hx : k = x ≫ S.f) :
    S.liftCycles k (by 

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
k : A ⟶ S.X₂
x : A ⟶ S.X₁
hx : k = x ≫ S.f
⊢ k ≫ S.g = 0

Next tactic:
rw [hx, assoc, S.zero, comp_zero]
lemma liftCycles_homologyπ_eq_zero_of_boundary [S.HasHomology]
    (k : A ⟶ S.X₂) (x : A ⟶ S.X₁) (hx : k = x ≫ S.f) :
    S.liftCycles k (by rw [hx, assoc, S.zero, comp_zero]) ≫ S.homologyπ = 0 := 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
k : A ⟶ S.X₂
x : A ⟶ S.X₁
hx : k = x ≫ S.f
⊢ liftCycles S k (_ : k ≫ S.g = 0) ≫ homologyπ S = 0

Next tactic:
dsimp only [homologyπ]
lemma liftCycles_homologyπ_eq_zero_of_boundary [S.HasHomology]
    (k : A ⟶ S.X₂) (x : A ⟶ S.X₁) (hx : k = x ≫ S.f) :
    S.liftCycles k (by rw [hx, assoc, S.zero, comp_zero]) ≫ S.homologyπ = 0 := 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
k : A ⟶ S.X₂
x : A ⟶ S.X₁
hx : k = x ≫ S.f
⊢ liftCycles S k (_ : k ≫ S.g = 0) ≫ leftHomologyπ S ≫ (leftHomologyIso S).hom = 0

Next tactic:
rw [S.liftCycles_leftHomologyπ_eq_zero_of_boundary_assoc k x hx, zero_comp]
@[reassoc]
lemma homologyι_descOpcycles_eq_zero_of_boundary [S.HasHomology]
    (k : S.X₂ ⟶ A) (x : S.X₃ ⟶ A) (hx : k = S.g ≫ x) :
    S.homologyι ≫ S.descOpcycles k (by 

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
k : S.X₂ ⟶ A
x : S.X₃ ⟶ A
hx : k = S.g ≫ x
⊢ S.f ≫ k = 0

Next tactic:
rw [hx, S.zero_assoc, zero_comp]
@[reassoc]
lemma homologyι_descOpcycles_eq_zero_of_boundary [S.HasHomology]
    (k : S.X₂ ⟶ A) (x : S.X₃ ⟶ A) (hx : k = S.g ≫ x) :
    S.homologyι ≫ S.descOpcycles k (by rw [hx, S.zero_assoc, zero_comp]) = 0 := 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
k : S.X₂ ⟶ A
x : S.X₃ ⟶ A
hx : k = S.g ≫ x
⊢ homologyι S ≫ descOpcycles S k (_ : S.f ≫ k = 0) = 0

Next tactic:
dsimp only [homologyι]
@[reassoc]
lemma homologyι_descOpcycles_eq_zero_of_boundary [S.HasHomology]
    (k : S.X₂ ⟶ A) (x : S.X₃ ⟶ A) (hx : k = S.g ≫ x) :
    S.homologyι ≫ S.descOpcycles k (by rw [hx, S.zero_assoc, zero_comp]) = 0 := 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
k : S.X₂ ⟶ A
x : S.X₃ ⟶ A
hx : k = S.g ≫ x
⊢ ((rightHomologyIso S).inv ≫ rightHomologyι S) ≫ descOpcycles S k (_ : S.f ≫ k = 0) = 0

Next tactic:
rw [assoc, S.rightHomologyι_descOpcycles_π_eq_zero_of_boundary k x hx, comp_zero]
lemma isIso_homologyMap_of_isIso_cyclesMap_of_epi {φ : S₁ ⟶ S₂}
    [S₁.HasHomology] [S₂.HasHomology] (h₁ : IsIso (cyclesMap φ)) (h₂ : Epi φ.τ₁) :
    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₂
A : C
φ : S₁ ⟶ S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
h₁ : IsIso (cyclesMap φ)
h₂ : Epi φ.τ₁
⊢ IsIso (homologyMap φ)

Next tactic:
have h : S₂.toCycles ≫ inv (cyclesMap φ) ≫ S₁.homologyπ = 0 := by
    simp only [← cancel_epi φ.τ₁, ← toCycles_naturality_assoc,
      IsIso.hom_inv_id_assoc, toCycles_comp_homologyπ, comp_zero]
lemma isIso_homologyMap_of_isIso_cyclesMap_of_epi {φ : S₁ ⟶ S₂}
    [S₁.HasHomology] [S₂.HasHomology] (h₁ : IsIso (cyclesMap φ)) (h₂ : Epi φ.τ₁) :
    IsIso (homologyMap φ) := by
  have h : S₂.toCycles ≫ inv (cyclesMap φ) ≫ 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
φ : S₁ ⟶ S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
h₁ : IsIso (cyclesMap φ)
h₂ : Epi φ.τ₁
⊢ toCycles S₂ ≫ inv (cyclesMap φ) ≫ homologyπ S₁ = 0

Next tactic:
simp only [← cancel_epi φ.τ₁, ← toCycles_naturality_assoc,
      IsIso.hom_inv_id_assoc, toCycles_comp_homologyπ, comp_zero]
lemma isIso_homologyMap_of_isIso_cyclesMap_of_epi {φ : S₁ ⟶ S₂}
    [S₁.HasHomology] [S₂.HasHomology] (h₁ : IsIso (cyclesMap φ)) (h₂ : Epi φ.τ₁) :
    IsIso (homologyMap φ) := by
  have h : S₂.toCycles ≫ inv (cyclesMap φ) ≫ S₁.homologyπ = 0 := by
    simp only [← cancel_epi φ.τ₁, ← toCycles_naturality_assoc,
      IsIso.hom_inv_id_assoc, toCycles_comp_homologyπ, comp_zero]
  

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
φ : S₁ ⟶ S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
h₁ : IsIso (cyclesMap φ)
h₂ : Epi φ.τ₁
h : toCycles S₂ ≫ inv (cyclesMap φ) ≫ homologyπ S₁ = 0
⊢ IsIso (homologyMap φ)

Next tactic:
have ⟨z, hz⟩ := CokernelCofork.IsColimit.desc' S₂.homologyIsCokernel _ h
lemma isIso_homologyMap_of_isIso_cyclesMap_of_epi {φ : S₁ ⟶ S₂}
    [S₁.HasHomology] [S₂.HasHomology] (h₁ : IsIso (cyclesMap φ)) (h₂ : Epi φ.τ₁) :
    IsIso (homologyMap φ) := by
  have h : S₂.toCycles ≫ inv (cyclesMap φ) ≫ S₁.homologyπ = 0 := by
    simp only [← cancel_epi φ.τ₁, ← toCycles_naturality_assoc,
      IsIso.hom_inv_id_assoc, toCycles_comp_homologyπ, comp_zero]
  have ⟨z, hz⟩ := CokernelCofork.IsColimit.desc' S₂.homologyIsCokernel _ 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₂
A : C
φ : S₁ ⟶ S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
h₁ : IsIso (cyclesMap φ)
h₂ : Epi φ.τ₁
h : toCycles S₂ ≫ inv (cyclesMap φ) ≫ homologyπ S₁ = 0
z : (CokernelCofork.ofπ (homologyπ S₂) (_ : toCycles S₂ ≫ homologyπ S₂ = 0)).pt ⟶ homology S₁
hz :
  Cofork.π (CokernelCofork.ofπ (homologyπ S₂) (_ : toCycles S₂ ≫ homologyπ S₂ = 0)) ≫ z =
    inv (cyclesMap φ) ≫ homologyπ S₁
⊢ IsIso (homologyMap φ)

Next tactic:
dsimp at hz