Theorem: CategoryTheory.IsKernelPair.cancel_right
File: Mathlib/CategoryTheory/Limits/Shapes/KernelPair.lean

tactic: let s' : PullbackCone (f₁ ≫ f₂) (f₁ ≫ f₂) :=
  PullbackCone.mk s.fst s.snd (s.condition_assoc _)
state_before: C : Type u
inst✝ : Category.{v, u} C
R X Y Z : C
f : X ⟶ Y
a b : R ⟶ X
f₁ : X ⟶ Y
f₂ : Y ⟶ Z
comm : a ≫ f₁ = b ≫ f₁
big_k : IsKernelPair (f₁ ≫ f₂) a b
s : PullbackCone f₁ f₁
⊢ { l //
    l ≫ (PullbackCone.mk a b ⋯).fst = s.fst ∧
      l ≫ (PullbackCone.mk a b ⋯).snd = s.snd ∧
        ∀ {m : s.pt ⟶ (PullbackCone.mk a b ⋯).pt},
          m ≫ (PullbackCone.mk a b ⋯).fst = s.fst → m ≫ (PullbackCone.mk a b ⋯).snd = s.snd → m = l }
state_after: C : Type u
inst✝ : Category.{v, u} C
R X Y Z : C
f : X ⟶ Y
a b : R ⟶ X
f₁ : X ⟶ Y
f₂ : Y ⟶ Z
comm : a ≫ f₁ = b ≫ f₁
big_k : IsKernelPair (f₁ ≫ f₂) a b
s : PullbackCone f₁ f₁
s' : PullbackCone (f₁ ≫ f₂) (f₁ ≫ f₂) := PullbackCone.mk s.fst s.snd ⋯
⊢ { l //
    l ≫ (PullbackCone.mk a b ⋯).fst = s.fst ∧
      l ≫ (PullbackCone.mk a b ⋯).snd = s.snd ∧
        ∀ {m : s.pt ⟶ (PullbackCone.mk a b ⋯).pt},
          m ≫ (PullbackCone.mk a b ⋯).fst = s.fst → m ≫ (PullbackCone.mk a b ⋯).snd = s.snd → m = l }

tactic: refine ⟨big_k.isLimit.lift s', big_k.isLimit.fac _ WalkingCospan.left,
  big_k.isLimit.fac _ WalkingCospan.right, fun m₁ m₂ => ?_⟩
state_before: C : Type u
inst✝ : Category.{v, u} C
R X Y Z : C
f : X ⟶ Y
a b : R ⟶ X
f₁ : X ⟶ Y
f₂ : Y ⟶ Z
comm : a ≫ f₁ = b ≫ f₁
big_k : IsKernelPair (f₁ ≫ f₂) a b
s : PullbackCone f₁ f₁
s' : PullbackCone (f₁ ≫ f₂) (f₁ ≫ f₂) := PullbackCone.mk s.fst s.snd ⋯
⊢ { l //
    l ≫ (PullbackCone.mk a b ⋯).fst = s.fst ∧
      l ≫ (PullbackCone.mk a b ⋯).snd = s.snd ∧
        ∀ {m : s.pt ⟶ (PullbackCone.mk a b ⋯).pt},
          m ≫ (PullbackCone.mk a b ⋯).fst = s.fst → m ≫ (PullbackCone.mk a b ⋯).snd = s.snd → m = l }
state_after: C : Type u
inst✝ : Category.{v, u} C
R X Y Z : C
f : X ⟶ Y
a b : R ⟶ X
f₁ : X ⟶ Y
f₂ : Y ⟶ Z
comm : a ≫ f₁ = b ≫ f₁
big_k : IsKernelPair (f₁ ≫ f₂) a b
s : PullbackCone f₁ f₁
s' : PullbackCone (f₁ ≫ f₂) (f₁ ≫ f₂) := PullbackCone.mk s.fst s.snd ⋯
m✝ : s.pt ⟶ (PullbackCone.mk a b ⋯).pt
m₁ : m✝ ≫ (PullbackCone.mk a b ⋯).fst = s.fst
m₂ : m✝ ≫ (PullbackCone.mk a b ⋯).snd = s.snd
⊢ m✝ = (IsPullback.isLimit big_k).lift s'

