V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h✝ : Exact f₁ g₁
h : ∃ w, Nonempty (homology f₁ g₁ w ≅ 0)
⊢ ∃ w, Nonempty (homology f₂ g₂ w ≅ 0)
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
⊢ Exact f₂ g₂
rw [Preadditive.exact_iff_homology_zero] at h ⊢
case intro.intro
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
⊢ ∃ w, Nonempty (homology f₂ g₂ w ≅ 0)
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h✝ : Exact f₁ g₁
h : ∃ w, Nonempty (homology f₁ g₁ w ≅ 0)
⊢ ∃ w, Nonempty (homology f₂ g₂ w ≅ 0)
rcases h with ⟨w₁, ⟨i⟩⟩
case intro.intro
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
w₂ : f₂ ≫ g₂ = 0
⊢ ∃ w, Nonempty (homology f₂ g₂ w ≅ 0)

case w₂
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
⊢ f₂ ≫ g₂ = 0
case intro.intro
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
⊢ ∃ w, Nonempty (homology f₂ g₂ w ≅ 0)
suffices w₂ : f₂ ≫ g₂ = 0
case w₂
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
⊢ f₂ ≫ g₂ = 0
case intro.intro
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
w₂ : f₂ ≫ g₂ = 0
⊢ ∃ w, Nonempty (homology f₂ g₂ w ≅ 0)

case w₂
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
⊢ f₂ ≫ g₂ = 0
exact ⟨w₂, ⟨(homology.mapIso w₁ w₂ α β p).symm.trans i⟩⟩
case w₂
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
⊢ (α.hom.left ≫ f₂ ≫ g₂) ≫ β.inv.right = f₁ ≫ g₁
case w₂
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
⊢ f₂ ≫ g₂ = 0
rw [← cancel_epi α.hom.left, ← cancel_mono β.inv.right, comp_zero, zero_comp, ← w₁]
case w₂
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
eq₁ : (𝟭 V).map β.inv.left ≫ (Arrow.mk g₁).hom = (Arrow.mk g₂).hom ≫ (𝟭 V).map β.inv.right
⊢ (α.hom.left ≫ f₂ ≫ g₂) ≫ β.inv.right = f₁ ≫ g₁
case w₂
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
⊢ (α.hom.left ≫ f₂ ≫ g₂) ≫ β.inv.right = f₁ ≫ g₁
have eq₁ := β.inv.w
case w₂
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
eq₁ : (𝟭 V).map β.inv.left ≫ (Arrow.mk g₁).hom = (Arrow.mk g₂).hom ≫ (𝟭 V).map β.inv.right
eq₂ : (𝟭 V).map α.hom.left ≫ (Arrow.mk f₂).hom = (Arrow.mk f₁).hom ≫ (𝟭 V).map α.hom.right
⊢ (α.hom.left ≫ f₂ ≫ g₂) ≫ β.inv.right = f₁ ≫ g₁
case w₂
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
eq₁ : (𝟭 V).map β.inv.left ≫ (Arrow.mk g₁).hom = (Arrow.mk g₂).hom ≫ (𝟭 V).map β.inv.right
⊢ (α.hom.left ≫ f₂ ≫ g₂) ≫ β.inv.right = f₁ ≫ g₁
have eq₂ := α.hom.w
case w₂
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
eq₁ : β.inv.left ≫ g₁ = g₂ ≫ β.inv.right
eq₂ : α.hom.left ≫ f₂ = f₁ ≫ α.hom.right
⊢ (α.hom.left ≫ f₂ ≫ g₂) ≫ β.inv.right = f₁ ≫ g₁
case w₂
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
eq₁ : (𝟭 V).map β.inv.left ≫ (Arrow.mk g₁).hom = (Arrow.mk g₂).hom ≫ (𝟭 V).map β.inv.right
eq₂ : (𝟭 V).map α.hom.left ≫ (Arrow.mk f₂).hom = (Arrow.mk f₁).hom ≫ (𝟭 V).map α.hom.right
⊢ (α.hom.left ≫ f₂ ≫ g₂) ≫ β.inv.right = f₁ ≫ g₁
dsimp at eq₁ eq₂
no goals
case w₂
V : Type u
inst✝⁵ : Category V
inst✝⁴ : HasImages V
inst✝³ : HasZeroObject V
inst✝² : Preadditive V
inst✝¹ : HasKernels V
inst✝ : HasCokernels V
A₁ B₁ C₁ A₂ B₂ C₂ : V
f₁ : A₁ ⟶ B₁
g₁ : B₁ ⟶ C₁
f₂ : A₂ ⟶ B₂
g₂ : B₂ ⟶ C₂
α : Arrow.mk f₁ ≅ Arrow.mk f₂
β : Arrow.mk g₁ ≅ Arrow.mk g₂
p : α.hom.right = β.hom.left
h : Exact f₁ g₁
w₁ : f₁ ≫ g₁ = 0
i : homology f₁ g₁ w₁ ≅ 0
eq₁ : β.inv.left ≫ g₁ = g₂ ≫ β.inv.right
eq₂ : α.hom.left ≫ f₂ = f₁ ≫ α.hom.right
⊢ (α.hom.left ≫ f₂ ≫ g₂) ≫ β.inv.right = f₁ ≫ g₁
simp only [Category.assoc, Category.assoc, ← eq₁, reassoc_of% eq₂, p,
  ← reassoc_of% (Arrow.comp_left β.hom β.inv), β.hom_inv_id, Arrow.id_left, Category.id_comp]