/-- Recursion on the well-founded `Sym2.GameAdd` relation. -/
def GameAdd.fix {C : α → α → Sort*} (hr : WellFounded rα)
    (IH : ∀ a₁ b₁, (∀ a₂ b₂, Sym2.GameAdd rα ⟦(a₂, b₂)⟧ ⟦(a₁, b₁)⟧ → C a₂ b₂) → C a₁ b₁) (a b : α) :
    C a b := by
  -- Porting note: this was refactored for #3414 (reenableeta), and could perhaps be cleaned up.
  have := hr.sym2_gameAdd
  dsimp only [GameAdd, lift₂, FunLike.coe, EquivLike.coe] at this
  

Proof state:
α : Type u_1
β : Type u_2
rα : α → α → Prop
rβ : β → β → Prop
C : α → α → Sort u_3
hr : WellFounded rα
IH : (a₁ b₁ : α) → ((a₂ b₂ : α) → GameAdd rα ⟦(a₂, b₂)⟧ ⟦(a₁, b₁)⟧ → C a₂ b₂) → C a₁ b₁
a b : α
this :
  WellFounded
    (Quotient.lift₂ (fun a b => Prod.GameAdd rα rα (a.1, a.2) (b.1, b.2) ∨ Prod.GameAdd rα rα (a.2, a.1) (b.1, b.2))
      (_ :
        ∀ (a₁ b₁ a₂ b₂ : α × α),
          a₁ ≈ a₂ →
            b₁ ≈ b₂ →
              (fun a b =>
                    ↑{
                          val := fun a₁ b₁ a₂ b₂ =>
                            Prod.GameAdd rα rα (a₁, b₁) (a₂, b₂) ∨ Prod.GameAdd rα rα (b₁, a₁) (a₂, b₂),
                          property :=
                            (_ :
                              ∀ (a₁ b₁ a₂ b₂ : α),
                                (fun a₁ b₁ a₂ b₂ =>
                                        Prod.GameAdd rα rα (a₁, b₁) (a₂, b₂) ∨ Prod.GameAdd rα rα (b₁, a₁) (a₂, b₂))
                                      a₁ b₁ a₂ b₂ =
                                    (fun a₁ b₁ a₂ b₂ =>
                                        Prod.GameAdd rα rα (a₁, b₁) (a₂, b₂) ∨ Prod.GameAdd rα rα (b₁, a₁) (a₂, b₂))
                                      b₁ a₁ a₂ b₂ ∧
                                  (fun a₁ b₁ a₂ b₂ =>
                                        Prod.GameAdd rα rα (a₁, b₁) (a₂, b₂) ∨ Prod.GameAdd rα rα (b₁, a₁) (a₂, b₂))
                                      a₁ b₁ a₂ b₂ =
                                    (fun a₁ b₁ a₂ b₂ =>
                                        Prod.GameAdd rα rα (a₁, b₁) (a₂, b₂) ∨ Prod.GameAdd rα rα (b₁, a₁) (a₂, b₂))
                                      a₁ b₁ b₂ a₂) }
                      a.1 a.2 b.1 b.2)
                  a₁ b₁ =
                (fun a b =>
                    ↑{
                          val := fun a₁ b₁ a₂ b₂ =>
                            Prod.GameAdd rα rα (a₁, b₁) (a₂, b₂) ∨ Prod.GameAdd rα rα (b₁, a₁) (a₂, b₂),
                          property :=
                            (_ :
                              ∀ (a₁ b₁ a₂ b₂ : α),
                                (fun a₁ b₁ a₂ b₂ =>
                                        Prod.GameAdd rα rα (a₁, b₁) (a₂, b₂) ∨ Prod.GameAdd rα rα (b₁, a₁) (a₂, b₂))
                                      a₁ b₁ a₂ b₂ =
                                    (fun a₁ b₁ a₂ b₂ =>
                                        Prod.GameAdd rα rα (a₁, b₁) (a₂, b₂) ∨ Prod.GameAdd rα rα (b₁, a₁) (a₂, b₂))
                                      b₁ a₁ a₂ b₂ ∧
                                  (fun a₁ b₁ a₂ b₂ =>
                                        Prod.GameAdd rα rα (a₁, b₁) (a₂, b₂) ∨ Prod.GameAdd rα rα (b₁, a₁) (a₂, b₂))
                                      a₁ b₁ a₂ b₂ =
                                    (fun a₁ b₁ a₂ b₂ =>
                                        Prod.GameAdd rα rα (a₁, b₁) (a₂, b₂) ∨ Prod.GameAdd rα rα (b₁, a₁) (a₂, b₂))
                                      a₁ b₁ b₂ a₂) }
                      a.1 a.2 b.1 b.2)
                  a₂ b₂))
⊢ C a b

Next tactic:
exact @WellFounded.fix (α × α) (fun x => C x.1 x.2) _ this.of_quotient_lift₂
    (fun ⟨x₁, x₂⟩ IH' => IH x₁ x₂ fun a' b' => IH' ⟨a', b'⟩) (a, b)