tactic: apply big_k.isLimit.hom_ext
state_before: C : Type u
inst✝ : Category.{v, u} C
R X Y Z : C
f : X ⟶ Y
a b : R ⟶ X
f₁ : X ⟶ Y
f₂ : Y ⟶ Z
comm : a ≫ f₁ = b ≫ f₁
big_k : IsKernelPair (f₁ ≫ f₂) a b
s : PullbackCone f₁ f₁
s' : PullbackCone (f₁ ≫ f₂) (f₁ ≫ f₂) := PullbackCone.mk s.fst s.snd ⋯
m✝ : s.pt ⟶ (PullbackCone.mk a b ⋯).pt
m₁ : m✝ ≫ (PullbackCone.mk a b ⋯).fst = s.fst
m₂ : m✝ ≫ (PullbackCone.mk a b ⋯).snd = s.snd
⊢ m✝ = (IsPullback.isLimit big_k).lift s'
state_after: C : Type u
inst✝ : Category.{v, u} C
R X Y Z : C
f : X ⟶ Y
a b : R ⟶ X
f₁ : X ⟶ Y
f₂ : Y ⟶ Z
comm : a ≫ f₁ = b ≫ f₁
big_k : IsKernelPair (f₁ ≫ f₂) a b
s : PullbackCone f₁ f₁
s' : PullbackCone (f₁ ≫ f₂) (f₁ ≫ f₂) := PullbackCone.mk s.fst s.snd ⋯
m✝ : s.pt ⟶ (PullbackCone.mk a b ⋯).pt
m₁ : m✝ ≫ (PullbackCone.mk a b ⋯).fst = s.fst
m₂ : m✝ ≫ (PullbackCone.mk a b ⋯).snd = s.snd
⊢ ∀ (j : WalkingCospan),
    m✝ ≫ (IsPullback.cone big_k).π.app j = (IsPullback.isLimit big_k).lift s' ≫ (IsPullback.cone big_k).π.app j

tactic: refine (PullbackCone.mk a b ?_ : PullbackCone (f₁ ≫ f₂) _).equalizer_ext ?_ ?_
state_before: C : Type u
inst✝ : Category.{v, u} C
R X Y Z : C
f : X ⟶ Y
a b : R ⟶ X
f₁ : X ⟶ Y
f₂ : Y ⟶ Z
comm : a ≫ f₁ = b ≫ f₁
big_k : IsKernelPair (f₁ ≫ f₂) a b
s : PullbackCone f₁ f₁
s' : PullbackCone (f₁ ≫ f₂) (f₁ ≫ f₂) := PullbackCone.mk s.fst s.snd ⋯
m✝ : s.pt ⟶ (PullbackCone.mk a b ⋯).pt
m₁ : m✝ ≫ (PullbackCone.mk a b ⋯).fst = s.fst
m₂ : m✝ ≫ (PullbackCone.mk a b ⋯).snd = s.snd
⊢ ∀ (j : WalkingCospan),
    m✝ ≫ (IsPullback.cone big_k).π.app j = (IsPullback.isLimit big_k).lift s' ≫ (IsPullback.cone big_k).π.app j
state_after: case refine_1
C : Type u
inst✝ : Category.{v, u} C
R X Y Z : C
f : X ⟶ Y
a b : R ⟶ X
f₁ : X ⟶ Y
f₂ : Y ⟶ Z
comm : a ≫ f₁ = b ≫ f₁
big_k : IsKernelPair (f₁ ≫ f₂) a b
s : PullbackCone f₁ f₁
s' : PullbackCone (f₁ ≫ f₂) (f₁ ≫ f₂) := PullbackCone.mk s.fst s.snd ⋯
m✝ : s.pt ⟶ (PullbackCone.mk a b ⋯).pt
m₁ : m✝ ≫ (PullbackCone.mk a b ⋯).fst = s.fst
m₂ : m✝ ≫ (PullbackCone.mk a b ⋯).snd = s.snd
⊢ a ≫ f₁ ≫ f₂ = b ≫ f₁ ≫ f₂

case refine_2
C : Type u
inst✝ : Category.{v, u} C
R X Y Z : C
f : X ⟶ Y
a b : R ⟶ X
f₁ : X ⟶ Y
f₂ : Y ⟶ Z
comm : a ≫ f₁ = b ≫ f₁
big_k : IsKernelPair (f₁ ≫ f₂) a b
s : PullbackCone f₁ f₁
s' : PullbackCone (f₁ ≫ f₂) (f₁ ≫ f₂) := PullbackCone.mk s.fst s.snd ⋯
m✝ : s.pt ⟶ (PullbackCone.mk a b ⋯).pt
m₁ : m✝ ≫ (PullbackCone.mk a b ⋯).fst = s.fst
m₂ : m✝ ≫ (PullbackCone.mk a b ⋯).snd = s.snd
⊢ m✝ ≫ (PullbackCone.mk a b ?refine_1).fst = (IsPullback.isLimit big_k).lift s' ≫ (PullbackCone.mk a b ?refine_1).fst

