Theorem: Acc.sym2_gameAdd
File: Mathlib/Order/GameAdd.lean

tactic: induction' ha with a _ iha generalizing b
state_before: α : Type u_1
β : Type ?u.6233
rα : α → α → Prop
rβ : β → β → Prop
a b : α
ha : Acc rα a
hb : Acc rα b
⊢ Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (a, b))

tactic: induction' hb with b hb ihb
state_before: case intro
α : Type u_1
β : Type ?u.6233
rα : α → α → Prop
rβ : β → β → Prop
a✝ b✝ : α
hb✝ : Acc rα b✝
a : α
h✝ : ∀ (y : α), rα y a → Acc rα y
iha : ∀ (y : α), rα y a → ∀ {b : α}, Acc rα b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (y, b))
b : α
hb : Acc rα b
⊢ Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (a, b))

tactic: refine' Acc.intro _ fun s => _
state_before: case intro.intro
α : Type u_1
β : Type ?u.6233
rα : α → α → Prop
rβ : β → β → Prop
a✝ b✝¹ : α
hb✝ : Acc rα b✝¹
a : α
h✝ : ∀ (y : α), rα y a → Acc rα y
iha : ∀ (y : α), rα y a → ∀ {b : α}, Acc rα b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (y, b))
b✝ b : α
hb : ∀ (y : α), rα y b → Acc rα y
ihb : ∀ (y : α), rα y b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (a, y))
⊢ Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (a, b))

tactic: induction' s using Sym2.inductionOn with c d
state_before: case intro.intro
α : Type u_1
β : Type ?u.6233
rα : α → α → Prop
rβ : β → β → Prop
a✝ b✝¹ : α
hb✝ : Acc rα b✝¹
a : α
h✝ : ∀ (y : α), rα y a → Acc rα y
iha : ∀ (y : α), rα y a → ∀ {b : α}, Acc rα b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (y, b))
b✝ b : α
hb : ∀ (y : α), rα y b → Acc rα y
ihb : ∀ (y : α), rα y b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (a, y))
s : Sym2 α
⊢ Sym2.GameAdd rα s (Quotient.mk (Sym2.Rel.setoid α) (a, b)) → Acc (Sym2.GameAdd rα) s

tactic: rw [Sym2.GameAdd]
state_before: case intro.intro.hf
α : Type u_1
β : Type ?u.6233
rα : α → α → Prop
rβ : β → β → Prop
a✝ b✝¹ : α
hb✝ : Acc rα b✝¹
a : α
h✝ : ∀ (y : α), rα y a → Acc rα y
iha : ∀ (y : α), rα y a → ∀ {b : α}, Acc rα b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (y, b))
b✝ b : α
hb : ∀ (y : α), rα y b → Acc rα y
ihb : ∀ (y : α), rα y b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (a, y))
c d : α
⊢ Sym2.GameAdd rα (Quotient.mk (Sym2.Rel.setoid α) (c, d)) (Quotient.mk (Sym2.Rel.setoid α) (a, b)) →
    Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (c, d))

tactic: dsimp
state_before: case intro.intro.hf
α : Type u_1
β : Type ?u.6233
rα : α → α → Prop
rβ : β → β → Prop
a✝ b✝¹ : α
hb✝ : Acc rα b✝¹
a : α
h✝ : ∀ (y : α), rα y a → Acc rα y
iha : ∀ (y : α), rα y a → ∀ {b : α}, Acc rα b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (y, b))
b✝ b : α
hb : ∀ (y : α), rα y b → Acc rα y
ihb : ∀ (y : α), rα y b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (a, y))
c d : α
⊢ ↑Sym2.lift₂
      { 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₂) }
      (Quotient.mk (Sym2.Rel.setoid α) (c, d)) (Quotient.mk (Sym2.Rel.setoid α) (a, b)) →
    Acc
      (↑Sym2.lift₂
        { 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₂) })
      (Quotient.mk (Sym2.Rel.setoid α) (c, d))

tactic: rintro ((rc | rd) | (rd | rc))
state_before: case intro.intro.hf
α : Type u_1
β : Type ?u.6233
rα : α → α → Prop
rβ : β → β → Prop
a✝ b✝¹ : α
hb✝ : Acc rα b✝¹
a : α
h✝ : ∀ (y : α), rα y a → Acc rα y
iha : ∀ (y : α), rα y a → ∀ {b : α}, Acc rα b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (y, b))
b✝ b : α
hb : ∀ (y : α), rα y b → Acc rα y
ihb : ∀ (y : α), rα y b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (a, y))
c d : α
⊢ Prod.GameAdd rα rα (c, d) (a, b) ∨ Prod.GameAdd rα rα (d, c) (a, b) →
    Acc
      (↑Sym2.lift₂
        { 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₂) })
      (Quotient.mk (Sym2.Rel.setoid α) (c, d))

