l3lab/ntp-mathlib huggingface dataset:
theorem map_eq_desc'_lift_left (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
      (by simp)) (by
          ext
          simp only [← h, Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
          

Proof state:
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 ≫ α.right ≫ cokernel.π f' = 0

Next tactic:
erw [← reassoc_of% α.w]
theorem map_eq_desc'_lift_left (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
      (by simp)) (by
          ext
          simp only [← h, Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
          erw [← reassoc_of% α.w]
          

Proof state:
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
⊢ α.left ≫ (Arrow.mk f').hom ≫ cokernel.π f' = 0

Next tactic:
simp
theorem map_eq_desc'_lift_left (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
      (by simp)) (by
          ext
          simp only [← h, Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
          erw [← reassoc_of% α.w]
          simp) := by
  

Proof state:
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 =
    desc' f g w
      (lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
      (_ :
        kernel.lift g f w ≫
            lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
              (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
          0)

Next tactic:
apply homology'.hom_from_ext
theorem map_eq_desc'_lift_left (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
      (by simp)) (by
          ext
          simp only [← h, Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
          erw [← reassoc_of% α.w]
          simp) := by
  apply homology'.hom_from_ext
  

Proof state:
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 ≫ map w w' α β h =
    π' f g w ≫
      desc' f g w
        (lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
          (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
        (_ :
          kernel.lift g f w ≫
              lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
                (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
            0)

Next tactic:
simp only [π'_map, π'_desc']
theorem map_eq_desc'_lift_left (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
      (by simp)) (by
          ext
          simp only [← h, Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
          erw [← reassoc_of% α.w]
          simp) := by
  apply homology'.hom_from_ext
  simp only [π'_map, π'_desc']
  

Proof state:
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
⊢ kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫ π' f' g' w' =
    lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
      (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0)

Next tactic:
dsimp [π', lift]
theorem map_eq_desc'_lift_left (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
      (by simp)) (by
          ext
          simp only [← h, Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
          erw [← reassoc_of% α.w]
          simp) := by
  apply homology'.hom_from_ext
  simp only [π'_map, π'_desc']
  dsimp [π', lift]
  

Proof state:
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
⊢ kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫
      cokernel.π (kernel.lift g' f' w') ≫ (homology'IsoCokernelLift f' g' w').inv =
    kernel.lift (cokernel.desc f' g' w') (kernel.ι g ≫ β.left ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) ≫
      (homology'IsoKernelDesc f' g' w').inv

Next tactic:
rw [Iso.eq_comp_inv]
theorem map_eq_desc'_lift_left (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
      (by simp)) (by
          ext
          simp only [← h, Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
          erw [← reassoc_of% α.w]
          simp) := by
  apply homology'.hom_from_ext
  simp only [π'_map, π'_desc']
  dsimp [π', lift]
  rw [Iso.eq_comp_inv]
  

Proof state:
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
⊢ (kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫
        cokernel.π (kernel.lift g' f' w') ≫ (homology'IsoCokernelLift f' g' w').inv) ≫
      (homology'IsoKernelDesc f' g' w').hom =
    kernel.lift (cokernel.desc f' g' w') (kernel.ι g ≫ β.left ≫ cokernel.π f')
      (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0)

Next tactic:
dsimp [homology'IsoKernelDesc]
theorem map_eq_desc'_lift_left (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
      (by simp)) (by
          ext
          simp only [← h, Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
          erw [← reassoc_of% α.w]
          simp) := by
  apply homology'.hom_from_ext
  simp only [π'_map, π'_desc']
  dsimp [π', lift]
  rw [Iso.eq_comp_inv]
  dsimp [homology'IsoKernelDesc]
  

Proof state:
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
⊢ (kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫
        cokernel.π (kernel.lift g' f' w') ≫ (homology'IsoCokernelLift f' g' w').inv) ≫
      (homology'IsoCokernelLift f' g' w').hom ≫ Abelian.homologyCToK f' g' w' =
    kernel.lift (cokernel.desc f' g' w') (kernel.ι g ≫ β.left ≫ cokernel.π f')
      (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0)

Next tactic:
ext
theorem map_eq_desc'_lift_left (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
      (by simp)) (by
          ext
          simp only [← h, Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
          erw [← reassoc_of% α.w]
          simp) := by
  apply homology'.hom_from_ext
  simp only [π'_map, π'_desc']
  dsimp [π', lift]
  rw [Iso.eq_comp_inv]
  dsimp [homology'IsoKernelDesc]
  ext
  

Proof state:
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
⊢ ((kernel.map g g' α.right β.right (_ : g ≫ β.right = α.right ≫ g') ≫
          cokernel.π (kernel.lift g' f' w') ≫ (homology'IsoCokernelLift f' g' w').inv) ≫
        (homology'IsoCokernelLift f' g' w').hom ≫ Abelian.homologyCToK f' g' w') ≫
      equalizer.ι (cokernel.desc f' g' w') 0 =
    kernel.lift (cokernel.desc f' g' w') (kernel.ι g ≫ β.left ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) ≫
      equalizer.ι (cokernel.desc f' g' w') 0

Next tactic:
simp [h]
theorem map_eq_lift_desc'_left (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
          (by
            

Proof state:
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

Next tactic:
simp only [kernel.lift_ι_assoc, ← h]
theorem map_eq_lift_desc'_left (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc, ← h]
            

Proof state:
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

Next tactic:
erw [← reassoc_of% α.w]
theorem map_eq_lift_desc'_left (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc, ← h]
            erw [← reassoc_of% α.w]
            

Proof state:
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

Next tactic:
simp
theorem map_eq_lift_desc'_left (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc, ← h]
            erw [← reassoc_of% α.w]
            simp))
        (by
          -- Porting note: used to be ext
          

Proof state:
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') (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0) ≫
      cokernel.desc f' g' w' =
    0

Next tactic:
apply homology'.hom_from_ext
theorem map_eq_lift_desc'_left (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc, ← h]
            erw [← reassoc_of% α.w]
            simp))
        (by
          -- Porting note: used to be ext
          apply homology'.hom_from_ext
          

Proof state:
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')
          (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0) ≫
        cokernel.desc f' g' w' =
    π' f g w ≫ 0

Next tactic:
simp
theorem map_eq_lift_desc'_left (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc, ← h]
            erw [← reassoc_of% α.w]
            simp))
        (by
          -- Porting note: used to be ext
          apply homology'.hom_from_ext
          simp) := by
  

Proof state:
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')
        (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0))
      (_ :
        desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
              (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0) ≫
            cokernel.desc f' g' w' =
          0)

Next tactic:
rw [map_eq_desc'_lift_left]
theorem map_eq_lift_desc'_left (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc, ← h]
            erw [← reassoc_of% α.w]
            simp))
        (by
          -- Porting note: used to be ext
          apply homology'.hom_from_ext
          simp) := by
  rw [map_eq_desc'_lift_left]
  -- Porting note: once was known as ext
  

Proof state:
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')
        (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
      (_ :
        kernel.lift g f w ≫
            lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
              (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
          0) =
    lift f' g' w'
      (desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
        (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0))
      (_ :
        desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
              (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0) ≫
            cokernel.desc f' g' w' =
          0)

Next tactic:
apply homology'.hom_to_ext
theorem map_eq_lift_desc'_left (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc, ← h]
            erw [← reassoc_of% α.w]
            simp))
        (by
          -- Porting note: used to be ext
          apply homology'.hom_from_ext
          simp) := by
  rw [map_eq_desc'_lift_left]
  -- Porting note: once was known as ext
  apply homology'.hom_to_ext
  

Proof state:
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
⊢ desc' f g w
        (lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
          (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
        (_ :
          kernel.lift g f w ≫
              lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
                (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
            0) ≫
      ι f' g' w' =
    lift f' g' w'
        (desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
          (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0))
        (_ :
          desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
                (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0) ≫
              cokernel.desc f' g' w' =
            0) ≫
      ι f' g' w'

Next tactic:
apply homology'.hom_from_ext
theorem map_eq_lift_desc'_left (α β h) :
    map w w' α β h =
      homology'.lift f' g' _
        (homology'.desc' f g _ (kernel.ι _ ≫ β.left ≫ cokernel.π _)
          (by
            simp only [kernel.lift_ι_assoc, ← h]
            erw [← reassoc_of% α.w]
            simp))
        (by
          -- Porting note: used to be ext
          apply homology'.hom_from_ext
          simp) := by
  rw [map_eq_desc'_lift_left]
  -- Porting note: once was known as ext
  apply homology'.hom_to_ext
  apply homology'.hom_from_ext
  

Proof state:
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')
            (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
          (_ :
            kernel.lift g f w ≫
                lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
                  (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
              0) ≫
        ι f' g' w' =
    π' f g w ≫
      lift f' g' w'
          (desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
            (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0))
          (_ :
            desc' f g w (kernel.ι g ≫ β.left ≫ cokernel.π f')
                  (_ : kernel.lift g f w ≫ kernel.ι g ≫ β.left ≫ cokernel.π f' = 0) ≫
                cokernel.desc f' g' w' =
              0) ≫
        ι f' g' w'

Next tactic:
simp
theorem map_eq_desc'_lift_right (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
        (by 

Proof state:
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.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0

Next tactic:
simp [h]
theorem map_eq_desc'_lift_right (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
        (by simp [h]))
        (by
          

Proof state:
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 ≫
      lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
    0

Next tactic:
ext
theorem map_eq_desc'_lift_right (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
        (by simp [h]))
        (by
          ext
          

Proof state:
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
⊢ (kernel.lift g f w ≫
        lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
          (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0)) ≫
      ι f' g' w' =
    0 ≫ ι f' g' w'

Next tactic:
simp only [Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
theorem map_eq_desc'_lift_right (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
        (by simp [h]))
        (by
          ext
          simp only [Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
          

Proof state:
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 ≫ α.right ≫ cokernel.π f' = 0

Next tactic:
erw [← reassoc_of% α.w]
theorem map_eq_desc'_lift_right (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
        (by simp [h]))
        (by
          ext
          simp only [Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
          erw [← reassoc_of% α.w]
          

Proof state:
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
⊢ α.left ≫ (Arrow.mk f').hom ≫ cokernel.π f' = 0

Next tactic:
simp
theorem map_eq_desc'_lift_right (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
        (by simp [h]))
        (by
          ext
          simp only [Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
          erw [← reassoc_of% α.w]
          simp) := by
  

Proof state:
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 =
    desc' f g w
      (lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
      (_ :
        kernel.lift g f w ≫
            lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
              (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
          0)

Next tactic:
rw [map_eq_desc'_lift_left]
theorem map_eq_desc'_lift_right (α β h) :
    map w w' α β h =
      homology'.desc' f g _ (homology'.lift f' g' _ (kernel.ι _ ≫ α.right ≫ cokernel.π _)
        (by simp [h]))
        (by
          ext
          simp only [Category.assoc, zero_comp, lift_ι, kernel.lift_ι_assoc]
          erw [← reassoc_of% α.w]
          simp) := by
  rw [map_eq_desc'_lift_left]
  

Proof state:
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')
        (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
      (_ :
        kernel.lift g f w ≫
            lift f' g' w' (kernel.ι g ≫ β.left ≫ cokernel.π f')
              (_ : (kernel.ι g ≫ β.left ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
          0) =
    desc' f g w
      (lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
        (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0))
      (_ :
        kernel.lift g f w ≫
            lift f' g' w' (kernel.ι g ≫ α.right ≫ cokernel.π f')
              (_ : (kernel.ι g ≫ α.right ≫ cokernel.π f') ≫ cokernel.desc f' g' w' = 0) =
          0)

Next tactic:
ext