Theorem: AddCommGrp.binaryProductLimitCone_isLimit_lift
File: Mathlib/Algebra/Category/Grp/Biproducts.lean

Proof steps:
state_before: G H : AddCommGrp
⊢ ∀ ⦃X Y : Discrete WalkingPair⦄ (f : X ⟶ Y),
    ((Functor.const (Discrete WalkingPair)).obj (of (↑G × ↑H))).map f ≫
        (fun j => Discrete.casesOn j fun j => WalkingPair.casesOn j (AddMonoidHom.fst ↑G ↑H) (AddMonoidHom.snd ↑G ↑H))
          Y =
      (fun j => Discrete.casesOn j fun j => WalkingPair.casesOn j (AddMonoidHom.fst ↑G ↑H) (AddMonoidHom.snd ↑G ↑H)) X ≫
        (pair G H).map f
state_after: no goals
tactic: rintro ⟨⟨⟩⟩ ⟨⟨⟩⟩ ⟨⟨⟨⟩⟩⟩ <;> rfl
state_before: G H : AddCommGrp
⊢ ∀ (s : Cone (pair G H)) (j : Discrete WalkingPair),
    (fun s => AddMonoidHom.prod (s.π.app { as := WalkingPair.left }) (s.π.app { as := WalkingPair.right })) s ≫
        { pt := of (↑G × ↑H),
                π :=
                  {
                    app := fun j =>
                      Discrete.casesOn j fun j =>
                        WalkingPair.casesOn j (AddMonoidHom.fst ↑G ↑H) (AddMonoidHom.snd ↑G ↑H),
                    naturality := ⋯ } }.π.app
          j =
      s.π.app j
state_after: no goals
tactic: rintro s (⟨⟩ | ⟨⟩) <;> rfl
state_before: G H : AddCommGrp
s : Cone (pair G H)
m :
  s.pt ⟶
    { pt := of (↑G × ↑H),
        π :=
          {
            app := fun j =>
              Discrete.casesOn j fun j => WalkingPair.casesOn j (AddMonoidHom.fst ↑G ↑H) (AddMonoidHom.snd ↑G ↑H),
            naturality := ⋯ } }.pt
w :
  ∀ (j : Discrete WalkingPair),
    m ≫
        { pt := of (↑G × ↑H),
                π :=
                  {
                    app := fun j =>
                      Discrete.casesOn j fun j =>
                        WalkingPair.casesOn j (AddMonoidHom.fst ↑G ↑H) (AddMonoidHom.snd ↑G ↑H),
                    naturality := ⋯ } }.π.app
          j =
      s.π.app j
⊢ m = (fun s => AddMonoidHom.prod (s.π.app { as := WalkingPair.left }) (s.π.app { as := WalkingPair.right })) s
state_after: G H : AddCommGrp
s : Cone (pair G H)
m :
  s.pt ⟶
    { pt := of (↑G × ↑H),
        π :=
          {
            app := fun j =>
              Discrete.casesOn j fun j => WalkingPair.casesOn j (AddMonoidHom.fst ↑G ↑H) (AddMonoidHom.snd ↑G ↑H),
            naturality := ⋯ } }.pt
w :
  ∀ (j : Discrete WalkingPair),
    m ≫
        { pt := of (↑G × ↑H),
                π :=
                  {
                    app := fun j =>
                      Discrete.casesOn j fun j =>
                        WalkingPair.casesOn j (AddMonoidHom.fst ↑G ↑H) (AddMonoidHom.snd ↑G ↑H),
                    naturality := ⋯ } }.π.app
          j =
      s.π.app j
⊢ m = AddMonoidHom.prod (m ≫ AddMonoidHom.fst ↑G ↑H) (m ≫ AddMonoidHom.snd ↑G ↑H)
tactic: simp_rw [← w ⟨WalkingPair.left⟩, ← w ⟨WalkingPair.right⟩]
state_before: G H : AddCommGrp
s : Cone (pair G H)
m :
  s.pt ⟶
    { pt := of (↑G × ↑H),
        π :=
          {
            app := fun j =>
              Discrete.casesOn j fun j => WalkingPair.casesOn j (AddMonoidHom.fst ↑G ↑H) (AddMonoidHom.snd ↑G ↑H),
            naturality := ⋯ } }.pt
w :
  ∀ (j : Discrete WalkingPair),
    m ≫
        { pt := of (↑G × ↑H),
                π :=
                  {
                    app := fun j =>
                      Discrete.casesOn j fun j =>
                        WalkingPair.casesOn j (AddMonoidHom.fst ↑G ↑H) (AddMonoidHom.snd ↑G ↑H),
                    naturality := ⋯ } }.π.app
          j =
      s.π.app j
⊢ m = AddMonoidHom.prod (m ≫ AddMonoidHom.fst ↑G ↑H) (m ≫ AddMonoidHom.snd ↑G ↑H)
state_after: no goals
tactic: rfl