l3lab/ntp-mathlib huggingface dataset:
lemma LeftHomologyMapData.quasiIso_iff {φ : S₁ ⟶ S₂} {h₁ : S₁.LeftHomologyData}
    {h₂ : S₂.LeftHomologyData} (γ : LeftHomologyMapData φ h₁ h₂) :
    QuasiIso φ ↔ IsIso γ.φH := by
  rw [ShortComplex.quasiIso_iff, γ.homologyMap_eq]
  

Proof state:
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ : LeftHomologyMapData φ h₁ h₂
⊢ IsIso ((LeftHomologyData.homologyIso h₁).hom ≫ γ.φH ≫ (LeftHomologyData.homologyIso h₂).inv) ↔ IsIso γ.φH

Next tactic:
constructor
lemma LeftHomologyMapData.quasiIso_iff {φ : S₁ ⟶ S₂} {h₁ : S₁.LeftHomologyData}
    {h₂ : S₂.LeftHomologyData} (γ : LeftHomologyMapData φ h₁ h₂) :
    QuasiIso φ ↔ IsIso γ.φH := by
  rw [ShortComplex.quasiIso_iff, γ.homologyMap_eq]
  constructor
  · 

Proof state:
case mp
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ : LeftHomologyMapData φ h₁ h₂
⊢ IsIso ((LeftHomologyData.homologyIso h₁).hom ≫ γ.φH ≫ (LeftHomologyData.homologyIso h₂).inv) → IsIso γ.φH

Next tactic:
intro h
lemma LeftHomologyMapData.quasiIso_iff {φ : S₁ ⟶ S₂} {h₁ : S₁.LeftHomologyData}
    {h₂ : S₂.LeftHomologyData} (γ : LeftHomologyMapData φ h₁ h₂) :
    QuasiIso φ ↔ IsIso γ.φH := by
  rw [ShortComplex.quasiIso_iff, γ.homologyMap_eq]
  constructor
  · intro h
    

Proof state:
case mp
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ : LeftHomologyMapData φ h₁ h₂
h : IsIso ((LeftHomologyData.homologyIso h₁).hom ≫ γ.φH ≫ (LeftHomologyData.homologyIso h₂).inv)
⊢ IsIso γ.φH

Next tactic:
haveI : IsIso (γ.φH ≫ (LeftHomologyData.homologyIso h₂).inv) :=
      IsIso.of_isIso_comp_left (LeftHomologyData.homologyIso h₁).hom _
lemma LeftHomologyMapData.quasiIso_iff {φ : S₁ ⟶ S₂} {h₁ : S₁.LeftHomologyData}
    {h₂ : S₂.LeftHomologyData} (γ : LeftHomologyMapData φ h₁ h₂) :
    QuasiIso φ ↔ IsIso γ.φH := by
  rw [ShortComplex.quasiIso_iff, γ.homologyMap_eq]
  constructor
  · intro h
    haveI : IsIso (γ.φH ≫ (LeftHomologyData.homologyIso h₂).inv) :=
      IsIso.of_isIso_comp_left (LeftHomologyData.homologyIso h₁).hom _
    

Proof state:
case mp
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ : LeftHomologyMapData φ h₁ h₂
h : IsIso ((LeftHomologyData.homologyIso h₁).hom ≫ γ.φH ≫ (LeftHomologyData.homologyIso h₂).inv)
this : IsIso (γ.φH ≫ (LeftHomologyData.homologyIso h₂).inv)
⊢ IsIso γ.φH

Next tactic:
exact IsIso.of_isIso_comp_right _ (LeftHomologyData.homologyIso h₂).inv
lemma LeftHomologyMapData.quasiIso_iff {φ : S₁ ⟶ S₂} {h₁ : S₁.LeftHomologyData}
    {h₂ : S₂.LeftHomologyData} (γ : LeftHomologyMapData φ h₁ h₂) :
    QuasiIso φ ↔ IsIso γ.φH := by
  rw [ShortComplex.quasiIso_iff, γ.homologyMap_eq]
  constructor
  · intro h
    haveI : IsIso (γ.φH ≫ (LeftHomologyData.homologyIso h₂).inv) :=
      IsIso.of_isIso_comp_left (LeftHomologyData.homologyIso h₁).hom _
    exact IsIso.of_isIso_comp_right _ (LeftHomologyData.homologyIso h₂).inv
  · 