case refine_3
C : Type u
inst✝ : Category.{v, u} C
R X Y Z : C
f : X ⟶ Y
a b : R ⟶ X
f₁ : X ⟶ Y
f₂ : Y ⟶ Z
comm : a ≫ f₁ = b ≫ f₁
big_k : IsKernelPair (f₁ ≫ f₂) a b
s : PullbackCone f₁ f₁
s' : PullbackCone (f₁ ≫ f₂) (f₁ ≫ f₂) := PullbackCone.mk s.fst s.snd ⋯
m✝ : s.pt ⟶ (PullbackCone.mk a b ⋯).pt
m₁ : m✝ ≫ (PullbackCone.mk a b ⋯).fst = s.fst
m₂ : m✝ ≫ (PullbackCone.mk a b ⋯).snd = s.snd
⊢ m✝ ≫ (PullbackCone.mk a b ?refine_1).snd = (IsPullback.isLimit big_k).lift s' ≫ (PullbackCone.mk a b ?refine_1).snd

tactic: apply reassoc_of% comm
state_before: case refine_1
C : Type u
inst✝ : Category.{v, u} C
R X Y Z : C
f : X ⟶ Y
a b : R ⟶ X
f₁ : X ⟶ Y
f₂ : Y ⟶ Z
comm : a ≫ f₁ = b ≫ f₁
big_k : IsKernelPair (f₁ ≫ f₂) a b
s : PullbackCone f₁ f₁
s' : PullbackCone (f₁ ≫ f₂) (f₁ ≫ f₂) := PullbackCone.mk s.fst s.snd ⋯
m✝ : s.pt ⟶ (PullbackCone.mk a b ⋯).pt
m₁ : m✝ ≫ (PullbackCone.mk a b ⋯).fst = s.fst
m₂ : m✝ ≫ (PullbackCone.mk a b ⋯).snd = s.snd
⊢ a ≫ f₁ ≫ f₂ = b ≫ f₁ ≫ f₂
state_after: no goals

tactic: apply m₁.trans (big_k.isLimit.fac s' WalkingCospan.left).symm
state_before: case refine_2
C : Type u
inst✝ : Category.{v, u} C
R X Y Z : C
f : X ⟶ Y
a b : R ⟶ X
f₁ : X ⟶ Y
f₂ : Y ⟶ Z
comm : a ≫ f₁ = b ≫ f₁
big_k : IsKernelPair (f₁ ≫ f₂) a b
s : PullbackCone f₁ f₁
s' : PullbackCone (f₁ ≫ f₂) (f₁ ≫ f₂) := PullbackCone.mk s.fst s.snd ⋯
m✝ : s.pt ⟶ (PullbackCone.mk a b ⋯).pt
m₁ : m✝ ≫ (PullbackCone.mk a b ⋯).fst = s.fst
m₂ : m✝ ≫ (PullbackCone.mk a b ⋯).snd = s.snd
⊢ m✝ ≫ (PullbackCone.mk a b ⋯).fst = (IsPullback.isLimit big_k).lift s' ≫ (PullbackCone.mk a b ⋯).fst
state_after: no goals

tactic: apply m₂.trans (big_k.isLimit.fac s' WalkingCospan.right).symm
state_before: case refine_3
C : Type u
inst✝ : Category.{v, u} C
R X Y Z : C
f : X ⟶ Y
a b : R ⟶ X
f₁ : X ⟶ Y
f₂ : Y ⟶ Z
comm : a ≫ f₁ = b ≫ f₁
big_k : IsKernelPair (f₁ ≫ f₂) a b
s : PullbackCone f₁ f₁
s' : PullbackCone (f₁ ≫ f₂) (f₁ ≫ f₂) := PullbackCone.mk s.fst s.snd ⋯
m✝ : s.pt ⟶ (PullbackCone.mk a b ⋯).pt
m₁ : m✝ ≫ (PullbackCone.mk a b ⋯).fst = s.fst
m₂ : m✝ ≫ (PullbackCone.mk a b ⋯).snd = s.snd
⊢ m✝ ≫ (PullbackCone.mk a b ⋯).snd = (IsPullback.isLimit big_k).lift s' ≫ (PullbackCone.mk a b ⋯).snd
state_after: no goals