[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.11751, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
k : A ⟶ S.X₂
x : A ⟶ S.X₁
hx : k = x ≫ S.f
⊢ k ≫ S.g = 0
[PROOFSTEP]
rw [hx, assoc, S.zero, comp_zero]
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
k : A ⟶ S.X₂
x : A ⟶ S.X₁
hx : k = x ≫ S.f
⊢ liftK h k (_ : k ≫ S.g = 0) ≫ h.π = 0
[PROOFSTEP]
rw [show 0 = (x ≫ h.f') ≫ h.π by simp]
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
k : A ⟶ S.X₂
x : A ⟶ S.X₁
hx : k = x ≫ S.f
⊢ 0 = (x ≫ f' h) ≫ h.π
[PROOFSTEP]
simp
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
k : A ⟶ S.X₂
x : A ⟶ S.X₁
hx : k = x ≫ S.f
⊢ liftK h k (_ : k ≫ S.g = 0) ≫ h.π = (x ≫ f' h) ≫ h.π
[PROOFSTEP]
congr 1
[GOAL]
case e_a
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
k : A ⟶ S.X₂
x : A ⟶ S.X₁
hx : k = x ≫ S.f
⊢ liftK h k (_ : k ≫ S.g = 0) = x ≫ f' h
[PROOFSTEP]
simp only [← cancel_mono h.i, hx, liftK_i, assoc, f'_i]
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hg : S.g = 0
⊢ 𝟙 S.X₂ ≫ S.g = 0
[PROOFSTEP]
rw [hg, id_comp]
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hg : S.g = 0
⊢ h.i ≫ liftK h (𝟙 S.X₂) (_ : 𝟙 S.X₂ ≫ S.g = 0) = 𝟙 h.K
[PROOFSTEP]
simp only [← cancel_mono h.i, id_comp, assoc, liftK_i, comp_id]
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hf : S.f = 0
⊢ IsIso h.π
[PROOFSTEP]
have ⟨φ, hφ⟩ := CokernelCofork.IsColimit.desc' h.hπ' (𝟙 _) (by rw [← cancel_mono h.i, comp_id, f'_i, zero_comp, hf])
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hf : S.f = 0
⊢ f' h ≫ 𝟙 h.K = 0
[PROOFSTEP]
rw [← cancel_mono h.i, comp_id, f'_i, zero_comp, hf]
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hf : S.f = 0
φ : (CokernelCofork.ofπ h.π (_ : f' h ≫ h.π = 0)).pt ⟶ h.K
hφ : Cofork.π (CokernelCofork.ofπ h.π (_ : f' h ≫ h.π = 0)) ≫ φ = 𝟙 h.K
⊢ IsIso h.π
[PROOFSTEP]
dsimp at hφ 
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hf : S.f = 0
φ : (CokernelCofork.ofπ h.π (_ : f' h ≫ h.π = 0)).pt ⟶ h.K
hφ : h.π ≫ φ = 𝟙 h.K
⊢ IsIso h.π
[PROOFSTEP]
exact ⟨φ, hφ, by rw [← cancel_epi h.π, reassoc_of% hφ, comp_id]⟩
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hf : S.f = 0
φ : (CokernelCofork.ofπ h.π (_ : f' h ≫ h.π = 0)).pt ⟶ h.K
hφ : h.π ≫ φ = 𝟙 h.K
⊢ φ ≫ h.π = 𝟙 h.H
[PROOFSTEP]
rw [← cancel_epi h.π, reassoc_of% hφ, comp_id]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.20415, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hg : S.g = 0
c : CokernelCofork S.f
hc : IsColimit c
⊢ 𝟙 S.X₂ ≫ S.g = 0
[PROOFSTEP]
rw [id_comp, hg]
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hg : S.g = 0
c : CokernelCofork S.f
hc : IsColimit c
⊢ f' (ofIsColimitCokernelCofork S hg c hc) = S.f
[PROOFSTEP]
rw [← cancel_mono (ofIsColimitCokernelCofork S hg c hc).i, f'_i, ofIsColimitCokernelCofork_i]
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hg : S.g = 0
c : CokernelCofork S.f
hc : IsColimit c
⊢ S.f = S.f ≫ 𝟙 S.X₂
[PROOFSTEP]
dsimp
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hg : S.g = 0
c : CokernelCofork S.f
hc : IsColimit c
⊢ S.f = S.f ≫ 𝟙 S.X₂
[PROOFSTEP]
rw [comp_id]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.25743, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hf : S.f = 0
c : KernelFork S.g
hc : IsLimit c
⊢ (IsLimit.lift (IsLimit.ofIsoLimit hc (Fork.ext (Iso.refl c.pt))) (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)) ≫ 𝟙 c.pt) ≫
      Fork.ι c =
    0 ≫ Fork.ι c
[PROOFSTEP]
dsimp
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.25743, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hf : S.f = 0
c : KernelFork S.g
hc : IsLimit c
⊢ ((IsLimit.lift hc (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)) ≫ 𝟙 c.pt) ≫ 𝟙 c.pt) ≫ Fork.ι c = 0 ≫ Fork.ι c
[PROOFSTEP]
simp only [comp_id, zero_comp, Fork.IsLimit.lift_ι, Fork.ι_ofι, hf]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.25743, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hf : S.f = 0
c : KernelFork S.g
hc : IsLimit c
⊢ IsLimit.lift (IsLimit.ofIsoLimit hc (Fork.ext (Iso.refl c.pt))) (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)) ≫ Fork.ι c =
    0 ≫ Fork.ι c
[PROOFSTEP]
dsimp
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.25743, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hf : S.f = 0
c : KernelFork S.g
hc : IsLimit c
⊢ (IsLimit.lift hc (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)) ≫ 𝟙 c.pt) ≫ Fork.ι c = 0 ≫ Fork.ι c
[PROOFSTEP]
simp only [comp_id, zero_comp, Fork.IsLimit.lift_ι, Fork.ι_ofι, hf]
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hf : S.f = 0
c : KernelFork S.g
hc : IsLimit c
⊢ f' (ofIsLimitKernelFork S hf c hc) = 0
[PROOFSTEP]
rw [← cancel_mono (ofIsLimitKernelFork S hf c hc).i, f'_i, hf, zero_comp]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.30745, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hf : S.f = 0
hg : S.g = 0
⊢ 𝟙 S.X₂ ≫ S.g = 0
[PROOFSTEP]
rw [id_comp, hg]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.30745, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hf : S.f = 0
hg : S.g = 0
⊢ IsLimit.lift (KernelFork.IsLimit.ofId S.g hg) (KernelFork.ofι S.f (_ : S.f ≫ S.g = 0)) ≫ 𝟙 S.X₂ = 0
[PROOFSTEP]
change S.f ≫ 𝟙 _ = 0
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.30745, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hf : S.f = 0
hg : S.g = 0
⊢ S.f ≫ 𝟙 S.X₂ = 0
[PROOFSTEP]
simp only [hf, zero_comp]
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
hf : S.f = 0
hg : S.g = 0
⊢ f' (ofZeros S hf hg) = 0
[PROOFSTEP]
rw [← cancel_mono ((ofZeros S hf hg).i), zero_comp, f'_i, hf]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.51232, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
ψ₁ ψ₂ : LeftHomologyMapData φ h₁ h₂
⊢ ψ₁ = ψ₂
[PROOFSTEP]
have hK : ψ₁.φK = ψ₂.φK := by rw [← cancel_mono h₂.i, commi, commi]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.51232, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
ψ₁ ψ₂ : LeftHomologyMapData φ h₁ h₂
⊢ ψ₁.φK = ψ₂.φK
[PROOFSTEP]
rw [← cancel_mono h₂.i, commi, commi]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.51232, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
ψ₁ ψ₂ : LeftHomologyMapData φ h₁ h₂
hK : ψ₁.φK = ψ₂.φK
⊢ ψ₁ = ψ₂
[PROOFSTEP]
have hH : ψ₁.φH = ψ₂.φH := by rw [← cancel_epi h₁.π, commπ, commπ, hK]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.51232, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
ψ₁ ψ₂ : LeftHomologyMapData φ h₁ h₂
hK : ψ₁.φK = ψ₂.φK
⊢ ψ₁.φH = ψ₂.φH
[PROOFSTEP]
rw [← cancel_epi h₁.π, commπ, commπ, hK]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.51232, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
ψ₁ ψ₂ : LeftHomologyMapData φ h₁ h₂
hK : ψ₁.φK = ψ₂.φK
hH : ψ₁.φH = ψ₂.φH
⊢ ψ₁ = ψ₂
[PROOFSTEP]
cases ψ₁
[GOAL]
case mk
C : Type u_1
inst✝¹ : Category.{?u.51232, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
ψ₂ : LeftHomologyMapData φ h₁ h₂
φK✝ : h₁.K ⟶ h₂.K
φH✝ : h₁.H ⟶ h₂.H
commi✝ : φK✝ ≫ h₂.i = h₁.i ≫ φ.τ₂
commf'✝ : LeftHomologyData.f' h₁ ≫ φK✝ = φ.τ₁ ≫ LeftHomologyData.f' h₂
commπ✝ : h₁.π ≫ φH✝ = φK✝ ≫ h₂.π
hK : (mk φK✝ φH✝).φK = ψ₂.φK
hH : (mk φK✝ φH✝).φH = ψ₂.φH
⊢ mk φK✝ φH✝ = ψ₂
[PROOFSTEP]
cases ψ₂
[GOAL]
case mk.mk
C : Type u_1
inst✝¹ : Category.{?u.51232, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
φK✝¹ : h₁.K ⟶ h₂.K
φH✝¹ : h₁.H ⟶ h₂.H
commi✝¹ : φK✝¹ ≫ h₂.i = h₁.i ≫ φ.τ₂
commf'✝¹ : LeftHomologyData.f' h₁ ≫ φK✝¹ = φ.τ₁ ≫ LeftHomologyData.f' h₂
commπ✝¹ : h₁.π ≫ φH✝¹ = φK✝¹ ≫ h₂.π
φK✝ : h₁.K ⟶ h₂.K
φH✝ : h₁.H ⟶ h₂.H
commi✝ : φK✝ ≫ h₂.i = h₁.i ≫ φ.τ₂
commf'✝ : LeftHomologyData.f' h₁ ≫ φK✝ = φ.τ₁ ≫ LeftHomologyData.f' h₂
commπ✝ : h₁.π ≫ φH✝ = φK✝ ≫ h₂.π
hK : (mk φK✝¹ φH✝¹).φK = (mk φK✝ φH✝).φK
hH : (mk φK✝¹ φH✝¹).φH = (mk φK✝ φH✝).φH
⊢ mk φK✝¹ φH✝¹ = mk φK✝ φH✝
[PROOFSTEP]
congr
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.53678, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ LeftHomologyMapData φ h₁ h₂
[PROOFSTEP]
let φK : h₁.K ⟶ h₂.K := h₂.liftK (h₁.i ≫ φ.τ₂) (by rw [assoc, φ.comm₂₃, h₁.wi_assoc, zero_comp])
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.53678, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ (h₁.i ≫ φ.τ₂) ≫ S₂.g = 0
[PROOFSTEP]
rw [assoc, φ.comm₂₃, h₁.wi_assoc, zero_comp]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.53678, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
φK : h₁.K ⟶ h₂.K := LeftHomologyData.liftK h₂ (h₁.i ≫ φ.τ₂) (_ : (h₁.i ≫ φ.τ₂) ≫ S₂.g = 0)
⊢ LeftHomologyMapData φ h₁ h₂
[PROOFSTEP]
have commf' : h₁.f' ≫ φK = φ.τ₁ ≫ h₂.f' := by
  rw [← cancel_mono h₂.i, assoc, assoc, LeftHomologyData.liftK_i, LeftHomologyData.f'_i_assoc, LeftHomologyData.f'_i,
    φ.comm₁₂]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.53678, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
φK : h₁.K ⟶ h₂.K := LeftHomologyData.liftK h₂ (h₁.i ≫ φ.τ₂) (_ : (h₁.i ≫ φ.τ₂) ≫ S₂.g = 0)
⊢ LeftHomologyData.f' h₁ ≫ φK = φ.τ₁ ≫ LeftHomologyData.f' h₂
[PROOFSTEP]
rw [← cancel_mono h₂.i, assoc, assoc, LeftHomologyData.liftK_i, LeftHomologyData.f'_i_assoc, LeftHomologyData.f'_i,
  φ.comm₁₂]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.53678, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
φK : h₁.K ⟶ h₂.K := LeftHomologyData.liftK h₂ (h₁.i ≫ φ.τ₂) (_ : (h₁.i ≫ φ.τ₂) ≫ S₂.g = 0)
commf' : LeftHomologyData.f' h₁ ≫ φK = φ.τ₁ ≫ LeftHomologyData.f' h₂
⊢ LeftHomologyMapData φ h₁ h₂
[PROOFSTEP]
let φH : h₁.H ⟶ h₂.H := h₁.descH (φK ≫ h₂.π) (by rw [reassoc_of% commf', h₂.f'_π, comp_zero])
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.53678, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
φK : h₁.K ⟶ h₂.K := LeftHomologyData.liftK h₂ (h₁.i ≫ φ.τ₂) (_ : (h₁.i ≫ φ.τ₂) ≫ S₂.g = 0)
commf' : LeftHomologyData.f' h₁ ≫ φK = φ.τ₁ ≫ LeftHomologyData.f' h₂
⊢ LeftHomologyData.f' h₁ ≫ φK ≫ h₂.π = 0
[PROOFSTEP]
rw [reassoc_of% commf', h₂.f'_π, comp_zero]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.53678, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
φK : h₁.K ⟶ h₂.K := LeftHomologyData.liftK h₂ (h₁.i ≫ φ.τ₂) (_ : (h₁.i ≫ φ.τ₂) ≫ S₂.g = 0)
commf' : LeftHomologyData.f' h₁ ≫ φK = φ.τ₁ ≫ LeftHomologyData.f' h₂
φH : h₁.H ⟶ h₂.H := LeftHomologyData.descH h₁ (φK ≫ h₂.π) (_ : LeftHomologyData.f' h₁ ≫ φK ≫ h₂.π = 0)
⊢ LeftHomologyMapData φ h₁ h₂
[PROOFSTEP]
exact ⟨φK, φH, by simp, commf', by simp⟩
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.53678, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
φK : h₁.K ⟶ h₂.K := LeftHomologyData.liftK h₂ (h₁.i ≫ φ.τ₂) (_ : (h₁.i ≫ φ.τ₂) ≫ S₂.g = 0)
commf' : LeftHomologyData.f' h₁ ≫ φK = φ.τ₁ ≫ LeftHomologyData.f' h₂
φH : h₁.H ⟶ h₂.H := LeftHomologyData.descH h₁ (φK ≫ h₂.π) (_ : LeftHomologyData.f' h₁ ≫ φK ≫ h₂.π = 0)
⊢ φK ≫ h₂.i = h₁.i ≫ φ.τ₂
[PROOFSTEP]
simp
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.53678, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
φK : h₁.K ⟶ h₂.K := LeftHomologyData.liftK h₂ (h₁.i ≫ φ.τ₂) (_ : (h₁.i ≫ φ.τ₂) ≫ S₂.g = 0)
commf' : LeftHomologyData.f' h₁ ≫ φK = φ.τ₁ ≫ LeftHomologyData.f' h₂
φH : h₁.H ⟶ h₂.H := LeftHomologyData.descH h₁ (φK ≫ h₂.π) (_ : LeftHomologyData.f' h₁ ≫ φK ≫ h₂.π = 0)
⊢ h₁.π ≫ φH = φK ≫ h₂.π
[PROOFSTEP]
simp
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ₁ γ₂ : LeftHomologyMapData φ h₁ h₂
eq : γ₁ = γ₂
⊢ γ₁.φH = γ₂.φH
[PROOFSTEP]
rw [eq]
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ₁ γ₂ : LeftHomologyMapData φ h₁ h₂
eq : γ₁ = γ₂
⊢ γ₁.φK = γ₂.φK
[PROOFSTEP]
rw [eq]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.62763, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ✝ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
φ : S₁ ⟶ S₂
hg₁ : S₁.g = 0
c₁ : CokernelCofork S₁.f
hc₁ : IsColimit c₁
hg₂ : S₂.g = 0
c₂ : CokernelCofork S₂.f
hc₂ : IsColimit c₂
f : c₁.pt ⟶ c₂.pt
comm : φ.τ₂ ≫ Cofork.π c₂ = Cofork.π c₁ ≫ f
⊢ LeftHomologyData.f' (LeftHomologyData.ofIsColimitCokernelCofork S₁ hg₁ c₁ hc₁) ≫ φ.τ₂ =
    φ.τ₁ ≫ LeftHomologyData.f' (LeftHomologyData.ofIsColimitCokernelCofork S₂ hg₂ c₂ hc₂)
[PROOFSTEP]
simp only [LeftHomologyData.ofIsColimitCokernelCofork_f', φ.comm₁₂]
[GOAL]
C : Type u_1
inst✝² : Category.{?u.82184, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝ : HasLeftHomology S
⊢ Mono (iCycles S)
[PROOFSTEP]
dsimp only [iCycles]
[GOAL]
C : Type u_1
inst✝² : Category.{?u.82184, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝ : HasLeftHomology S
⊢ Mono (leftHomologyData S).i
[PROOFSTEP]
infer_instance
[GOAL]
C : Type u_1
inst✝² : Category.{?u.82564, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝ : HasLeftHomology S
⊢ Epi (leftHomologyπ S)
[PROOFSTEP]
dsimp only [leftHomologyπ]
[GOAL]
C : Type u_1
inst✝² : Category.{?u.82564, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝ : HasLeftHomology S
⊢ Epi (leftHomologyData S).π
[PROOFSTEP]
infer_instance
[GOAL]
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝ : HasLeftHomology S
A : C
f₁ f₂ : leftHomology S ⟶ A
⊢ f₁ = f₂ ↔ leftHomologyπ S ≫ f₁ = leftHomologyπ S ≫ f₂
[PROOFSTEP]
rw [cancel_epi]
[GOAL]
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝ : HasLeftHomology S
A : C
f₁ f₂ : leftHomology S ⟶ A
h : leftHomologyπ S ≫ f₁ = leftHomologyπ S ≫ f₂
⊢ f₁ = f₂
[PROOFSTEP]
simpa only [leftHomology_ext_iff] using h
[GOAL]
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝ : HasLeftHomology S
A : C
f₁ f₂ : A ⟶ cycles S
⊢ f₁ = f₂ ↔ f₁ ≫ iCycles S = f₂ ≫ iCycles S
[PROOFSTEP]
rw [cancel_mono]
[GOAL]
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝ : HasLeftHomology S
A : C
f₁ f₂ : A ⟶ cycles S
h : f₁ ≫ iCycles S = f₂ ≫ iCycles S
⊢ f₁ = f₂
[PROOFSTEP]
simpa only [cycles_ext_iff] using h
[GOAL]
C : Type u_1
inst✝² : Category.{?u.86307, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝ : HasLeftHomology S
hg : S.g = 0
⊢ cycles S ≅ S.X₂
[PROOFSTEP]
have := S.isIso_iCycles hg
[GOAL]
C : Type u_1
inst✝² : Category.{?u.86307, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝ : HasLeftHomology S
hg : S.g = 0
this : IsIso (iCycles S)
⊢ cycles S ≅ S.X₂
[PROOFSTEP]
exact asIso S.iCycles
[GOAL]
C : Type u_1
inst✝² : Category.{?u.89230, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝ : HasLeftHomology S
hf : S.f = 0
⊢ cycles S ≅ leftHomology S
[PROOFSTEP]
have := S.isIso_leftHomologyπ hf
[GOAL]
C : Type u_1
inst✝² : Category.{?u.89230, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝ : HasLeftHomology S
hf : S.f = 0
this : IsIso (leftHomologyπ S)
⊢ cycles S ≅ leftHomology S
[PROOFSTEP]
exact asIso S.leftHomologyπ
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ LeftHomologyData.f' h₁ ≫ cyclesMap' φ h₁ h₂ = φ.τ₁ ≫ LeftHomologyData.f' h₂
[PROOFSTEP]
simp only [← cancel_mono h₂.i, assoc, φ.comm₁₂, cyclesMap'_i, LeftHomologyData.f'_i_assoc, LeftHomologyData.f'_i]
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ₁ : S₁ ⟶ S₂
φ₂ : S₂ ⟶ S₃
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
h₃ : LeftHomologyData S₃
⊢ leftHomologyMap' (φ₁ ≫ φ₂) h₁ h₃ = leftHomologyMap' φ₁ h₁ h₂ ≫ leftHomologyMap' φ₂ h₂ h₃
[PROOFSTEP]
let γ₁ := leftHomologyMapData φ₁ h₁ h₂
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ₁ : S₁ ⟶ S₂
φ₂ : S₂ ⟶ S₃
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
h₃ : LeftHomologyData S₃
γ₁ : LeftHomologyMapData φ₁ h₁ h₂ := leftHomologyMapData φ₁ h₁ h₂
⊢ leftHomologyMap' (φ₁ ≫ φ₂) h₁ h₃ = leftHomologyMap' φ₁ h₁ h₂ ≫ leftHomologyMap' φ₂ h₂ h₃
[PROOFSTEP]
let γ₂ := leftHomologyMapData φ₂ h₂ h₃
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ₁ : S₁ ⟶ S₂
φ₂ : S₂ ⟶ S₃
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
h₃ : LeftHomologyData S₃
γ₁ : LeftHomologyMapData φ₁ h₁ h₂ := leftHomologyMapData φ₁ h₁ h₂
γ₂ : LeftHomologyMapData φ₂ h₂ h₃ := leftHomologyMapData φ₂ h₂ h₃
⊢ leftHomologyMap' (φ₁ ≫ φ₂) h₁ h₃ = leftHomologyMap' φ₁ h₁ h₂ ≫ leftHomologyMap' φ₂ h₂ h₃
[PROOFSTEP]
rw [γ₁.leftHomologyMap'_eq, γ₂.leftHomologyMap'_eq, (γ₁.comp γ₂).leftHomologyMap'_eq, LeftHomologyMapData.comp_φH]
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ₁ : S₁ ⟶ S₂
φ₂ : S₂ ⟶ S₃
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
h₃ : LeftHomologyData S₃
⊢ cyclesMap' (φ₁ ≫ φ₂) h₁ h₃ = cyclesMap' φ₁ h₁ h₂ ≫ cyclesMap' φ₂ h₂ h₃
[PROOFSTEP]
let γ₁ := leftHomologyMapData φ₁ h₁ h₂
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ₁ : S₁ ⟶ S₂
φ₂ : S₂ ⟶ S₃
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
h₃ : LeftHomologyData S₃
γ₁ : LeftHomologyMapData φ₁ h₁ h₂ := leftHomologyMapData φ₁ h₁ h₂
⊢ cyclesMap' (φ₁ ≫ φ₂) h₁ h₃ = cyclesMap' φ₁ h₁ h₂ ≫ cyclesMap' φ₂ h₂ h₃
[PROOFSTEP]
let γ₂ := leftHomologyMapData φ₂ h₂ h₃
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ₁ : S₁ ⟶ S₂
φ₂ : S₂ ⟶ S₃
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
h₃ : LeftHomologyData S₃
γ₁ : LeftHomologyMapData φ₁ h₁ h₂ := leftHomologyMapData φ₁ h₁ h₂
γ₂ : LeftHomologyMapData φ₂ h₂ h₃ := leftHomologyMapData φ₂ h₂ h₃
⊢ cyclesMap' (φ₁ ≫ φ₂) h₁ h₃ = cyclesMap' φ₁ h₁ h₂ ≫ cyclesMap' φ₂ h₂ h₃
[PROOFSTEP]
rw [γ₁.cyclesMap'_eq, γ₂.cyclesMap'_eq, (γ₁.comp γ₂).cyclesMap'_eq, LeftHomologyMapData.comp_φK]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.116872, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
e : S₁ ≅ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ leftHomologyMap' e.hom h₁ h₂ ≫ leftHomologyMap' e.inv h₂ h₁ = 𝟙 h₁.H
[PROOFSTEP]
rw [← leftHomologyMap'_comp, e.hom_inv_id, leftHomologyMap'_id]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.116872, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
e : S₁ ≅ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ leftHomologyMap' e.inv h₂ h₁ ≫ leftHomologyMap' e.hom h₁ h₂ = 𝟙 h₂.H
[PROOFSTEP]
rw [← leftHomologyMap'_comp, e.inv_hom_id, leftHomologyMap'_id]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.119499, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
e : S₁ ≅ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ cyclesMap' e.hom h₁ h₂ ≫ cyclesMap' e.inv h₂ h₁ = 𝟙 h₁.K
[PROOFSTEP]
rw [← cyclesMap'_comp, e.hom_inv_id, cyclesMap'_id]
[GOAL]
C : Type u_1
inst✝¹ : Category.{?u.119499, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
e : S₁ ≅ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ cyclesMap' e.inv h₂ h₁ ≫ cyclesMap' e.hom h₁ h₂ = 𝟙 h₂.K
[PROOFSTEP]
rw [← cyclesMap'_comp, e.inv_hom_id, cyclesMap'_id]
[GOAL]
C : Type u_1
inst✝³ : Category.{?u.122110, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
e : S₁ ≅ S₂
inst✝¹ : HasLeftHomology S₁
inst✝ : HasLeftHomology S₂
⊢ leftHomologyMap e.hom ≫ leftHomologyMap e.inv = 𝟙 (leftHomology S₁)
[PROOFSTEP]
rw [← leftHomologyMap_comp, e.hom_inv_id, leftHomologyMap_id]
[GOAL]
C : Type u_1
inst✝³ : Category.{?u.122110, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
e : S₁ ≅ S₂
inst✝¹ : HasLeftHomology S₁
inst✝ : HasLeftHomology S₂
⊢ leftHomologyMap e.inv ≫ leftHomologyMap e.hom = 𝟙 (leftHomology S₂)
[PROOFSTEP]
rw [← leftHomologyMap_comp, e.inv_hom_id, leftHomologyMap_id]
[GOAL]
C : Type u_1
inst✝³ : Category.{?u.125711, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
e : S₁ ≅ S₂
inst✝¹ : HasLeftHomology S₁
inst✝ : HasLeftHomology S₂
⊢ cyclesMap e.hom ≫ cyclesMap e.inv = 𝟙 (cycles S₁)
[PROOFSTEP]
rw [← cyclesMap_comp, e.hom_inv_id, cyclesMap_id]
[GOAL]
C : Type u_1
inst✝³ : Category.{?u.125711, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
e : S₁ ≅ S₂
inst✝¹ : HasLeftHomology S₁
inst✝ : HasLeftHomology S₂
⊢ cyclesMap e.inv ≫ cyclesMap e.hom = 𝟙 (cycles S₂)
[PROOFSTEP]
rw [← cyclesMap_comp, e.inv_hom_id, cyclesMap_id]
[GOAL]
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
inst✝ : HasLeftHomology S
⊢ (cyclesIso h).hom ≫ h.i = iCycles S
[PROOFSTEP]
dsimp [iCycles, LeftHomologyData.cyclesIso]
[GOAL]
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
inst✝ : HasLeftHomology S
⊢ cyclesMap' (𝟙 S) (leftHomologyData S) h ≫ h.i = (leftHomologyData S).i
[PROOFSTEP]
simp only [cyclesMap'_i, id_τ₂, comp_id]
[GOAL]
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
inst✝ : HasLeftHomology S
⊢ (cyclesIso h).inv ≫ iCycles S = h.i
[PROOFSTEP]
simp only [← h.cyclesIso_hom_comp_i, Iso.inv_hom_id_assoc]
[GOAL]
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
inst✝ : HasLeftHomology S
⊢ leftHomologyπ S ≫ (leftHomologyIso h).hom = (cyclesIso h).hom ≫ h.π
[PROOFSTEP]
dsimp only [leftHomologyπ, leftHomologyIso, cyclesIso, leftHomologyMapIso', cyclesMapIso', Iso.refl]
[GOAL]
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
inst✝ : HasLeftHomology S
⊢ (leftHomologyData S).π ≫ leftHomologyMap' (𝟙 S) (leftHomologyData S) h = cyclesMap' (𝟙 S) (leftHomologyData S) h ≫ h.π
[PROOFSTEP]
rw [← leftHomologyπ_naturality']
[GOAL]
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
inst✝ : HasLeftHomology S
⊢ h.π ≫ (leftHomologyIso h).inv = (cyclesIso h).inv ≫ leftHomologyπ S
[PROOFSTEP]
simp only [← cancel_epi h.cyclesIso.hom, ← cancel_mono h.leftHomologyIso.hom, assoc, Iso.inv_hom_id, comp_id,
  Iso.hom_inv_id_assoc, LeftHomologyData.leftHomologyπ_comp_leftHomologyIso_hom]
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ : LeftHomologyMapData φ h₁ h₂
inst✝¹ : HasLeftHomology S₁
inst✝ : HasLeftHomology S₂
⊢ leftHomologyMap φ = (LeftHomologyData.leftHomologyIso h₁).hom ≫ γ.φH ≫ (LeftHomologyData.leftHomologyIso h₂).inv
[PROOFSTEP]
dsimp [LeftHomologyData.leftHomologyIso, leftHomologyMapIso']
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ : LeftHomologyMapData φ h₁ h₂
inst✝¹ : HasLeftHomology S₁
inst✝ : HasLeftHomology S₂
⊢ leftHomologyMap φ =
    leftHomologyMap' (𝟙 S₁) (leftHomologyData S₁) h₁ ≫ γ.φH ≫ leftHomologyMap' (𝟙 S₂) h₂ (leftHomologyData S₂)
[PROOFSTEP]
rw [← γ.leftHomologyMap'_eq, ← leftHomologyMap'_comp, ← leftHomologyMap'_comp, id_comp, comp_id]
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ : LeftHomologyMapData φ h₁ h₂
inst✝¹ : HasLeftHomology S₁
inst✝ : HasLeftHomology S₂
⊢ leftHomologyMap φ = leftHomologyMap' φ (leftHomologyData S₁) (leftHomologyData S₂)
[PROOFSTEP]
rfl
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ : LeftHomologyMapData φ h₁ h₂
inst✝¹ : HasLeftHomology S₁
inst✝ : HasLeftHomology S₂
⊢ cyclesMap φ = (LeftHomologyData.cyclesIso h₁).hom ≫ γ.φK ≫ (LeftHomologyData.cyclesIso h₂).inv
[PROOFSTEP]
dsimp [LeftHomologyData.cyclesIso, cyclesMapIso']
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ : LeftHomologyMapData φ h₁ h₂
inst✝¹ : HasLeftHomology S₁
inst✝ : HasLeftHomology S₂
⊢ cyclesMap φ = cyclesMap' (𝟙 S₁) (leftHomologyData S₁) h₁ ≫ γ.φK ≫ cyclesMap' (𝟙 S₂) h₂ (leftHomologyData S₂)
[PROOFSTEP]
rw [← γ.cyclesMap'_eq, ← cyclesMap'_comp, ← cyclesMap'_comp, id_comp, comp_id]
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ : LeftHomologyMapData φ h₁ h₂
inst✝¹ : HasLeftHomology S₁
inst✝ : HasLeftHomology S₂
⊢ cyclesMap φ = cyclesMap' φ (leftHomologyData S₁) (leftHomologyData S₂)
[PROOFSTEP]
rfl
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ : LeftHomologyMapData φ h₁ h₂
inst✝¹ : HasLeftHomology S₁
inst✝ : HasLeftHomology S₂
⊢ leftHomologyMap φ ≫ (LeftHomologyData.leftHomologyIso h₂).hom = (LeftHomologyData.leftHomologyIso h₁).hom ≫ γ.φH
[PROOFSTEP]
simp only [γ.leftHomologyMap_eq, assoc, Iso.inv_hom_id, comp_id]
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
γ : LeftHomologyMapData φ h₁ h₂
inst✝¹ : HasLeftHomology S₁
inst✝ : HasLeftHomology S₂
⊢ cyclesMap φ ≫ (LeftHomologyData.cyclesIso h₂).hom = (LeftHomologyData.cyclesIso h₁).hom ≫ γ.φK
[PROOFSTEP]
simp only [γ.cyclesMap_eq, assoc, Iso.inv_hom_id, comp_id]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
⊢ LeftHomologyData S₂
[PROOFSTEP]
let i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
⊢ LeftHomologyData S₂
[PROOFSTEP]
have wi : i ≫ S₂.g = 0 := by simp only [assoc, φ.comm₂₃, h.wi_assoc, zero_comp]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
⊢ i ≫ S₂.g = 0
[PROOFSTEP]
simp only [assoc, φ.comm₂₃, h.wi_assoc, zero_comp]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
⊢ LeftHomologyData S₂
[PROOFSTEP]
have hi : IsLimit (KernelFork.ofι i wi) :=
  KernelFork.IsLimit.ofι _ _
    (fun x hx =>
      h.liftK (x ≫ inv φ.τ₂)
        (by rw [assoc, ← cancel_mono φ.τ₃, assoc, assoc, ← φ.comm₂₃, IsIso.inv_hom_id_assoc, hx, zero_comp]))
    (fun x hx => by simp)
    (fun x hx b hb => by
      dsimp
      rw [← cancel_mono h.i, ← cancel_mono φ.τ₂, assoc, assoc, liftK_i_assoc, assoc, IsIso.inv_hom_id, comp_id, hb])
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
W'✝ : C
x : W'✝ ⟶ S₂.X₂
hx : x ≫ S₂.g = 0
⊢ (x ≫ inv φ.τ₂) ≫ S₁.g = 0
[PROOFSTEP]
rw [assoc, ← cancel_mono φ.τ₃, assoc, assoc, ← φ.comm₂₃, IsIso.inv_hom_id_assoc, hx, zero_comp]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
W'✝ : C
x : W'✝ ⟶ S₂.X₂
hx : x ≫ S₂.g = 0
⊢ (fun {W'} x hx => liftK h (x ≫ inv φ.τ₂) (_ : (x ≫ inv φ.τ₂) ≫ S₁.g = 0)) x hx ≫ i = x
[PROOFSTEP]
simp
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
W'✝ : C
x : W'✝ ⟶ S₂.X₂
hx : x ≫ S₂.g = 0
b : W'✝ ⟶ h.K
hb : b ≫ i = x
⊢ b = (fun {W'} x hx => liftK h (x ≫ inv φ.τ₂) (_ : (x ≫ inv φ.τ₂) ≫ S₁.g = 0)) x hx
[PROOFSTEP]
dsimp
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
W'✝ : C
x : W'✝ ⟶ S₂.X₂
hx : x ≫ S₂.g = 0
b : W'✝ ⟶ h.K
hb : b ≫ i = x
⊢ b = liftK h (x ≫ inv φ.τ₂) (_ : (x ≫ inv φ.τ₂) ≫ S₁.g = 0)
[PROOFSTEP]
rw [← cancel_mono h.i, ← cancel_mono φ.τ₂, assoc, assoc, liftK_i_assoc, assoc, IsIso.inv_hom_id, comp_id, hb]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
hi : IsLimit (KernelFork.ofι i wi)
⊢ LeftHomologyData S₂
[PROOFSTEP]
let f' := hi.lift (KernelFork.ofι S₂.f S₂.zero)
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0))
⊢ LeftHomologyData S₂
[PROOFSTEP]
have hf' : φ.τ₁ ≫ f' = h.f' :=
  by
  have eq := @Fork.IsLimit.lift_ι _ _ _ _ _ _ _ ((KernelFork.ofι S₂.f S₂.zero)) hi
  simp only [Fork.ι_ofι] at eq 
  rw [← cancel_mono h.i, ← cancel_mono φ.τ₂, assoc, assoc, eq, f'_i, φ.comm₁₂]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0))
⊢ φ.τ₁ ≫ f' = CategoryTheory.ShortComplex.LeftHomologyData.f' h
[PROOFSTEP]
have eq := @Fork.IsLimit.lift_ι _ _ _ _ _ _ _ ((KernelFork.ofι S₂.f S₂.zero)) hi
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0))
eq :
  IsLimit.lift hi (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0)) ≫ Fork.ι (KernelFork.ofι i wi) =
    Fork.ι (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0))
⊢ φ.τ₁ ≫ f' = CategoryTheory.ShortComplex.LeftHomologyData.f' h
[PROOFSTEP]
simp only [Fork.ι_ofι] at eq 
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0))
eq : IsLimit.lift hi (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0)) ≫ h.i ≫ φ.τ₂ = S₂.f
⊢ φ.τ₁ ≫ f' = CategoryTheory.ShortComplex.LeftHomologyData.f' h
[PROOFSTEP]
rw [← cancel_mono h.i, ← cancel_mono φ.τ₂, assoc, assoc, eq, f'_i, φ.comm₁₂]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0))
hf' : φ.τ₁ ≫ f' = CategoryTheory.ShortComplex.LeftHomologyData.f' h
⊢ LeftHomologyData S₂
[PROOFSTEP]
have wπ : f' ≫ h.π = 0 := by rw [← cancel_epi φ.τ₁, comp_zero, reassoc_of% hf', h.f'_π]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0))
hf' : φ.τ₁ ≫ f' = CategoryTheory.ShortComplex.LeftHomologyData.f' h
⊢ f' ≫ h.π = 0
[PROOFSTEP]
rw [← cancel_epi φ.τ₁, comp_zero, reassoc_of% hf', h.f'_π]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0))
hf' : φ.τ₁ ≫ f' = CategoryTheory.ShortComplex.LeftHomologyData.f' h
wπ : f' ≫ h.π = 0
⊢ LeftHomologyData S₂
[PROOFSTEP]
have hπ : IsColimit (CokernelCofork.ofπ h.π wπ) :=
  CokernelCofork.IsColimit.ofπ _ _ (fun x hx => h.descH x (by rw [← hf', assoc, hx, comp_zero])) (fun x hx => by simp)
    (fun x hx b hb => by rw [← cancel_epi h.π, π_descH, hb])
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0))
hf' : φ.τ₁ ≫ f' = CategoryTheory.ShortComplex.LeftHomologyData.f' h
wπ : f' ≫ h.π = 0
Z'✝ : C
x : h.K ⟶ Z'✝
hx : f' ≫ x = 0
⊢ CategoryTheory.ShortComplex.LeftHomologyData.f' h ≫ x = 0
[PROOFSTEP]
rw [← hf', assoc, hx, comp_zero]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0))
hf' : φ.τ₁ ≫ f' = CategoryTheory.ShortComplex.LeftHomologyData.f' h
wπ : f' ≫ h.π = 0
Z'✝ : C
x : h.K ⟶ Z'✝
hx : f' ≫ x = 0
⊢ h.π ≫ (fun {Z'} x hx => descH h x (_ : CategoryTheory.ShortComplex.LeftHomologyData.f' h ≫ x = 0)) x hx = x
[PROOFSTEP]
simp
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0))
hf' : φ.τ₁ ≫ f' = CategoryTheory.ShortComplex.LeftHomologyData.f' h
wπ : f' ≫ h.π = 0
Z'✝ : C
x : h.K ⟶ Z'✝
hx : f' ≫ x = 0
b : h.H ⟶ Z'✝
hb : h.π ≫ b = x
⊢ b = (fun {Z'} x hx => descH h x (_ : CategoryTheory.ShortComplex.LeftHomologyData.f' h ≫ x = 0)) x hx
[PROOFSTEP]
rw [← cancel_epi h.π, π_descH, hb]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.150309, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₂.X₂ := h.i ≫ φ.τ₂
wi : i ≫ S₂.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₂.f (_ : S₂.f ≫ S₂.g = 0))
hf' : φ.τ₁ ≫ f' = CategoryTheory.ShortComplex.LeftHomologyData.f' h
wπ : f' ≫ h.π = 0
hπ : IsColimit (CokernelCofork.ofπ h.π wπ)
⊢ LeftHomologyData S₂
[PROOFSTEP]
exact ⟨h.K, h.H, i, h.π, wi, hi, wπ, hπ⟩
[GOAL]
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₁
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
⊢ φ.τ₁ ≫ f' (ofEpiOfIsIsoOfMono φ h) = f' h
[PROOFSTEP]
rw [← cancel_mono (ofEpiOfIsIsoOfMono φ h).i, assoc, f'_i, ofEpiOfIsIsoOfMono_i, f'_i_assoc, φ.comm₁₂]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
⊢ LeftHomologyData S₁
[PROOFSTEP]
let i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
⊢ LeftHomologyData S₁
[PROOFSTEP]
have wi : i ≫ S₁.g = 0 := by
  rw [assoc, ← cancel_mono φ.τ₃, zero_comp, assoc, assoc, ← φ.comm₂₃, IsIso.inv_hom_id_assoc, h.wi]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
⊢ i ≫ S₁.g = 0
[PROOFSTEP]
rw [assoc, ← cancel_mono φ.τ₃, zero_comp, assoc, assoc, ← φ.comm₂₃, IsIso.inv_hom_id_assoc, h.wi]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
wi : i ≫ S₁.g = 0
⊢ LeftHomologyData S₁
[PROOFSTEP]
have hi : IsLimit (KernelFork.ofι i wi) :=
  KernelFork.IsLimit.ofι _ _ (fun x hx => h.liftK (x ≫ φ.τ₂) (by rw [assoc, φ.comm₂₃, reassoc_of% hx, zero_comp]))
    (fun x hx => by simp)
    (fun x hx b hb => by
      rw [← cancel_mono h.i, ← cancel_mono (inv φ.τ₂), assoc, assoc, hb, liftK_i_assoc, assoc, IsIso.hom_inv_id,
        comp_id])
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
wi : i ≫ S₁.g = 0
W'✝ : C
x : W'✝ ⟶ S₁.X₂
hx : x ≫ S₁.g = 0
⊢ (x ≫ φ.τ₂) ≫ S₂.g = 0
[PROOFSTEP]
rw [assoc, φ.comm₂₃, reassoc_of% hx, zero_comp]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
wi : i ≫ S₁.g = 0
W'✝ : C
x : W'✝ ⟶ S₁.X₂
hx : x ≫ S₁.g = 0
⊢ (fun {W'} x hx => liftK h (x ≫ φ.τ₂) (_ : (x ≫ φ.τ₂) ≫ S₂.g = 0)) x hx ≫ i = x
[PROOFSTEP]
simp
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
wi : i ≫ S₁.g = 0
W'✝ : C
x : W'✝ ⟶ S₁.X₂
hx : x ≫ S₁.g = 0
b : W'✝ ⟶ h.K
hb : b ≫ i = x
⊢ b = (fun {W'} x hx => liftK h (x ≫ φ.τ₂) (_ : (x ≫ φ.τ₂) ≫ S₂.g = 0)) x hx
[PROOFSTEP]
rw [← cancel_mono h.i, ← cancel_mono (inv φ.τ₂), assoc, assoc, hb, liftK_i_assoc, assoc, IsIso.hom_inv_id, comp_id]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
wi : i ≫ S₁.g = 0
hi : IsLimit (KernelFork.ofι i wi)
⊢ LeftHomologyData S₁
[PROOFSTEP]
let f' := hi.lift (KernelFork.ofι S₁.f S₁.zero)
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
wi : i ≫ S₁.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0))
⊢ LeftHomologyData S₁
[PROOFSTEP]
have hf' : f' ≫ i = S₁.f := Fork.IsLimit.lift_ι _
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
wi : i ≫ S₁.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0))
hf' : f' ≫ i = S₁.f
⊢ LeftHomologyData S₁
[PROOFSTEP]
have hf'' : f' = φ.τ₁ ≫ h.f' := by
  rw [← cancel_mono h.i, ← cancel_mono (inv φ.τ₂), assoc, assoc, assoc, hf', f'_i_assoc, φ.comm₁₂_assoc,
    IsIso.hom_inv_id, comp_id]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
wi : i ≫ S₁.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0))
hf' : f' ≫ i = S₁.f
⊢ f' = φ.τ₁ ≫ CategoryTheory.ShortComplex.LeftHomologyData.f' h
[PROOFSTEP]
rw [← cancel_mono h.i, ← cancel_mono (inv φ.τ₂), assoc, assoc, assoc, hf', f'_i_assoc, φ.comm₁₂_assoc, IsIso.hom_inv_id,
  comp_id]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
wi : i ≫ S₁.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0))
hf' : f' ≫ i = S₁.f
hf'' : f' = φ.τ₁ ≫ CategoryTheory.ShortComplex.LeftHomologyData.f' h
⊢ LeftHomologyData S₁
[PROOFSTEP]
have wπ : f' ≫ h.π = 0 := by simp only [hf'', assoc, f'_π, comp_zero]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
wi : i ≫ S₁.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0))
hf' : f' ≫ i = S₁.f
hf'' : f' = φ.τ₁ ≫ CategoryTheory.ShortComplex.LeftHomologyData.f' h
⊢ f' ≫ h.π = 0
[PROOFSTEP]
simp only [hf'', assoc, f'_π, comp_zero]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
wi : i ≫ S₁.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0))
hf' : f' ≫ i = S₁.f
hf'' : f' = φ.τ₁ ≫ CategoryTheory.ShortComplex.LeftHomologyData.f' h
wπ : f' ≫ h.π = 0
⊢ LeftHomologyData S₁
[PROOFSTEP]
have hπ : IsColimit (CokernelCofork.ofπ h.π wπ) :=
  CokernelCofork.IsColimit.ofπ _ _
    (fun x hx => h.descH x (by rw [← cancel_epi φ.τ₁, ← reassoc_of% hf'', hx, comp_zero])) (fun x hx => π_descH _ _ _)
    (fun x hx b hx => by rw [← cancel_epi h.π, π_descH, hx])
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
wi : i ≫ S₁.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0))
hf' : f' ≫ i = S₁.f
hf'' : f' = φ.τ₁ ≫ CategoryTheory.ShortComplex.LeftHomologyData.f' h
wπ : f' ≫ h.π = 0
Z'✝ : C
x : h.K ⟶ Z'✝
hx : f' ≫ x = 0
⊢ CategoryTheory.ShortComplex.LeftHomologyData.f' h ≫ x = 0
[PROOFSTEP]
rw [← cancel_epi φ.τ₁, ← reassoc_of% hf'', hx, comp_zero]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
wi : i ≫ S₁.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0))
hf' : f' ≫ i = S₁.f
hf'' : f' = φ.τ₁ ≫ CategoryTheory.ShortComplex.LeftHomologyData.f' h
wπ : f' ≫ h.π = 0
Z'✝ : C
x : h.K ⟶ Z'✝
hx✝ : f' ≫ x = 0
b : h.H ⟶ Z'✝
hx : h.π ≫ b = x
⊢ b = (fun {Z'} x hx => descH h x (_ : CategoryTheory.ShortComplex.LeftHomologyData.f' h ≫ x = 0)) x hx✝
[PROOFSTEP]
rw [← cancel_epi h.π, π_descH, hx]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.166978, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
i : h.K ⟶ S₁.X₂ := h.i ≫ inv φ.τ₂
wi : i ≫ S₁.g = 0
hi : IsLimit (KernelFork.ofι i wi)
f' : (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0)).pt ⟶ (KernelFork.ofι i wi).pt :=
  IsLimit.lift hi (KernelFork.ofι S₁.f (_ : S₁.f ≫ S₁.g = 0))
hf' : f' ≫ i = S₁.f
hf'' : f' = φ.τ₁ ≫ CategoryTheory.ShortComplex.LeftHomologyData.f' h
wπ : f' ≫ h.π = 0
hπ : IsColimit (CokernelCofork.ofπ h.π wπ)
⊢ LeftHomologyData S₁
[PROOFSTEP]
exact ⟨h.K, h.H, i, h.π, wi, hi, wπ, hπ⟩
[GOAL]
C : Type u_1
inst✝⁴ : Category.{u_2, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
⊢ f' (ofEpiOfIsIsoOfMono' φ h) = φ.τ₁ ≫ f' h
[PROOFSTEP]
rw [← cancel_mono (ofEpiOfIsIsoOfMono' φ h).i, f'_i, ofEpiOfIsIsoOfMono'_i, assoc, f'_i_assoc, φ.comm₁₂_assoc,
  IsIso.hom_inv_id, comp_id]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.195682, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
⊢ IsIso (leftHomologyMap' φ h₁ h₂)
[PROOFSTEP]
let h₂' := LeftHomologyData.ofEpiOfIsIsoOfMono φ h₁
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.195682, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
h₂' : LeftHomologyData S₂ := LeftHomologyData.ofEpiOfIsIsoOfMono φ h₁
⊢ IsIso (leftHomologyMap' φ h₁ h₂)
[PROOFSTEP]
have : IsIso (leftHomologyMap' φ h₁ h₂') :=
  by
  rw [(LeftHomologyMapData.ofEpiOfIsIsoOfMono φ h₁).leftHomologyMap'_eq]
  dsimp
  infer_instance
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.195682, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
h₂' : LeftHomologyData S₂ := LeftHomologyData.ofEpiOfIsIsoOfMono φ h₁
⊢ IsIso (leftHomologyMap' φ h₁ h₂')
[PROOFSTEP]
rw [(LeftHomologyMapData.ofEpiOfIsIsoOfMono φ h₁).leftHomologyMap'_eq]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.195682, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
h₂' : LeftHomologyData S₂ := LeftHomologyData.ofEpiOfIsIsoOfMono φ h₁
⊢ IsIso (LeftHomologyMapData.ofEpiOfIsIsoOfMono φ h₁).φH
[PROOFSTEP]
dsimp
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.195682, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
h₂' : LeftHomologyData S₂ := LeftHomologyData.ofEpiOfIsIsoOfMono φ h₁
⊢ IsIso (𝟙 h₁.H)
[PROOFSTEP]
infer_instance
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.195682, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
h₂' : LeftHomologyData S₂ := LeftHomologyData.ofEpiOfIsIsoOfMono φ h₁
this : IsIso (leftHomologyMap' φ h₁ h₂')
⊢ IsIso (leftHomologyMap' φ h₁ h₂)
[PROOFSTEP]
have eq := leftHomologyMap'_comp φ (𝟙 S₂) h₁ h₂' h₂
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.195682, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
h₂' : LeftHomologyData S₂ := LeftHomologyData.ofEpiOfIsIsoOfMono φ h₁
this : IsIso (leftHomologyMap' φ h₁ h₂')
eq : leftHomologyMap' (φ ≫ 𝟙 S₂) h₁ h₂ = leftHomologyMap' φ h₁ h₂' ≫ leftHomologyMap' (𝟙 S₂) h₂' h₂
⊢ IsIso (leftHomologyMap' φ h₁ h₂)
[PROOFSTEP]
rw [comp_id] at eq 
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.195682, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
h₂' : LeftHomologyData S₂ := LeftHomologyData.ofEpiOfIsIsoOfMono φ h₁
this : IsIso (leftHomologyMap' φ h₁ h₂')
eq : leftHomologyMap' φ h₁ h₂ = leftHomologyMap' φ h₁ h₂' ≫ leftHomologyMap' (𝟙 S₂) h₂' h₂
⊢ IsIso (leftHomologyMap' φ h₁ h₂)
[PROOFSTEP]
rw [eq]
[GOAL]
C : Type u_1
inst✝⁴ : Category.{?u.195682, u_1} C
inst✝³ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
h₂' : LeftHomologyData S₂ := LeftHomologyData.ofEpiOfIsIsoOfMono φ h₁
this : IsIso (leftHomologyMap' φ h₁ h₂')
eq : leftHomologyMap' φ h₁ h₂ = leftHomologyMap' φ h₁ h₂' ≫ leftHomologyMap' (𝟙 S₂) h₂' h₂
⊢ IsIso (leftHomologyMap' φ h₁ h₂' ≫ leftHomologyMap' (𝟙 S₂) h₂' h₂)
[PROOFSTEP]
infer_instance
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.197546, u_1} C
inst✝⁵ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
inst✝⁴ : HasLeftHomology S₁
inst✝³ : HasLeftHomology S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
⊢ IsIso (leftHomologyMap φ)
[PROOFSTEP]
dsimp only [leftHomologyMap]
[GOAL]
C : Type u_1
inst✝⁶ : Category.{?u.197546, u_1} C
inst✝⁵ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
inst✝⁴ : HasLeftHomology S₁
inst✝³ : HasLeftHomology S₂
inst✝² : Epi φ.τ₁
inst✝¹ : IsIso φ.τ₂
inst✝ : Mono φ.τ₃
⊢ IsIso (leftHomologyMap' φ (leftHomologyData S₁) (leftHomologyData S₂))
[PROOFSTEP]
infer_instance
[GOAL]
C : Type u_1
inst✝² : Category.{?u.201841, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
k : A ⟶ S.X₂
hk : k ≫ S.g = 0
inst✝ : HasLeftHomology S
A' : C
α : A' ⟶ A
⊢ (α ≫ k) ≫ S.g = 0
[PROOFSTEP]
rw [assoc, hk, comp_zero]
[GOAL]
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
k : A ⟶ S.X₂
hk : k ≫ S.g = 0
inst✝ : HasLeftHomology S
A' : C
α : A' ⟶ A
⊢ α ≫ liftCycles S k hk = liftCycles S (α ≫ k) (_ : (α ≫ k) ≫ S.g = 0)
[PROOFSTEP]
aesop_cat
[GOAL]
C : Type u_1
inst✝³ : Category.{?u.205152, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
k : A ⟶ S.X₂
hk : k ≫ S.g = 0
inst✝¹ : HasLeftHomology S
inst✝ : HasKernel S.g
⊢ iCycles S ≫ S.g = 0
[PROOFSTEP]
simp
[GOAL]
C : Type u_1
inst✝³ : Category.{?u.205152, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
k : A ⟶ S.X₂
hk : k ≫ S.g = 0
inst✝¹ : HasLeftHomology S
inst✝ : HasKernel S.g
⊢ kernel.ι S.g ≫ S.g = 0
[PROOFSTEP]
simp
[GOAL]
C : Type u_1
inst✝² : Category.{?u.209151, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
k : A ⟶ S.X₂
hk : k ≫ S.g = 0
inst✝ : HasLeftHomology S
x : A ⟶ S.X₁
hx : k = x ≫ S.f
⊢ k ≫ S.g = 0
[PROOFSTEP]
rw [hx, assoc, S.zero, comp_zero]
[GOAL]
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
k : A ⟶ S.X₂
hk : k ≫ S.g = 0
inst✝ : HasLeftHomology S
⊢ S.f = 𝟙 S.X₁ ≫ S.f
[PROOFSTEP]
rw [id_comp]
[GOAL]
C : Type u_1
inst✝³ : Category.{?u.213429, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
k : A ⟶ S.X₂
hk : k ≫ S.g = 0
inst✝¹ : HasLeftHomology S
φ : S ⟶ S₁
inst✝ : HasLeftHomology S₁
⊢ (k ≫ φ.τ₂) ≫ S₁.g = 0
[PROOFSTEP]
rw [assoc, φ.comm₂₃, reassoc_of% hk, zero_comp]
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
k : A ⟶ S.X₂
hk : k ≫ S.g = 0
inst✝¹ : HasLeftHomology S
φ : S ⟶ S₁
inst✝ : HasLeftHomology S₁
⊢ liftCycles S k hk ≫ cyclesMap φ = liftCycles S₁ (k ≫ φ.τ₂) (_ : (k ≫ φ.τ₂) ≫ S₁.g = 0)
[PROOFSTEP]
aesop_cat
[GOAL]
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
k : A ⟶ S.X₂
hk : k ≫ S.g = 0
inst✝ : HasLeftHomology S
⊢ liftCycles S k hk ≫ (cyclesIso h).hom = liftK h k hk
[PROOFSTEP]
simp only [← cancel_mono h.i, assoc, LeftHomologyData.cyclesIso_hom_comp_i, liftCycles_i, LeftHomologyData.liftK_i]
[GOAL]
C : Type u_1
inst✝² : Category.{u_2, u_1} C
inst✝¹ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
h : LeftHomologyData S
A : C
k : A ⟶ S.X₂
hk : k ≫ S.g = 0
inst✝ : HasLeftHomology S
⊢ liftK h k hk ≫ (cyclesIso h).inv = liftCycles S k hk
[PROOFSTEP]
rw [← h.liftCycles_comp_cyclesIso_hom, assoc, Iso.hom_inv_id, comp_id]
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝¹ : HasLeftHomology S
inst✝ : HasKernel S.g
⊢ HasCokernel (kernel.lift S.g S.f (_ : S.f ≫ S.g = 0))
[PROOFSTEP]
let h := S.leftHomologyData
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝¹ : HasLeftHomology S
inst✝ : HasKernel S.g
h : LeftHomologyData S := leftHomologyData S
⊢ HasCokernel (kernel.lift S.g S.f (_ : S.f ≫ S.g = 0))
[PROOFSTEP]
haveI : HasColimit (parallelPair h.f' 0) := ⟨⟨⟨_, h.hπ'⟩⟩⟩
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝¹ : HasLeftHomology S
inst✝ : HasKernel S.g
h : LeftHomologyData S := leftHomologyData S
this : HasColimit (parallelPair (LeftHomologyData.f' h) 0)
⊢ HasCokernel (kernel.lift S.g S.f (_ : S.f ≫ S.g = 0))
[PROOFSTEP]
let e : parallelPair (kernel.lift S.g S.f S.zero) 0 ≅ parallelPair h.f' 0 :=
  parallelPair.ext (Iso.refl _) (IsLimit.conePointUniqueUpToIso (kernelIsKernel S.g) h.hi) (by aesop_cat) (by aesop_cat)
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝¹ : HasLeftHomology S
inst✝ : HasKernel S.g
h : LeftHomologyData S := leftHomologyData S
this : HasColimit (parallelPair (LeftHomologyData.f' h) 0)
⊢ (parallelPair (kernel.lift S.g S.f (_ : S.f ≫ S.g = 0)) 0).map WalkingParallelPairHom.left ≫
      (IsLimit.conePointUniqueUpToIso (kernelIsKernel S.g) h.hi).hom =
    (Iso.refl ((parallelPair (kernel.lift S.g S.f (_ : S.f ≫ S.g = 0)) 0).obj WalkingParallelPair.zero)).hom ≫
      (parallelPair (LeftHomologyData.f' h) 0).map WalkingParallelPairHom.left
[PROOFSTEP]
aesop_cat
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝¹ : HasLeftHomology S
inst✝ : HasKernel S.g
h : LeftHomologyData S := leftHomologyData S
this : HasColimit (parallelPair (LeftHomologyData.f' h) 0)
⊢ (parallelPair (kernel.lift S.g S.f (_ : S.f ≫ S.g = 0)) 0).map WalkingParallelPairHom.right ≫
      (IsLimit.conePointUniqueUpToIso (kernelIsKernel S.g) h.hi).hom =
    (Iso.refl ((parallelPair (kernel.lift S.g S.f (_ : S.f ≫ S.g = 0)) 0).obj WalkingParallelPair.zero)).hom ≫
      (parallelPair (LeftHomologyData.f' h) 0).map WalkingParallelPairHom.right
[PROOFSTEP]
aesop_cat
[GOAL]
C : Type u_1
inst✝³ : Category.{u_2, u_1} C
inst✝² : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
inst✝¹ : HasLeftHomology S
inst✝ : HasKernel S.g
h : LeftHomologyData S := leftHomologyData S
this : HasColimit (parallelPair (LeftHomologyData.f' h) 0)
e : parallelPair (kernel.lift S.g S.f (_ : S.f ≫ S.g = 0)) 0 ≅ parallelPair (LeftHomologyData.f' h) 0 :=
  parallelPair.ext (Iso.refl ((parallelPair (kernel.lift S.g S.f (_ : S.f ≫ S.g = 0)) 0).obj WalkingParallelPair.zero))
    (IsLimit.conePointUniqueUpToIso (kernelIsKernel S.g) h.hi)
    (_ :
      (parallelPair (kernel.lift S.g S.f (_ : S.f ≫ S.g = 0)) 0).map WalkingParallelPairHom.left ≫
          (IsLimit.conePointUniqueUpToIso (kernelIsKernel S.g) h.hi).hom =
        (Iso.refl ((parallelPair (kernel.lift S.g S.f (_ : S.f ≫ S.g = 0)) 0).obj WalkingParallelPair.zero)).hom ≫
          (parallelPair (LeftHomologyData.f' h) 0).map WalkingParallelPairHom.left)
    (_ : 0 ≫ (IsLimit.conePointUniqueUpToIso (kernelIsKernel S.g) (leftHomologyData S).hi).hom = 𝟙 S.X₁ ≫ 0)
⊢ HasCokernel (kernel.lift S.g S.f (_ : S.f ≫ S.g = 0))
[PROOFSTEP]
exact hasColimitOfIso e
[GOAL]
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₂✝ : IsIso φ.τ₂
h₃ : Mono φ.τ₃
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ IsIso (cyclesMap' φ h₁ h₂)
[PROOFSTEP]
refine' ⟨h₁.liftK (h₂.i ≫ inv φ.τ₂) _, _, _⟩
[GOAL]
case refine'_1
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₂✝ : IsIso φ.τ₂
h₃ : Mono φ.τ₃
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ (h₂.i ≫ inv φ.τ₂) ≫ S₁.g = 0
[PROOFSTEP]
simp only [assoc, ← cancel_mono φ.τ₃, zero_comp, ← φ.comm₂₃, IsIso.inv_hom_id_assoc, h₂.wi]
[GOAL]
case refine'_2
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₂✝ : IsIso φ.τ₂
h₃ : Mono φ.τ₃
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ cyclesMap' φ h₁ h₂ ≫ LeftHomologyData.liftK h₁ (h₂.i ≫ inv φ.τ₂) (_ : (h₂.i ≫ inv φ.τ₂) ≫ S₁.g = 0) = 𝟙 h₁.K
[PROOFSTEP]
simp only [← cancel_mono h₁.i, assoc, h₁.liftK_i, cyclesMap'_i_assoc, IsIso.hom_inv_id, comp_id, id_comp]
[GOAL]
case refine'_3
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : HasZeroMorphisms C
S S₁ S₂ S₃ : ShortComplex C
φ : S₁ ⟶ S₂
h₂✝ : IsIso φ.τ₂
h₃ : Mono φ.τ₃
h₁ : LeftHomologyData S₁
h₂ : LeftHomologyData S₂
⊢ LeftHomologyData.liftK h₁ (h₂.i ≫ inv φ.τ₂) (_ : (h₂.i ≫ inv φ.τ₂) ≫ S₁.g = 0) ≫ cyclesMap' φ h₁ h₂ = 𝟙 h₂.K
[PROOFSTEP]
simp only [← cancel_mono h₂.i, assoc, cyclesMap'_i, h₁.liftK_i_assoc, IsIso.inv_hom_id, comp_id, id_comp]