Proof state:
case mpr
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ : LeftHomologyMapData φ h₁ h₂
⊢ IsIso γ.φH → IsIso ((LeftHomologyData.homologyIso h₁).hom ≫ γ.φH ≫ (LeftHomologyData.homologyIso h₂).inv)

Next tactic:
intro h
lemma LeftHomologyMapData.quasiIso_iff {φ : S₁ ⟶ S₂} {h₁ : S₁.LeftHomologyData}
    {h₂ : S₂.LeftHomologyData} (γ : LeftHomologyMapData φ h₁ h₂) :
    QuasiIso φ ↔ IsIso γ.φH := by
  rw [ShortComplex.quasiIso_iff, γ.homologyMap_eq]
  constructor
  · intro h
    haveI : IsIso (γ.φH ≫ (LeftHomologyData.homologyIso h₂).inv) :=
      IsIso.of_isIso_comp_left (LeftHomologyData.homologyIso h₁).hom _
    exact IsIso.of_isIso_comp_right _ (LeftHomologyData.homologyIso h₂).inv
  · intro h
    

Proof state:
case mpr
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ : LeftHomologyMapData φ h₁ h₂
h : IsIso γ.φH
⊢ IsIso ((LeftHomologyData.homologyIso h₁).hom ≫ γ.φH ≫ (LeftHomologyData.homologyIso h₂).inv)

Next tactic:
infer_instance
lemma RightHomologyMapData.quasiIso_iff {φ : S₁ ⟶ S₂} {h₁ : S₁.RightHomologyData}
    {h₂ : S₂.RightHomologyData} (γ : RightHomologyMapData φ h₁ h₂) :
    QuasiIso φ ↔ IsIso γ.φH := by
  

Proof state:
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : RightHomologyData S₁
h₂ : RightHomologyData S₂
γ : RightHomologyMapData φ h₁ h₂
⊢ QuasiIso φ ↔ IsIso γ.φH

Next tactic:
rw [ShortComplex.quasiIso_iff, γ.homologyMap_eq]
lemma RightHomologyMapData.quasiIso_iff {φ : S₁ ⟶ S₂} {h₁ : S₁.RightHomologyData}
    {h₂ : S₂.RightHomologyData} (γ : RightHomologyMapData φ h₁ h₂) :
    QuasiIso φ ↔ IsIso γ.φH := by
  rw [ShortComplex.quasiIso_iff, γ.homologyMap_eq]
  

Proof state:
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : RightHomologyData S₁
h₂ : RightHomologyData S₂
γ : RightHomologyMapData φ h₁ h₂
⊢ IsIso ((RightHomologyData.homologyIso h₁).hom ≫ γ.φH ≫ (RightHomologyData.homologyIso h₂).inv) ↔ IsIso γ.φH

Next tactic:
constructor
lemma RightHomologyMapData.quasiIso_iff {φ : S₁ ⟶ S₂} {h₁ : S₁.RightHomologyData}
    {h₂ : S₂.RightHomologyData} (γ : RightHomologyMapData φ h₁ h₂) :
    QuasiIso φ ↔ IsIso γ.φH := by
  rw [ShortComplex.quasiIso_iff, γ.homologyMap_eq]
  constructor
  · 

Proof state:
case mp
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : RightHomologyData S₁
h₂ : RightHomologyData S₂
γ : RightHomologyMapData φ h₁ h₂
⊢ IsIso ((RightHomologyData.homologyIso h₁).hom ≫ γ.φH ≫ (RightHomologyData.homologyIso h₂).inv) → IsIso γ.φH

Next tactic:
intro h
lemma RightHomologyMapData.quasiIso_iff {φ : S₁ ⟶ S₂} {h₁ : S₁.RightHomologyData}
    {h₂ : S₂.RightHomologyData} (γ : RightHomologyMapData φ h₁ h₂) :
    QuasiIso φ ↔ IsIso γ.φH := by
  rw [ShortComplex.quasiIso_iff, γ.homologyMap_eq]
  constructor
  · intro h
    

Proof state:
case mp
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : RightHomologyData S₁
h₂ : RightHomologyData S₂
γ : RightHomologyMapData φ h₁ h₂
h : IsIso ((RightHomologyData.homologyIso h₁).hom ≫ γ.φH ≫ (RightHomologyData.homologyIso h₂).inv)
⊢ IsIso γ.φH