tactic: exact iha c rc ⟨b, hb⟩
state_before: case intro.intro.hf.inl.fst
α : Type u_1
β : Type ?u.6233
rα : α → α → Prop
rβ : β → β → Prop
a✝ b✝¹ : α
hb✝ : Acc rα b✝¹
a : α
h✝ : ∀ (y : α), rα y a → Acc rα y
iha : ∀ (y : α), rα y a → ∀ {b : α}, Acc rα b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (y, b))
b✝ b : α
hb : ∀ (y : α), rα y b → Acc rα y
ihb : ∀ (y : α), rα y b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (a, y))
c : α
rc : rα c a
⊢ Acc
    (↑Sym2.lift₂
      { 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₂) })
    (Quotient.mk (Sym2.Rel.setoid α) (c, b))

tactic: exact ihb d rd
state_before: case intro.intro.hf.inl.snd
α : Type u_1
β : Type ?u.6233
rα : α → α → Prop
rβ : β → β → Prop
a✝ b✝¹ : α
hb✝ : Acc rα b✝¹
a : α
h✝ : ∀ (y : α), rα y a → Acc rα y
iha : ∀ (y : α), rα y a → ∀ {b : α}, Acc rα b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (y, b))
b✝ b : α
hb : ∀ (y : α), rα y b → Acc rα y
ihb : ∀ (y : α), rα y b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (a, y))
d : α
rd : rα d b
⊢ Acc
    (↑Sym2.lift₂
      { 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₂) })
    (Quotient.mk (Sym2.Rel.setoid α) (a, d))

tactic: rw [Sym2.eq_swap]
state_before: case intro.intro.hf.inr.fst
α : Type u_1
β : Type ?u.6233
rα : α → α → Prop
rβ : β → β → Prop
a✝ b✝¹ : α
hb✝ : Acc rα b✝¹
a : α
h✝ : ∀ (y : α), rα y a → Acc rα y
iha : ∀ (y : α), rα y a → ∀ {b : α}, Acc rα b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (y, b))
b✝ b : α
hb : ∀ (y : α), rα y b → Acc rα y
ihb : ∀ (y : α), rα y b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (a, y))
d : α
rd : rα d a
⊢ Acc
    (↑Sym2.lift₂
      { 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₂) })
    (Quotient.mk (Sym2.Rel.setoid α) (b, d))

tactic: exact iha d rd ⟨b, hb⟩
state_before: case intro.intro.hf.inr.fst
α : Type u_1
β : Type ?u.6233
rα : α → α → Prop
rβ : β → β → Prop
a✝ b✝¹ : α
hb✝ : Acc rα b✝¹
a : α
h✝ : ∀ (y : α), rα y a → Acc rα y
iha : ∀ (y : α), rα y a → ∀ {b : α}, Acc rα b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (y, b))
b✝ b : α
hb : ∀ (y : α), rα y b → Acc rα y
ihb : ∀ (y : α), rα y b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (a, y))
d : α
rd : rα d a
⊢ Acc
    (↑Sym2.lift₂
      { 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₂) })
    (Quotient.mk (Sym2.Rel.setoid α) (d, b))

tactic: rw [Sym2.eq_swap]
state_before: case intro.intro.hf.inr.snd
α : Type u_1
β : Type ?u.6233
rα : α → α → Prop
rβ : β → β → Prop
a✝ b✝¹ : α
hb✝ : Acc rα b✝¹
a : α
h✝ : ∀ (y : α), rα y a → Acc rα y
iha : ∀ (y : α), rα y a → ∀ {b : α}, Acc rα b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (y, b))
b✝ b : α
hb : ∀ (y : α), rα y b → Acc rα y
ihb : ∀ (y : α), rα y b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (a, y))
c : α
rc : rα c b
⊢ Acc
    (↑Sym2.lift₂
      { 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₂) })
    (Quotient.mk (Sym2.Rel.setoid α) (c, a))

tactic: exact ihb c rc
state_before: case intro.intro.hf.inr.snd
α : Type u_1
β : Type ?u.6233
rα : α → α → Prop
rβ : β → β → Prop
a✝ b✝¹ : α
hb✝ : Acc rα b✝¹
a : α
h✝ : ∀ (y : α), rα y a → Acc rα y
iha : ∀ (y : α), rα y a → ∀ {b : α}, Acc rα b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (y, b))
b✝ b : α
hb : ∀ (y : α), rα y b → Acc rα y
ihb : ∀ (y : α), rα y b → Acc (Sym2.GameAdd rα) (Quotient.mk (Sym2.Rel.setoid α) (a, y))
c : α
rc : rα c b
⊢ Acc
    (↑Sym2.lift₂
      { 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₂) })
    (Quotient.mk (Sym2.Rel.setoid α) (a, c))