l3lab/ntp-mathlib huggingface dataset:
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
  dsimp at hz
  

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 : homologyπ S₂ ≫ z = inv (cyclesMap φ) ≫ homologyπ S₁
⊢ IsIso (homologyMap φ)

Next tactic:
refine' ⟨⟨z, _, _⟩⟩
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
  dsimp at hz
  refine' ⟨⟨z, _, _⟩⟩
  · 

Proof state:
case refine'_1
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 : homologyπ S₂ ≫ z = inv (cyclesMap φ) ≫ homologyπ S₁
⊢ homologyMap φ ≫ z = 𝟙 (homology S₁)

Next tactic:
rw [← cancel_epi S₁.homologyπ, homologyπ_naturality_assoc, hz,
      IsIso.hom_inv_id_assoc, comp_id]
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
  dsimp at hz
  refine' ⟨⟨z, _, _⟩⟩
  · rw [← cancel_epi S₁.homologyπ, homologyπ_naturality_assoc, hz,
      IsIso.hom_inv_id_assoc, comp_id]
  · 

Proof state:
case refine'_2
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 : homologyπ S₂ ≫ z = inv (cyclesMap φ) ≫ homologyπ S₁
⊢ z ≫ homologyMap φ = 𝟙 (homology S₂)

Next tactic:
rw [← cancel_epi S₂.homologyπ, reassoc_of% hz, homologyπ_naturality,
      IsIso.inv_hom_id_assoc, comp_id]
