Theorem: homology'.map_eq_lift_desc'_left
File: Mathlib/CategoryTheory/Abelian/Homology.lean

tactic: simp only [kernel.lift_ι_assoc, ← h]
state_before: A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0
state_after: A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ f ≫ α.right ≫ cokernel.π f' = 0

tactic: erw [← reassoc_of% α.w]
state_before: A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ f ≫ α.right ≫ cokernel.π f' = 0
state_after: A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ α.left ≫ (Arrow.mk f').hom ≫ cokernel.π f' = 0

tactic: simp
state_before: A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ α.left ≫ (Arrow.mk f').hom ≫ cokernel.π f' = 0
state_after: no goals

tactic: ext
state_before: A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f') ⋯ ≫ cokernel.desc f' g' w' = 0
state_after: case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ π' f g w ≫ desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f') ⋯ ≫ cokernel.desc f' g' w' = π' f g w ≫ 0

tactic: simp
state_before: case h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ π' f g w ≫ desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f') ⋯ ≫ cokernel.desc f' g' w' = π' f g w ≫ 0
state_after: no goals

tactic: rw [map_eq_desc'_lift_left]
state_before: A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ map w w' α β h = lift f' g' w' (desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f') ⋯) ⋯
state_after: A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ desc' f g w (lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f') ⋯) ⋯ =
    lift f' g' w' (desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f') ⋯) ⋯

tactic: ext
state_before: A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ desc' f g w (lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f') ⋯) ⋯ =
    lift f' g' w' (desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f') ⋯) ⋯
state_after: case h.h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ (π' f g w ≫ desc' f g w (lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f') ⋯) ⋯) ≫ ι f' g' w' =
    (π' f g w ≫ lift f' g' w' (desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f') ⋯) ⋯) ≫ ι f' g' w'

tactic: simp
state_before: case h.h
A : Type u
inst✝¹ : Category.{v, u} A
inst✝ : Abelian A
X Y Z : A
f : X ⟶ Y
g : Y ⟶ Z
w : f ≫ g = 0
X' Y' Z' : A
f' : X' ⟶ Y'
g' : Y' ⟶ Z'
w' : f' ≫ g' = 0
α : Arrow.mk f ⟶ Arrow.mk f'
β : Arrow.mk g ⟶ Arrow.mk g'
h : α.right = β.left
⊢ (π' f g w ≫ desc' f g w (lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f') ⋯) ⋯) ≫ ι f' g' w' =
    (π' f g w ≫ lift f' g' w' (desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f') ⋯) ⋯) ≫ ι f' g' w'
state_after: no goals