Theorem: homology'.π'_map
File: Mathlib/CategoryTheory/Abelian/Homology.lean

tactic: simp [h, β.w.symm]
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
⊢ g ≫ β.right = α.right ≫ g'
state_after: no goals

tactic: apply_fun fun e => (kernelSubobjectIso _).hom ≫ e
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 g w ≫ map w w' α β h = kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'
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
⊢ (fun e => (kernelSubobjectIso g).hom ≫ e) (π' f g w ≫ map w w' α β h) =
    (fun e => (kernelSubobjectIso g).hom ≫ e) (kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w')

case inj
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
⊢ Function.Injective fun e => (kernelSubobjectIso g).hom ≫ e

tactic: swap
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
⊢ (fun e => (kernelSubobjectIso g).hom ≫ e) (π' f g w ≫ map w w' α β h) =
    (fun e => (kernelSubobjectIso g).hom ≫ e) (kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w')

case inj
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
⊢ Function.Injective fun e => (kernelSubobjectIso g).hom ≫ e
state_after: case inj
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
⊢ Function.Injective fun e => (kernelSubobjectIso g).hom ≫ e

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
⊢ (fun e => (kernelSubobjectIso g).hom ≫ e) (π' f g w ≫ map w w' α β h) =
    (fun e => (kernelSubobjectIso g).hom ≫ e) (kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w')

tactic: dsimp [map]
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
⊢ (fun e => (kernelSubobjectIso g).hom ≫ e) (π' f g w ≫ map w w' α β h) =
    (fun e => (kernelSubobjectIso g).hom ≫ e) (kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w')
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
⊢ (kernelSubobjectIso g).hom ≫
      π' f g w ≫ cokernel.desc (imageToKernel f g w) (kernelSubobjectMap β ≫ cokernel.π (imageToKernel f' g' w')) ⋯ =
    (kernelSubobjectIso g).hom ≫ kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'

tactic: simp only [π'_eq_π_assoc]
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
⊢ (kernelSubobjectIso g).hom ≫
      π' f g w ≫ cokernel.desc (imageToKernel f g w) (kernelSubobjectMap β ≫ cokernel.π (imageToKernel f' g' w')) ⋯ =
    (kernelSubobjectIso g).hom ≫ kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'
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 g w ≫ cokernel.desc (imageToKernel f g w) (kernelSubobjectMap β ≫ cokernel.π (imageToKernel f' g' w')) ⋯ =
    (kernelSubobjectIso g).hom ≫ kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'

tactic: dsimp [π]
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 g w ≫ cokernel.desc (imageToKernel f g w) (kernelSubobjectMap β ≫ cokernel.π (imageToKernel f' g' w')) ⋯ =
    (kernelSubobjectIso g).hom ≫ kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'
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
⊢ cokernel.π (imageToKernel f g w) ≫
      cokernel.desc (imageToKernel f g w) (kernelSubobjectMap β ≫ cokernel.π (imageToKernel f' g' w')) ⋯ =
    (kernelSubobjectIso g).hom ≫ kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'

tactic: simp only [cokernel.π_desc]
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
⊢ cokernel.π (imageToKernel f g w) ≫
      cokernel.desc (imageToKernel f g w) (kernelSubobjectMap β ≫ cokernel.π (imageToKernel f' g' w')) ⋯ =
    (kernelSubobjectIso g).hom ≫ kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'
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
⊢ kernelSubobjectMap β ≫ cokernel.π (imageToKernel f' g' w') =
    (kernelSubobjectIso g).hom ≫ kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'

tactic: rw [← Iso.inv_comp_eq, ← Category.assoc]
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
⊢ kernelSubobjectMap β ≫ cokernel.π (imageToKernel f' g' w') =
    (kernelSubobjectIso g).hom ≫ kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'
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
⊢ ((kernelSubobjectIso g).inv ≫ kernelSubobjectMap β) ≫ cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'

tactic: have :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map _ _ β.left β.right β.w.symm ≫ (kernelSubobjectIso _).inv := by
  rw [Iso.inv_comp_eq, ← Category.assoc, Iso.eq_comp_inv]
  ext
  dsimp
  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
⊢ ((kernelSubobjectIso g).inv ≫ kernelSubobjectMap β) ≫ cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ ((kernelSubobjectIso g).inv ≫ kernelSubobjectMap β) ≫ cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'

tactic: rw [this]
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ ((kernelSubobjectIso g).inv ≫ kernelSubobjectMap β) ≫ cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ (kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv) ≫
      cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'

tactic: simp only [Category.assoc]
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ (kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv) ≫
      cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫
      (kernelSubobjectIso (Arrow.mk g').hom).inv ≫ cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'

tactic: dsimp [π', homology'IsoCokernelLift]
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫
      (kernelSubobjectIso (Arrow.mk g').hom).inv ≫ cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right ⋯ ≫ π' f' g' w'
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ kernel.map g g' β.left β.right ⋯ ≫ (kernelSubobjectIso g').inv ≫ cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right ⋯ ≫
      cokernel.π (kernel.lift g' f' w') ≫
        ((cokernelIsoOfEq ⋯).inv ≫
            cokernel.desc (factorThruImage f' ≫ imageToKernel' f' g' w') (cokernel.π (imageToKernel' f' g' w')) ⋯) ≫
          (homology'IsoCokernelImageToKernel' f' g' w').inv

tactic: simp only [cokernelIsoOfEq_inv_comp_desc, cokernel.π_desc_assoc]
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ kernel.map g g' β.left β.right ⋯ ≫ (kernelSubobjectIso g').inv ≫ cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right ⋯ ≫
      cokernel.π (kernel.lift g' f' w') ≫
        ((cokernelIsoOfEq ⋯).inv ≫
            cokernel.desc (factorThruImage f' ≫ imageToKernel' f' g' w') (cokernel.π (imageToKernel' f' g' w')) ⋯) ≫
          (homology'IsoCokernelImageToKernel' f' g' w').inv
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ kernel.map g g' β.left β.right ⋯ ≫ (kernelSubobjectIso g').inv ≫ cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right ⋯ ≫
      cokernel.π (imageToKernel' f' g' w') ≫ (homology'IsoCokernelImageToKernel' f' g' w').inv

tactic: congr 1
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ kernel.map g g' β.left β.right ⋯ ≫ (kernelSubobjectIso g').inv ≫ cokernel.π (imageToKernel f' g' w') =
    kernel.map g g' α.right β.right ⋯ ≫
      cokernel.π (imageToKernel' f' g' w') ≫ (homology'IsoCokernelImageToKernel' f' g' w').inv
state_after: case e_a
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ kernel.map g g' β.left β.right ⋯ = kernel.map g g' α.right β.right ⋯

case e_a
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ (kernelSubobjectIso g').inv ≫ cokernel.π (imageToKernel f' g' w') =
    cokernel.π (imageToKernel' f' g' w') ≫ (homology'IsoCokernelImageToKernel' f' g' w').inv

tactic: intro i j hh
state_before: case inj
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
⊢ Function.Injective fun e => (kernelSubobjectIso g).hom ≫ e
state_after: case inj
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
i j : kernel g ⟶ homology' f' g' w'
hh : (fun e => (kernelSubobjectIso g).hom ≫ e) i = (fun e => (kernelSubobjectIso g).hom ≫ e) j
⊢ i = j

tactic: apply_fun fun e => (kernelSubobjectIso _).inv ≫ e at hh
state_before: case inj
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
i j : kernel g ⟶ homology' f' g' w'
hh : (fun e => (kernelSubobjectIso g).hom ≫ e) i = (fun e => (kernelSubobjectIso g).hom ≫ e) j
⊢ i = j
state_after: case inj
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
i j : kernel g ⟶ homology' f' g' w'
hh :
  (kernelSubobjectIso g).inv ≫ (fun e => (kernelSubobjectIso g).hom ≫ e) i =
    (kernelSubobjectIso g).inv ≫ (fun e => (kernelSubobjectIso g).hom ≫ e) j
⊢ i = j

tactic: simpa using hh
state_before: case inj
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
i j : kernel g ⟶ homology' f' g' w'
hh :
  (kernelSubobjectIso g).inv ≫ (fun e => (kernelSubobjectIso g).hom ≫ e) i =
    (kernelSubobjectIso g).inv ≫ (fun e => (kernelSubobjectIso g).hom ≫ e) j
⊢ i = j
state_after: no goals

tactic: rw [Iso.inv_comp_eq, ← Category.assoc, Iso.eq_comp_inv]
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
⊢ (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
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
⊢ kernelSubobjectMap β ≫ (kernelSubobjectIso (Arrow.mk g').hom).hom =
    (kernelSubobjectIso g).hom ≫ kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯

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
⊢ kernelSubobjectMap β ≫ (kernelSubobjectIso (Arrow.mk g').hom).hom =
    (kernelSubobjectIso g).hom ≫ kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯
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
⊢ (kernelSubobjectMap β ≫ (kernelSubobjectIso (Arrow.mk g').hom).hom) ≫ equalizer.ι (Arrow.mk g').hom 0 =
    ((kernelSubobjectIso g).hom ≫ kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯) ≫
      equalizer.ι (Arrow.mk g').hom 0

tactic: dsimp
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
⊢ (kernelSubobjectMap β ≫ (kernelSubobjectIso (Arrow.mk g').hom).hom) ≫ equalizer.ι (Arrow.mk g').hom 0 =
    ((kernelSubobjectIso g).hom ≫ kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯) ≫
      equalizer.ι (Arrow.mk g').hom 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
⊢ (kernelSubobjectMap β ≫ (kernelSubobjectIso g').hom) ≫ kernel.ι g' =
    ((kernelSubobjectIso g).hom ≫ kernel.map g g' β.left β.right ⋯) ≫ kernel.ι g'

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
⊢ (kernelSubobjectMap β ≫ (kernelSubobjectIso g').hom) ≫ kernel.ι g' =
    ((kernelSubobjectIso g).hom ≫ kernel.map g g' β.left β.right ⋯) ≫ kernel.ι g'
state_after: no goals

tactic: congr
state_before: case e_a
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ kernel.map g g' β.left β.right ⋯ = kernel.map g g' α.right β.right ⋯
state_after: case e_a.e_p
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ β.left = α.right

tactic: exact h.symm
state_before: case e_a.e_p
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ β.left = α.right
state_after: no goals

tactic: rw [Iso.inv_comp_eq, ← Category.assoc, Iso.eq_comp_inv]
state_before: case e_a
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ (kernelSubobjectIso g').inv ≫ cokernel.π (imageToKernel f' g' w') =
    cokernel.π (imageToKernel' f' g' w') ≫ (homology'IsoCokernelImageToKernel' f' g' w').inv
state_after: case e_a
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ cokernel.π (imageToKernel f' g' w') ≫ (homology'IsoCokernelImageToKernel' f' g' w').hom =
    (kernelSubobjectIso g').hom ≫ cokernel.π (imageToKernel' f' g' w')

tactic: dsimp [homology'IsoCokernelImageToKernel']
state_before: case e_a
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ cokernel.π (imageToKernel f' g' w') ≫ (homology'IsoCokernelImageToKernel' f' g' w').hom =
    (kernelSubobjectIso g').hom ≫ cokernel.π (imageToKernel' f' g' w')
state_after: case e_a
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ cokernel.π (imageToKernel f' g' w') ≫
      cokernel.map (imageToKernel f' g' w') (imageToKernel' f' g' w') (imageSubobjectIso f').hom
        (kernelSubobjectIso g').hom ⋯ =
    (kernelSubobjectIso g').hom ≫ cokernel.π (imageToKernel' f' g' w')

tactic: simp
state_before: case e_a
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
this :
  (kernelSubobjectIso g).inv ≫ kernelSubobjectMap β =
    kernel.map (Arrow.mk g).hom (Arrow.mk g').hom β.left β.right ⋯ ≫ (kernelSubobjectIso (Arrow.mk g').hom).inv
⊢ cokernel.π (imageToKernel f' g' w') ≫
      cokernel.map (imageToKernel f' g' w') (imageToKernel' f' g' w') (imageSubobjectIso f').hom
        (kernelSubobjectIso g').hom ⋯ =
    (kernelSubobjectIso g').hom ≫ cokernel.π (imageToKernel' f' g' w')
state_after: no goals