lemma isIso_homologyMap_of_isIso_opcyclesMap_of_mono {φ : S₁ ⟶ S₂}
    [S₁.HasHomology] [S₂.HasHomology] (h₁ : IsIso (opcyclesMap φ)) (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₂
A : C
φ : S₁ ⟶ S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
h₁ : IsIso (opcyclesMap φ)
h₂ : Mono φ.τ₃
⊢ IsIso (homologyMap φ)

Next tactic:
have h : (S₂.homologyι ≫ inv (opcyclesMap φ)) ≫ S₁.fromOpcycles = 0 := by
    simp only [← cancel_mono φ.τ₃, zero_comp, assoc, ← fromOpcycles_naturality,
      IsIso.inv_hom_id_assoc, homologyι_comp_fromOpcycles]
lemma isIso_homologyMap_of_isIso_opcyclesMap_of_mono {φ : S₁ ⟶ S₂}
    [S₁.HasHomology] [S₂.HasHomology] (h₁ : IsIso (opcyclesMap φ)) (h₂ : Mono φ.τ₃) :
    IsIso (homologyMap φ) := by
  have h : (S₂.homologyι ≫ inv (opcyclesMap φ)) ≫ 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
φ : S₁ ⟶ S₂
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
h₁ : IsIso (opcyclesMap φ)
h₂ : Mono φ.τ₃
⊢ (homologyι S₂ ≫ inv (opcyclesMap φ)) ≫ fromOpcycles S₁ = 0

Next tactic:
simp only [← cancel_mono φ.τ₃, zero_comp, assoc, ← fromOpcycles_naturality,
      IsIso.inv_hom_id_assoc, homologyι_comp_fromOpcycles]
lemma isIso_homologyMap_of_isIso_opcyclesMap_of_mono {φ : S₁ ⟶ S₂}
    [S₁.HasHomology] [S₂.HasHomology] (h₁ : IsIso (opcyclesMap φ)) (h₂ : Mono φ.τ₃) :
    IsIso (homologyMap φ) := by
  have h : (S₂.homologyι ≫ inv (opcyclesMap φ)) ≫ S₁.fromOpcycles = 0 := by
    simp only [← cancel_mono φ.τ₃, zero_comp, assoc, ← fromOpcycles_naturality,
      IsIso.inv_hom_id_assoc, homologyι_comp_fromOpcycles]
  

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 (opcyclesMap φ)
h₂ : Mono φ.τ₃
h : (homologyι S₂ ≫ inv (opcyclesMap φ)) ≫ fromOpcycles S₁ = 0
⊢ IsIso (homologyMap φ)

Next tactic:
have ⟨z, hz⟩ := KernelFork.IsLimit.lift' S₁.homologyIsKernel _ h
lemma isIso_homologyMap_of_isIso_opcyclesMap_of_mono {φ : S₁ ⟶ S₂}
    [S₁.HasHomology] [S₂.HasHomology] (h₁ : IsIso (opcyclesMap φ)) (h₂ : Mono φ.τ₃) :
    IsIso (homologyMap φ) := by
  have h : (S₂.homologyι ≫ inv (opcyclesMap φ)) ≫ S₁.fromOpcycles = 0 := by
    simp only [← cancel_mono φ.τ₃, zero_comp, assoc, ← fromOpcycles_naturality,
      IsIso.inv_hom_id_assoc, homologyι_comp_fromOpcycles]
  have ⟨z, hz⟩ := KernelFork.IsLimit.lift' S₁.homologyIsKernel _ 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 (opcyclesMap φ)
h₂ : Mono φ.τ₃
h : (homologyι S₂ ≫ inv (opcyclesMap φ)) ≫ fromOpcycles S₁ = 0
z : homology S₂ ⟶ (KernelFork.ofι (homologyι S₁) (_ : homologyι S₁ ≫ fromOpcycles S₁ = 0)).pt
hz :
  z ≫ Fork.ι (KernelFork.ofι (homologyι S₁) (_ : homologyι S₁ ≫ fromOpcycles S₁ = 0)) =
    homologyι S₂ ≫ inv (opcyclesMap φ)
⊢ IsIso (homologyMap φ)

Next tactic:
dsimp at hz
lemma isIso_homologyMap_of_isIso_opcyclesMap_of_mono {φ : S₁ ⟶ S₂}
    [S₁.HasHomology] [S₂.HasHomology] (h₁ : IsIso (opcyclesMap φ)) (h₂ : Mono φ.τ₃) :
    IsIso (homologyMap φ) := by
  have h : (S₂.homologyι ≫ inv (opcyclesMap φ)) ≫ S₁.fromOpcycles = 0 := by
    simp only [← cancel_mono φ.τ₃, zero_comp, assoc, ← fromOpcycles_naturality,
      IsIso.inv_hom_id_assoc, homologyι_comp_fromOpcycles]
  have ⟨z, hz⟩ := KernelFork.IsLimit.lift' S₁.homologyIsKernel _ h
  dsimp at hz
  

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 (opcyclesMap φ)
h₂ : Mono φ.τ₃
h : (homologyι S₂ ≫ inv (opcyclesMap φ)) ≫ fromOpcycles S₁ = 0
z : homology S₂ ⟶ (KernelFork.ofι (homologyι S₁) (_ : homologyι S₁ ≫ fromOpcycles S₁ = 0)).pt
hz : z ≫ homologyι S₁ = homologyι S₂ ≫ inv (opcyclesMap φ)
⊢ IsIso (homologyMap φ)

Next tactic:
refine' ⟨⟨z, _, _⟩⟩
lemma isIso_homologyMap_of_isIso_opcyclesMap_of_mono {φ : S₁ ⟶ S₂}
    [S₁.HasHomology] [S₂.HasHomology] (h₁ : IsIso (opcyclesMap φ)) (h₂ : Mono φ.τ₃) :
    IsIso (homologyMap φ) := by
  have h : (S₂.homologyι ≫ inv (opcyclesMap φ)) ≫ S₁.fromOpcycles = 0 := by
    simp only [← cancel_mono φ.τ₃, zero_comp, assoc, ← fromOpcycles_naturality,
      IsIso.inv_hom_id_assoc, homologyι_comp_fromOpcycles]
  have ⟨z, hz⟩ := KernelFork.IsLimit.lift' S₁.homologyIsKernel _ h
  dsimp at hz
  refine' ⟨⟨z, _, _⟩⟩
  · 

Proof state:
case refine'_1
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 (opcyclesMap φ)
h₂ : Mono φ.τ₃
h : (homologyι S₂ ≫ inv (opcyclesMap φ)) ≫ fromOpcycles S₁ = 0
z : homology S₂ ⟶ (KernelFork.ofι (homologyι S₁) (_ : homologyι S₁ ≫ fromOpcycles S₁ = 0)).pt
hz : z ≫ homologyι S₁ = homologyι S₂ ≫ inv (opcyclesMap φ)
⊢ homologyMap φ ≫ z = 𝟙 (homology S₁)

Next tactic:
rw [← cancel_mono S₁.homologyι, id_comp, assoc, hz, homologyι_naturality_assoc,
      IsIso.hom_inv_id, comp_id]
lemma isIso_homologyMap_of_isIso_opcyclesMap_of_mono {φ : S₁ ⟶ S₂}
    [S₁.HasHomology] [S₂.HasHomology] (h₁ : IsIso (opcyclesMap φ)) (h₂ : Mono φ.τ₃) :
    IsIso (homologyMap φ) := by
  have h : (S₂.homologyι ≫ inv (opcyclesMap φ)) ≫ S₁.fromOpcycles = 0 := by
    simp only [← cancel_mono φ.τ₃, zero_comp, assoc, ← fromOpcycles_naturality,
      IsIso.inv_hom_id_assoc, homologyι_comp_fromOpcycles]
  have ⟨z, hz⟩ := KernelFork.IsLimit.lift' S₁.homologyIsKernel _ h
  dsimp at hz
  refine' ⟨⟨z, _, _⟩⟩
  · rw [← cancel_mono S₁.homologyι, id_comp, assoc, hz, homologyι_naturality_assoc,
      IsIso.hom_inv_id, comp_id]
  · 

Proof state:
case refine'_2
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 (opcyclesMap φ)
h₂ : Mono φ.τ₃
h : (homologyι S₂ ≫ inv (opcyclesMap φ)) ≫ fromOpcycles S₁ = 0
z : homology S₂ ⟶ (KernelFork.ofι (homologyι S₁) (_ : homologyι S₁ ≫ fromOpcycles S₁ = 0)).pt
hz : z ≫ homologyι S₁ = homologyι S₂ ≫ inv (opcyclesMap φ)
⊢ z ≫ homologyMap φ = 𝟙 (homology S₂)

Next tactic:
rw [← cancel_mono S₂.homologyι, assoc, homologyι_naturality, reassoc_of% hz,
      IsIso.inv_hom_id, comp_id, id_comp]
lemma isIso_homologyπ (hf : S.f = 0) [S.HasHomology] :
    IsIso 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
hf : S.f = 0
inst✝ : HasHomology S
⊢ IsIso (homologyπ S)

Next tactic:
have := S.isIso_leftHomologyπ hf
lemma isIso_homologyπ (hf : S.f = 0) [S.HasHomology] :
    IsIso S.homologyπ := by
  have := S.isIso_leftHomologyπ hf
  

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
hf : S.f = 0
inst✝ : HasHomology S
this : IsIso (leftHomologyπ S)
⊢ IsIso (homologyπ S)

Next tactic:
dsimp only [homologyπ]
lemma isIso_homologyπ (hf : S.f = 0) [S.HasHomology] :
    IsIso S.homologyπ := by
  have := S.isIso_leftHomologyπ hf
  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
hf : S.f = 0
inst✝ : HasHomology S
this : IsIso (leftHomologyπ S)
⊢ IsIso (leftHomologyπ S ≫ (leftHomologyIso S).hom)

Next tactic:
infer_instance
lemma isIso_homologyι (hg : S.g = 0) [S.HasHomology] :
    IsIso 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
hg : S.g = 0
inst✝ : HasHomology S
⊢ IsIso (homologyι S)

Next tactic:
have := S.isIso_rightHomologyι hg
lemma isIso_homologyι (hg : S.g = 0) [S.HasHomology] :
    IsIso S.homologyι := by
  have := S.isIso_rightHomologyι hg
  

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
hg : S.g = 0
inst✝ : HasHomology S
this : IsIso (rightHomologyι S)
⊢ IsIso (homologyι S)

Next tactic:
dsimp only [homologyι]
lemma isIso_homologyι (hg : S.g = 0) [S.HasHomology] :
    IsIso S.homologyι := by
  have := S.isIso_rightHomologyι hg
  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
hg : S.g = 0
inst✝ : HasHomology S
this : IsIso (rightHomologyι S)
⊢ IsIso ((rightHomologyIso S).inv ≫ rightHomologyι S)

Next tactic:
infer_instance
/-- The canonical isomorphism `S.cycles ≅ S.homology` when `S.f = 0`. -/
@[simps! hom]
noncomputable def asIsoHomologyπ (hf : S.f = 0) [S.HasHomology] :
    S.cycles ≅ S.homology := 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
hf : S.f = 0
inst✝ : HasHomology S
⊢ cycles S ≅ homology S

Next tactic:
have := S.isIso_homologyπ hf
/-- The canonical isomorphism `S.cycles ≅ S.homology` when `S.f = 0`. -/
@[simps! hom]
noncomputable def asIsoHomologyπ (hf : S.f = 0) [S.HasHomology] :
    S.cycles ≅ S.homology := by
  have := S.isIso_homologyπ hf
  

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
hf : S.f = 0
inst✝ : HasHomology S
this : IsIso (homologyπ S)
⊢ cycles S ≅ homology S

Next tactic:
exact asIso S.homologyπ
/-- The canonical isomorphism `S.homology ≅ S.opcycles` when `S.g = 0`. -/
@[simps! hom]
noncomputable def asIsoHomologyι (hg : S.g = 0) [S.HasHomology] :
    S.homology ≅ S.opcycles := 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
hg : S.g = 0
inst✝ : HasHomology S
⊢ homology S ≅ opcycles S

Next tactic:
have := S.isIso_homologyι hg
/-- The canonical isomorphism `S.homology ≅ S.opcycles` when `S.g = 0`. -/
@[simps! hom]
noncomputable def asIsoHomologyι (hg : S.g = 0) [S.HasHomology] :
    S.homology ≅ S.opcycles := by
  have := S.isIso_homologyι hg
  

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
hg : S.g = 0
inst✝ : HasHomology S
this : IsIso (homologyι S)
⊢ homology S ≅ opcycles S

Next tactic:
exact asIso S.homologyι
lemma mono_homologyMap_of_mono_opcyclesMap'
    [S₁.HasHomology] [S₂.HasHomology] (h : Mono (opcyclesMap φ)) :
    Mono (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
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
h : Mono (opcyclesMap φ)
⊢ Mono (homologyMap φ)

Next tactic:
have : Mono (homologyMap φ ≫ S₂.homologyι) := by
    rw [homologyι_naturality φ]
    apply mono_comp
lemma mono_homologyMap_of_mono_opcyclesMap'
    [S₁.HasHomology] [S₂.HasHomology] (h : Mono (opcyclesMap φ)) :
    Mono (homologyMap φ) := by
  have : Mono (homologyMap φ ≫ 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₁
inst✝ : HasHomology S₂
h : Mono (opcyclesMap φ)
⊢ Mono (homologyMap φ ≫ homologyι S₂)

Next tactic:
rw [homologyι_naturality φ]
lemma mono_homologyMap_of_mono_opcyclesMap'
    [S₁.HasHomology] [S₂.HasHomology] (h : Mono (opcyclesMap φ)) :
    Mono (homologyMap φ) := by
  have : Mono (homologyMap φ ≫ S₂.homologyι) := by
    rw [homologyι_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₁
inst✝ : HasHomology S₂
h : Mono (opcyclesMap φ)
⊢ Mono (homologyι S₁ ≫ opcyclesMap φ)

Next tactic:
apply mono_comp
lemma mono_homologyMap_of_mono_opcyclesMap'
    [S₁.HasHomology] [S₂.HasHomology] (h : Mono (opcyclesMap φ)) :
    Mono (homologyMap φ) := by
  have : Mono (homologyMap φ ≫ S₂.homologyι) := by
    rw [homologyι_naturality φ]
    apply mono_comp
  

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₂
h : Mono (opcyclesMap φ)
this : Mono (homologyMap φ ≫ homologyι S₂)
⊢ Mono (homologyMap φ)

Next tactic:
exact mono_of_mono (homologyMap φ) S₂.homologyι
lemma epi_homologyMap_of_epi_cyclesMap'
    [S₁.HasHomology] [S₂.HasHomology] (h : Epi (cyclesMap φ)) :
    Epi (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
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
h : Epi (cyclesMap φ)
⊢ Epi (homologyMap φ)

Next tactic:
have : Epi (S₁.homologyπ ≫ homologyMap φ) := by
    rw [homologyπ_naturality φ]
    apply epi_comp
lemma epi_homologyMap_of_epi_cyclesMap'
    [S₁.HasHomology] [S₂.HasHomology] (h : Epi (cyclesMap φ)) :
    Epi (homologyMap φ) := by
  have : Epi (S₁.homologyπ ≫ 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
inst✝¹ : HasHomology S₁
inst✝ : HasHomology S₂
h : Epi (cyclesMap φ)
⊢ Epi (homologyπ S₁ ≫ homologyMap φ)

Next tactic:
rw [homologyπ_naturality φ]
lemma epi_homologyMap_of_epi_cyclesMap'
    [S₁.HasHomology] [S₂.HasHomology] (h : Epi (cyclesMap φ)) :
    Epi (homologyMap φ) := by
  have : Epi (S₁.homologyπ ≫ homologyMap φ) := by
    rw [homologyπ_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₁
inst✝ : HasHomology S₂
h : Epi (cyclesMap φ)
⊢ Epi (cyclesMap φ ≫ homologyπ S₂)

Next tactic:
apply epi_comp
lemma epi_homologyMap_of_epi_cyclesMap'
    [S₁.HasHomology] [S₂.HasHomology] (h : Epi (cyclesMap φ)) :
    Epi (homologyMap φ) := by
  have : Epi (S₁.homologyπ ≫ homologyMap φ) := by
    rw [homologyπ_naturality φ]
    apply epi_comp
  

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₂
h : Epi (cyclesMap φ)
this : Epi (homologyπ S₁ ≫ homologyMap φ)
⊢ Epi (homologyMap φ)

Next tactic:
exact epi_of_epi S₁.homologyπ (homologyMap φ)
/-- This bootstraps `nonempty_sections_of_finite_inverse_system`. In this version,
the `F` functor is between categories of the same universe, and it is an easy
corollary to `TopCat.nonempty_limitCone_of_compact_t2_cofiltered_system`. -/
theorem nonempty_sections_of_finite_cofiltered_system.init {J : Type u} [SmallCategory J]
    [IsCofilteredOrEmpty J] (F : J ⥤ Type u) [hf : ∀ j, Finite (F.obj j)]
    [hne : ∀ j, Nonempty (F.obj j)] : F.sections.Nonempty := by
  

Proof state:
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsCofilteredOrEmpty J
F : J ⥤ Type u
hf : ∀ (j : J), Finite (F.obj j)
hne : ∀ (j : J), Nonempty (F.obj j)
⊢ Set.Nonempty (Functor.sections F)

Next tactic:
let F' : J ⥤ TopCat := F ⋙ TopCat.discrete
/-- This bootstraps `nonempty_sections_of_finite_inverse_system`. In this version,
the `F` functor is between categories of the same universe, and it is an easy
corollary to `TopCat.nonempty_limitCone_of_compact_t2_cofiltered_system`. -/
theorem nonempty_sections_of_finite_cofiltered_system.init {J : Type u} [SmallCategory J]
    [IsCofilteredOrEmpty J] (F : J ⥤ Type u) [hf : ∀ j, Finite (F.obj j)]
    [hne : ∀ j, Nonempty (F.obj j)] : F.sections.Nonempty := by
  let F' : J ⥤ TopCat := F ⋙ TopCat.discrete
  

Proof state:
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsCofilteredOrEmpty J
F : J ⥤ Type u
hf : ∀ (j : J), Finite (F.obj j)
hne : ∀ (j : J), Nonempty (F.obj j)
F' : J ⥤ TopCat := F ⋙ TopCat.discrete
⊢ Set.Nonempty (Functor.sections F)

Next tactic:
haveI : ∀ j, DiscreteTopology (F'.obj j) := fun _ => ⟨rfl⟩
/-- This bootstraps `nonempty_sections_of_finite_inverse_system`. In this version,
the `F` functor is between categories of the same universe, and it is an easy
corollary to `TopCat.nonempty_limitCone_of_compact_t2_cofiltered_system`. -/
theorem nonempty_sections_of_finite_cofiltered_system.init {J : Type u} [SmallCategory J]
    [IsCofilteredOrEmpty J] (F : J ⥤ Type u) [hf : ∀ j, Finite (F.obj j)]
    [hne : ∀ j, Nonempty (F.obj j)] : F.sections.Nonempty := by
  let F' : J ⥤ TopCat := F ⋙ TopCat.discrete
  haveI : ∀ j, DiscreteTopology (F'.obj j) := fun _ => ⟨rfl⟩
  

Proof state:
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsCofilteredOrEmpty J
F : J ⥤ Type u
hf : ∀ (j : J), Finite (F.obj j)
hne : ∀ (j : J), Nonempty (F.obj j)
F' : J ⥤ TopCat := F ⋙ TopCat.discrete
this : ∀ (j : J), DiscreteTopology ↑(F'.obj j)
⊢ Set.Nonempty (Functor.sections F)

Next tactic:
haveI : ∀ j, Finite (F'.obj j) := hf
/-- This bootstraps `nonempty_sections_of_finite_inverse_system`. In this version,
the `F` functor is between categories of the same universe, and it is an easy
corollary to `TopCat.nonempty_limitCone_of_compact_t2_cofiltered_system`. -/
theorem nonempty_sections_of_finite_cofiltered_system.init {J : Type u} [SmallCategory J]
    [IsCofilteredOrEmpty J] (F : J ⥤ Type u) [hf : ∀ j, Finite (F.obj j)]
    [hne : ∀ j, Nonempty (F.obj j)] : F.sections.Nonempty := by
  let F' : J ⥤ TopCat := F ⋙ TopCat.discrete
  haveI : ∀ j, DiscreteTopology (F'.obj j) := fun _ => ⟨rfl⟩
  haveI : ∀ j, Finite (F'.obj j) := hf
  

Proof state:
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsCofilteredOrEmpty J
F : J ⥤ Type u
hf : ∀ (j : J), Finite (F.obj j)
hne : ∀ (j : J), Nonempty (F.obj j)
F' : J ⥤ TopCat := F ⋙ TopCat.discrete
this✝ : ∀ (j : J), DiscreteTopology ↑(F'.obj j)
this : ∀ (j : J), Finite ↑(F'.obj j)
⊢ Set.Nonempty (Functor.sections F)

Next tactic:
haveI : ∀ j, Nonempty (F'.obj j) := hne
/-- This bootstraps `nonempty_sections_of_finite_inverse_system`. In this version,
the `F` functor is between categories of the same universe, and it is an easy
corollary to `TopCat.nonempty_limitCone_of_compact_t2_cofiltered_system`. -/
theorem nonempty_sections_of_finite_cofiltered_system.init {J : Type u} [SmallCategory J]
    [IsCofilteredOrEmpty J] (F : J ⥤ Type u) [hf : ∀ j, Finite (F.obj j)]
    [hne : ∀ j, Nonempty (F.obj j)] : F.sections.Nonempty := by
  let F' : J ⥤ TopCat := F ⋙ TopCat.discrete
  haveI : ∀ j, DiscreteTopology (F'.obj j) := fun _ => ⟨rfl⟩
  haveI : ∀ j, Finite (F'.obj j) := hf
  haveI : ∀ j, Nonempty (F'.obj j) := hne
  

Proof state:
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsCofilteredOrEmpty J
F : J ⥤ Type u
hf : ∀ (j : J), Finite (F.obj j)
hne : ∀ (j : J), Nonempty (F.obj j)
F' : J ⥤ TopCat := F ⋙ TopCat.discrete
this✝¹ : ∀ (j : J), DiscreteTopology ↑(F'.obj j)
this✝ : ∀ (j : J), Finite ↑(F'.obj j)
this : ∀ (j : J), Nonempty ↑(F'.obj j)
⊢ Set.Nonempty (Functor.sections F)

Next tactic:
obtain ⟨⟨u, hu⟩⟩ := TopCat.nonempty_limitCone_of_compact_t2_cofiltered_system.{u} F'