Next tactic:
haveI : IsIso (γ.φH ≫ (RightHomologyData.homologyIso h₂).inv) :=
      IsIso.of_isIso_comp_left (RightHomologyData.homologyIso h₁).hom _
lemma RightHomologyMapData.quasiIso_iff {φ : S₁ ⟶ S₂} {h₁ : S₁.RightHomologyData}
    {h₂ : S₂.RightHomologyData} (γ : RightHomologyMapData φ h₁ h₂) :
    QuasiIso φ ↔ IsIso γ.φH := by
  rw [ShortComplex.quasiIso_iff, γ.homologyMap_eq]
  constructor
  · intro h
    haveI : IsIso (γ.φH ≫ (RightHomologyData.homologyIso h₂).inv) :=
      IsIso.of_isIso_comp_left (RightHomologyData.homologyIso h₁).hom _
    

Proof state:
case mp
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : RightHomologyData S₁
h₂ : RightHomologyData S₂
γ : RightHomologyMapData φ h₁ h₂
h : IsIso ((RightHomologyData.homologyIso h₁).hom ≫ γ.φH ≫ (RightHomologyData.homologyIso h₂).inv)
this : IsIso (γ.φH ≫ (RightHomologyData.homologyIso h₂).inv)
⊢ IsIso γ.φH

Next tactic:
exact IsIso.of_isIso_comp_right _ (RightHomologyData.homologyIso h₂).inv
lemma RightHomologyMapData.quasiIso_iff {φ : S₁ ⟶ S₂} {h₁ : S₁.RightHomologyData}
    {h₂ : S₂.RightHomologyData} (γ : RightHomologyMapData φ h₁ h₂) :
    QuasiIso φ ↔ IsIso γ.φH := by
  rw [ShortComplex.quasiIso_iff, γ.homologyMap_eq]
  constructor
  · intro h
    haveI : IsIso (γ.φH ≫ (RightHomologyData.homologyIso h₂).inv) :=
      IsIso.of_isIso_comp_left (RightHomologyData.homologyIso h₁).hom _
    exact IsIso.of_isIso_comp_right _ (RightHomologyData.homologyIso h₂).inv
  · 

Proof state:
case mpr
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : RightHomologyData S₁
h₂ : RightHomologyData S₂
γ : RightHomologyMapData φ h₁ h₂
⊢ IsIso γ.φH → IsIso ((RightHomologyData.homologyIso h₁).hom ≫ γ.φH ≫ (RightHomologyData.homologyIso h₂).inv)

Next tactic:
intro h
lemma RightHomologyMapData.quasiIso_iff {φ : S₁ ⟶ S₂} {h₁ : S₁.RightHomologyData}
    {h₂ : S₂.RightHomologyData} (γ : RightHomologyMapData φ h₁ h₂) :
    QuasiIso φ ↔ IsIso γ.φH := by
  rw [ShortComplex.quasiIso_iff, γ.homologyMap_eq]
  constructor
  · intro h
    haveI : IsIso (γ.φH ≫ (RightHomologyData.homologyIso h₂).inv) :=
      IsIso.of_isIso_comp_left (RightHomologyData.homologyIso h₁).hom _
    exact IsIso.of_isIso_comp_right _ (RightHomologyData.homologyIso h₂).inv
  · intro h
    

Proof state:
case mpr
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : RightHomologyData S₁
h₂ : RightHomologyData S₂
γ : RightHomologyMapData φ h₁ h₂
h : IsIso γ.φH
⊢ IsIso ((RightHomologyData.homologyIso h₁).hom ≫ γ.φH ≫ (RightHomologyData.homologyIso h₂).inv)

