Theorem: SetTheory.PGame.P3_of_lt_of_lt
File: Mathlib/SetTheory/Surreal/Multiplication.lean

Proof steps:
state_before: x x₁ x₂ y y₁ y₂ : PGame
hx✝ : x.Numeric
hx₁ : x₁.Numeric
hx₂ : x₂.Numeric
hy✝ : y.Numeric
hy₁ : y₁.Numeric
hy₂ : y₂.Numeric
hx : x₁ < x₂
hy : y₁ < y₂
⊢ P3 x₁ x₂ y₁ y₂
state_after: x y y₁ y₂ : PGame
hx : x.Numeric
hy✝ : y.Numeric
hy₁ : y₁.Numeric
hy₂ : y₂.Numeric
hy : y₁ < y₂
⊢ ∀ {x₁ x₂ : PGame}, x₁.Numeric → x₂.Numeric → x₁ < x₂ → P3 x₁ x₂ y₁ y₂
tactic: revert x₁ x₂
state_before: x y y₁ y₂ : PGame
hx : x.Numeric
hy✝ : y.Numeric
hy₁ : y₁.Numeric
hy₂ : y₂.Numeric
hy : y₁ < y₂
⊢ ∀ {x₁ x₂ : PGame}, x₁.Numeric → x₂.Numeric → x₁ < x₂ → P3 x₁ x₂ y₁ y₂
state_after: x y y₁ y₂ : PGame
hx : x.Numeric
hy✝ : y.Numeric
hy₁ : y₁.Numeric
hy₂ : y₂.Numeric
hy : y₁ < y₂
⊢ ∀ (x : PGame × PGame), x.1.Numeric → x.2.Numeric → x.1 < x.2 → P3 x.1 x.2 y₁ y₂
tactic: rw [← Prod.forall']
state_before: x y y₁ y₂ : PGame
hx : x.Numeric
hy✝ : y.Numeric
hy₁ : y₁.Numeric
hy₂ : y₂.Numeric
hy : y₁ < y₂
⊢ ∀ (x : PGame × PGame), x.1.Numeric → x.2.Numeric → x.1 < x.2 → P3 x.1 x.2 y₁ y₂
state_after: x y y₁ y₂ : PGame
hx : x.Numeric
hy✝ : y.Numeric
hy₁ : y₁.Numeric
hy₂ : y₂.Numeric
hy : y₁ < y₂
⊢ ∀ (x : PGame × PGame),
    (∀ (y : PGame × PGame),
        Prod.GameAdd IsOption IsOption y x → y.1.Numeric → y.2.Numeric → y.1 < y.2 → P3 y.1 y.2 y₁ y₂) →
      x.1.Numeric → x.2.Numeric → x.1 < x.2 → P3 x.1 x.2 y₁ y₂
tactic: refine (wf_isOption.prod_gameAdd wf_isOption).fix ?_
state_before: x y y₁ y₂ : PGame
hx : x.Numeric
hy✝ : y.Numeric
hy₁ : y₁.Numeric
hy₂ : y₂.Numeric
hy : y₁ < y₂
⊢ ∀ (x : PGame × PGame),
    (∀ (y : PGame × PGame),
        Prod.GameAdd IsOption IsOption y x → y.1.Numeric → y.2.Numeric → y.1 < y.2 → P3 y.1 y.2 y₁ y₂) →
      x.1.Numeric → x.2.Numeric → x.1 < x.2 → P3 x.1 x.2 y₁ y₂
state_after: case mk
x y y₁ y₂ : PGame
hx✝ : x.Numeric
hy✝ : y.Numeric
hy₁ : y₁.Numeric
hy₂ : y₂.Numeric
hy : y₁ < y₂
x₁ x₂ : PGame
ih :
  ∀ (y : PGame × PGame),
    Prod.GameAdd IsOption IsOption y (x₁, x₂) → y.1.Numeric → y.2.Numeric → y.1 < y.2 → P3 y.1 y.2 y₁ y₂
hx₁ : (x₁, x₂).1.Numeric
hx₂ : (x₁, x₂).2.Numeric
hx : (x₁, x₂).1 < (x₁, x₂).2
⊢ P3 (x₁, x₂).1 (x₁, x₂).2 y₁ y₂
tactic: rintro ⟨x₁, x₂⟩ ih hx₁ hx₂ hx
state_before: case mk
x y y₁ y₂ : PGame
hx✝ : x.Numeric
hy✝ : y.Numeric
hy₁ : y₁.Numeric
hy₂ : y₂.Numeric
hy : y₁ < y₂
x₁ x₂ : PGame
ih :
  ∀ (y : PGame × PGame),
    Prod.GameAdd IsOption IsOption y (x₁, x₂) → y.1.Numeric → y.2.Numeric → y.1 < y.2 → P3 y.1 y.2 y₁ y₂
hx₁ : (x₁, x₂).1.Numeric
hx₂ : (x₁, x₂).2.Numeric
hx : (x₁, x₂).1 < (x₁, x₂).2
⊢ P3 (x₁, x₂).1 (x₁, x₂).2 y₁ y₂
state_after: case mk.refine_1
x y y₁ y₂ : PGame
hx✝ : x.Numeric
hy✝ : y.Numeric
hy₁ : y₁.Numeric
hy₂ : y₂.Numeric
hy : y₁ < y₂
x₁ x₂ : PGame
ih :
  ∀ (y : PGame × PGame),
    Prod.GameAdd IsOption IsOption y (x₁, x₂) → y.1.Numeric → y.2.Numeric → y.1 < y.2 → P3 y.1 y.2 y₁ y₂
hx₁ : (x₁, x₂).1.Numeric
hx₂ : (x₁, x₂).2.Numeric
hx : (x₁, x₂).1 < (x₁, x₂).2
i : (x₁, x₂).2.LeftMoves
⊢ IH3 (x₁, x₂).1 ((x₁, x₂).2.moveLeft i) (x₁, x₂).2 y₁ y₂

case mk.refine_2
x y y₁ y₂ : PGame
hx✝ : x.Numeric
hy✝ : y.Numeric
hy₁ : y₁.Numeric
hy₂ : y₂.Numeric
hy : y₁ < y₂
x₁ x₂ : PGame
ih :
  ∀ (y : PGame × PGame),
    Prod.GameAdd IsOption IsOption y (x₁, x₂) → y.1.Numeric → y.2.Numeric → y.1 < y.2 → P3 y.1 y.2 y₁ y₂
hx₁ : (x₁, x₂).1.Numeric
hx₂ : (x₁, x₂).2.Numeric
hx : (x₁, x₂).1 < (x₁, x₂).2
i : (-(x₁, x₂).1).LeftMoves
⊢ IH3 (-(x₁, x₂).2) ((-(x₁, x₂).1).moveLeft i) (-(x₁, x₂).1) y₁ y₂
tactic: refine P3_of_lt ?_ ?_ hx <;> intro i