Next tactic:
infer_instance
lemma quasiIso_iff_isIso_leftHomologyMap' (φ : S₁ ⟶ S₂)
    (h₁ : S₁.LeftHomologyData) (h₂ : S₂.LeftHomologyData) :
    QuasiIso φ ↔ IsIso (leftHomologyMap' φ h₁ h₂) := by
  

Proof state:
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ QuasiIso φ ↔ IsIso (leftHomologyMap' φ h₁ h₂)

Next tactic:
have γ : LeftHomologyMapData φ h₁ h₂ := default
lemma quasiIso_iff_isIso_leftHomologyMap' (φ : S₁ ⟶ S₂)
    (h₁ : S₁.LeftHomologyData) (h₂ : S₂.LeftHomologyData) :
    QuasiIso φ ↔ IsIso (leftHomologyMap' φ h₁ h₂) := by
  have γ : LeftHomologyMapData φ h₁ h₂ := default
  

Proof state:
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ : LeftHomologyMapData φ h₁ h₂
⊢ QuasiIso φ ↔ IsIso (leftHomologyMap' φ h₁ h₂)

Next tactic:
rw [γ.quasiIso_iff, γ.leftHomologyMap'_eq]
lemma quasiIso_iff_isIso_rightHomologyMap' (φ : S₁ ⟶ S₂)
    (h₁ : S₁.RightHomologyData) (h₂ : S₂.RightHomologyData) :
    QuasiIso φ ↔ IsIso (rightHomologyMap' φ h₁ h₂) := by
  

Proof state:
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : RightHomologyData S₁
h₂ : RightHomologyData S₂
⊢ QuasiIso φ ↔ IsIso (rightHomologyMap' φ h₁ h₂)

Next tactic:
have γ : RightHomologyMapData φ h₁ h₂ := default
lemma quasiIso_iff_isIso_rightHomologyMap' (φ : S₁ ⟶ S₂)
    (h₁ : S₁.RightHomologyData) (h₂ : S₂.RightHomologyData) :
    QuasiIso φ ↔ IsIso (rightHomologyMap' φ h₁ h₂) := by
  have γ : RightHomologyMapData φ h₁ h₂ := default
  

Proof state:
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
h₁ : RightHomologyData S₁
h₂ : RightHomologyData S₂
γ : RightHomologyMapData φ h₁ h₂
⊢ QuasiIso φ ↔ IsIso (rightHomologyMap' φ h₁ h₂)

Next tactic:
rw [γ.quasiIso_iff, γ.rightHomologyMap'_eq]
lemma quasiIso_of_epi_of_isIso_of_mono (φ : S₁ ⟶ S₂) [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    QuasiIso φ := by
  

Proof state:
C : Type u_2
inst✝⁸ : Category.{u_1, u_2} C
inst✝⁷ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝⁶ : HasHomology S₁
inst✝⁵ : HasHomology S₂
inst✝⁴ : HasHomology S₃
inst✝³ : HasHomology S₄
φ : S₁ ⟶ S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
⊢ QuasiIso φ

Next tactic:
rw [((LeftHomologyMapData.ofEpiOfIsIsoOfMono φ) S₁.leftHomologyData).quasiIso_iff]
lemma quasiIso_of_epi_of_isIso_of_mono (φ : S₁ ⟶ S₂) [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    QuasiIso φ := by
  rw [((LeftHomologyMapData.ofEpiOfIsIsoOfMono φ) S₁.leftHomologyData).quasiIso_iff]
  

Proof state:
C : Type u_2
inst✝⁸ : Category.{u_1, u_2} C
inst✝⁷ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝⁶ : HasHomology S₁
inst✝⁵ : HasHomology S₂
inst✝⁴ : HasHomology S₃
inst✝³ : HasHomology S₄
φ : S₁ ⟶ S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
⊢ IsIso (LeftHomologyMapData.ofEpiOfIsIsoOfMono φ (leftHomologyData S₁)).φH

Next tactic:
dsimp
lemma quasiIso_of_epi_of_isIso_of_mono (φ : S₁ ⟶ S₂) [Epi φ.τ₁] [IsIso φ.τ₂] [Mono φ.τ₃] :
    QuasiIso φ := by
  rw [((LeftHomologyMapData.ofEpiOfIsIsoOfMono φ) S₁.leftHomologyData).quasiIso_iff]
  dsimp
  

Proof state:
C : Type u_2
inst✝⁸ : Category.{u_1, u_2} C
inst✝⁷ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝⁶ : HasHomology S₁
inst✝⁵ : HasHomology S₂
inst✝⁴ : HasHomology S₃
inst✝³ : HasHomology S₄
φ : S₁ ⟶ S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
⊢ IsIso (𝟙 (leftHomologyData S₁).H)

Next tactic:
infer_instance
lemma quasiIso_opMap_iff (φ : S₁ ⟶ S₂) :
    QuasiIso (opMap φ) ↔ QuasiIso φ := by
  

Proof state:
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
⊢ QuasiIso (opMap φ) ↔ QuasiIso φ

Next tactic:
have γ : HomologyMapData φ S₁.homologyData S₂.homologyData := default
lemma quasiIso_opMap_iff (φ : S₁ ⟶ S₂) :
    QuasiIso (opMap φ) ↔ QuasiIso φ := by
  have γ : HomologyMapData φ S₁.homologyData S₂.homologyData := default
  

Proof state:
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
γ : HomologyMapData φ (homologyData S₁) (homologyData S₂)
⊢ QuasiIso (opMap φ) ↔ QuasiIso φ

Next tactic:
rw [γ.left.quasiIso_iff, γ.op.right.quasiIso_iff]
lemma quasiIso_opMap_iff (φ : S₁ ⟶ S₂) :
    QuasiIso (opMap φ) ↔ QuasiIso φ := by
  have γ : HomologyMapData φ S₁.homologyData S₂.homologyData := default
  rw [γ.left.quasiIso_iff, γ.op.right.quasiIso_iff]
  

Proof state:
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
γ : HomologyMapData φ (homologyData S₁) (homologyData S₂)
⊢ IsIso (HomologyMapData.op γ).right.φH ↔ IsIso γ.left.φH

Next tactic:
dsimp
lemma quasiIso_opMap_iff (φ : S₁ ⟶ S₂) :
    QuasiIso (opMap φ) ↔ QuasiIso φ := by
  have γ : HomologyMapData φ S₁.homologyData S₂.homologyData := default
  rw [γ.left.quasiIso_iff, γ.op.right.quasiIso_iff]
  dsimp
  

Proof state:
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
γ : HomologyMapData φ (homologyData S₁) (homologyData S₂)
⊢ IsIso γ.left.φH.op ↔ IsIso γ.left.φH

Next tactic:
constructor
lemma quasiIso_opMap_iff (φ : S₁ ⟶ S₂) :
    QuasiIso (opMap φ) ↔ QuasiIso φ := by
  have γ : HomologyMapData φ S₁.homologyData S₂.homologyData := default
  rw [γ.left.quasiIso_iff, γ.op.right.quasiIso_iff]
  dsimp
  constructor
  · 

Proof state:
case mp
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
γ : HomologyMapData φ (homologyData S₁) (homologyData S₂)
⊢ IsIso γ.left.φH.op → IsIso γ.left.φH

Next tactic:
intro h
lemma quasiIso_opMap_iff (φ : S₁ ⟶ S₂) :
    QuasiIso (opMap φ) ↔ QuasiIso φ := by
  have γ : HomologyMapData φ S₁.homologyData S₂.homologyData := default
  rw [γ.left.quasiIso_iff, γ.op.right.quasiIso_iff]
  dsimp
  constructor
  · intro h
    

Proof state:
case mp
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
γ : HomologyMapData φ (homologyData S₁) (homologyData S₂)
h : IsIso γ.left.φH.op
⊢ IsIso γ.left.φH

Next tactic:
apply isIso_of_op
lemma quasiIso_opMap_iff (φ : S₁ ⟶ S₂) :
    QuasiIso (opMap φ) ↔ QuasiIso φ := by
  have γ : HomologyMapData φ S₁.homologyData S₂.homologyData := default
  rw [γ.left.quasiIso_iff, γ.op.right.quasiIso_iff]
  dsimp
  constructor
  · intro h
    apply isIso_of_op
  · 

Proof state:
case mpr
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
γ : HomologyMapData φ (homologyData S₁) (homologyData S₂)
⊢ IsIso γ.left.φH → IsIso γ.left.φH.op

Next tactic:
intro h
lemma quasiIso_opMap_iff (φ : S₁ ⟶ S₂) :
    QuasiIso (opMap φ) ↔ QuasiIso φ := by
  have γ : HomologyMapData φ S₁.homologyData S₂.homologyData := default
  rw [γ.left.quasiIso_iff, γ.op.right.quasiIso_iff]
  dsimp
  constructor
  · intro h
    apply isIso_of_op
  · intro h
    

Proof state:
case mpr
C : Type u_2
inst✝⁵ : Category.{u_1, u_2} C
inst✝⁴ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝³ : HasHomology S₁
inst✝² : HasHomology S₂
inst✝¹ : HasHomology S₃
inst✝ : HasHomology S₄
φ : S₁ ⟶ S₂
γ : HomologyMapData φ (homologyData S₁) (homologyData S₂)
h : IsIso γ.left.φH
⊢ IsIso γ.left.φH.op

Next tactic:
infer_instance
lemma quasiIso_opMap (φ : S₁ ⟶ S₂) [QuasiIso φ] :
    QuasiIso (opMap φ) := by
  

Proof state:
C : Type u_2
inst✝⁶ : Category.{u_1, u_2} C
inst✝⁵ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝⁴ : HasHomology S₁
inst✝³ : HasHomology S₂
inst✝² : HasHomology S₃
inst✝¹ : HasHomology S₄
φ : S₁ ⟶ S₂
inst✝ : QuasiIso φ
⊢ QuasiIso (opMap φ)

Next tactic:
rw [quasiIso_opMap_iff]
lemma quasiIso_opMap (φ : S₁ ⟶ S₂) [QuasiIso φ] :
    QuasiIso (opMap φ) := by
  rw [quasiIso_opMap_iff]
  

Proof state:
C : Type u_2
inst✝⁶ : Category.{u_1, u_2} C
inst✝⁵ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝⁴ : HasHomology S₁
inst✝³ : HasHomology S₂
inst✝² : HasHomology S₃
inst✝¹ : HasHomology S₄
φ : S₁ ⟶ S₂
inst✝ : QuasiIso φ
⊢ QuasiIso φ

Next tactic:
infer_instance
lemma quasiIso_unopMap {S₁ S₂ : ShortComplex Cᵒᵖ} [S₁.HasHomology] [S₂.HasHomology]
    [S₁.unop.HasHomology] [S₂.unop.HasHomology]
    (φ : S₁ ⟶ S₂) [QuasiIso φ] : QuasiIso (unopMap φ) := by
  

Proof state:
C : Type u_1
inst✝¹⁰ : Category.{u_2, u_1} C
inst✝⁹ : HasZeroMorphisms C
S₁✝ S₂✝ S₃ S₄ : ShortComplex C
inst✝⁸ : HasHomology S₁✝
inst✝⁷ : HasHomology S₂✝
inst✝⁶ : HasHomology S₃
inst✝⁵ : HasHomology S₄
S₁ S₂ : ShortComplex Cᵒᵖ
inst✝⁴ : HasHomology S₁
inst✝³ : HasHomology S₂
inst✝² : HasHomology (unop S₁)
inst✝¹ : HasHomology (unop S₂)
φ : S₁ ⟶ S₂
inst✝ : QuasiIso φ
⊢ QuasiIso (unopMap φ)

Next tactic:
rw [← quasiIso_opMap_iff]
lemma quasiIso_unopMap {S₁ S₂ : ShortComplex Cᵒᵖ} [S₁.HasHomology] [S₂.HasHomology]
    [S₁.unop.HasHomology] [S₂.unop.HasHomology]
    (φ : S₁ ⟶ S₂) [QuasiIso φ] : QuasiIso (unopMap φ) := by
  rw [← quasiIso_opMap_iff]
  

Proof state:
C : Type u_1
inst✝¹⁰ : Category.{u_2, u_1} C
inst✝⁹ : HasZeroMorphisms C
S₁✝ S₂✝ S₃ S₄ : ShortComplex C
inst✝⁸ : HasHomology S₁✝
inst✝⁷ : HasHomology S₂✝
inst✝⁶ : HasHomology S₃
inst✝⁵ : HasHomology S₄
S₁ S₂ : ShortComplex Cᵒᵖ
inst✝⁴ : HasHomology S₁
inst✝³ : HasHomology S₂
inst✝² : HasHomology (unop S₁)
inst✝¹ : HasHomology (unop S₂)
φ : S₁ ⟶ S₂
inst✝ : QuasiIso φ
⊢ QuasiIso (opMap (unopMap φ))

Next tactic:
change QuasiIso φ
lemma quasiIso_unopMap {S₁ S₂ : ShortComplex Cᵒᵖ} [S₁.HasHomology] [S₂.HasHomology]
    [S₁.unop.HasHomology] [S₂.unop.HasHomology]
    (φ : S₁ ⟶ S₂) [QuasiIso φ] : QuasiIso (unopMap φ) := by
  rw [← quasiIso_opMap_iff]
  change QuasiIso φ
  

Proof state:
C : Type u_1
inst✝¹⁰ : Category.{u_2, u_1} C
inst✝⁹ : HasZeroMorphisms C
S₁✝ S₂✝ S₃ S₄ : ShortComplex C
inst✝⁸ : HasHomology S₁✝
inst✝⁷ : HasHomology S₂✝
inst✝⁶ : HasHomology S₃
inst✝⁵ : HasHomology S₄
S₁ S₂ : ShortComplex Cᵒᵖ
inst✝⁴ : HasHomology S₁
inst✝³ : HasHomology S₂
inst✝² : HasHomology (unop S₁)
inst✝¹ : HasHomology (unop S₂)
φ : S₁ ⟶ S₂
inst✝ : QuasiIso φ
⊢ QuasiIso φ

Next tactic:
infer_instance
lemma quasiIso_iff_isIso_liftCycles (φ : S₁ ⟶ S₂)
    (hf₁ : S₁.f = 0) (hg₁ : S₁.g = 0) (hf₂ : S₂.f = 0) [S₁.HasHomology] [S₂.HasHomology] :
    QuasiIso φ ↔ IsIso (S₂.liftCycles φ.τ₂ (by 

Proof state:
C : Type ?u.28177
inst✝⁷ : Category.{?u.28181, ?u.28177} C
inst✝⁶ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝⁵ : HasHomology S₁
inst✝⁴ : HasHomology S₂
inst✝³ : HasHomology S₃
inst✝² : HasHomology S₄
φ : S₁ ⟶ S₂
hf₁ : S₁.f = 0
hg₁ : S₁.g = 0
hf₂ : S₂.f = 0
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
⊢ φ.τ₂ ≫ S₂.g = 0

Next tactic:
rw [φ.comm₂₃, hg₁, zero_comp]
lemma quasiIso_iff_isIso_liftCycles (φ : S₁ ⟶ S₂)
    (hf₁ : S₁.f = 0) (hg₁ : S₁.g = 0) (hf₂ : S₂.f = 0) [S₁.HasHomology] [S₂.HasHomology] :
    QuasiIso φ ↔ IsIso (S₂.liftCycles φ.τ₂ (by rw [φ.comm₂₃, hg₁, zero_comp])) := by
  

Proof state:
C : Type u_2
inst✝⁷ : Category.{u_1, u_2} C
inst✝⁶ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝⁵ : HasHomology S₁
inst✝⁴ : HasHomology S₂
inst✝³ : HasHomology S₃
inst✝² : HasHomology S₄
φ : S₁ ⟶ S₂
hf₁ : S₁.f = 0
hg₁ : S₁.g = 0
hf₂ : S₂.f = 0
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
⊢ QuasiIso φ ↔ IsIso (liftCycles S₂ φ.τ₂ (_ : φ.τ₂ ≫ S₂.g = 0))

Next tactic:
let H : LeftHomologyMapData φ (LeftHomologyData.ofZeros S₁ hf₁ hg₁)
      (LeftHomologyData.ofIsLimitKernelFork S₂ hf₂ _ S₂.cyclesIsKernel) :=
    { φK := S₂.liftCycles φ.τ₂ (by rw [φ.comm₂₃, hg₁, zero_comp])
      φH := S₂.liftCycles φ.τ₂ (by rw [φ.comm₂₃, hg₁, zero_comp]) }
lemma quasiIso_iff_isIso_liftCycles (φ : S₁ ⟶ S₂)
    (hf₁ : S₁.f = 0) (hg₁ : S₁.g = 0) (hf₂ : S₂.f = 0) [S₁.HasHomology] [S₂.HasHomology] :
    QuasiIso φ ↔ IsIso (S₂.liftCycles φ.τ₂ (by rw [φ.comm₂₃, hg₁, zero_comp])) := by
  let H : LeftHomologyMapData φ (LeftHomologyData.ofZeros S₁ hf₁ hg₁)
      (LeftHomologyData.ofIsLimitKernelFork S₂ hf₂ _ S₂.cyclesIsKernel) :=
    { φK := S₂.liftCycles φ.τ₂ (by 

Proof state:
C : Type u_2
inst✝⁷ : Category.{u_1, u_2} C
inst✝⁶ : HasZeroMorphisms C
S₁ S₂ S₃ S₄ : ShortComplex C
inst✝⁵ : HasHomology S₁
inst✝⁴ : HasHomology S₂
inst✝³ : HasHomology S₃
inst✝² : HasHomology S₄
φ : S₁ ⟶ S₂
hf₁ : S₁.f = 0
hg₁ : S₁.g = 0
hf₂ : S₂.f = 0
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
⊢ φ.τ₂ ≫ S₂.g = 0

Next tactic:
rw [φ.comm₂₃, hg₁, zero_comp]