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

tactic: revert x₁ x₂
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: 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₁ 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: 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), 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: rintro ⟨x₁, x₂⟩ ih hx₁ hx₂ hx
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: refine P3_of_lt ?_ ?_ hx <;> intro i
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: have hi := hx₂.moveLeft i
state_before: 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₂
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
hi : ((x₁, x₂).2.moveLeft i).Numeric
⊢ IH3 (x₁, x₂).1 ((x₁, x₂).2.moveLeft i) (x₁, x₂).2 y₁ y₂

tactic: exact ⟨(P24 hx₁ hi hy₁).1, (P24 hx₁ hi hy₂).1,
  P3_comm.2 <| ((P24 hy₁ hy₂ hx₂).2 hy).1 _,
  ih _ (snd <| IsOption.moveLeft i) hx₁ hi⟩
state_before: 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
hi : ((x₁, x₂).2.moveLeft i).Numeric
⊢ IH3 (x₁, x₂).1 ((x₁, x₂).2.moveLeft i) (x₁, x₂).2 y₁ y₂
state_after: no goals

tactic: have hi := hx₁.neg.moveLeft i
state_before: 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₂
state_after: 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
hi : ((-(x₁, x₂).1).moveLeft i).Numeric
⊢ IH3 (-(x₁, x₂).2) ((-(x₁, x₂).1).moveLeft i) (-(x₁, x₂).1) y₁ y₂

tactic: exact ⟨(P24 hx₂.neg hi hy₁).1, (P24 hx₂.neg hi hy₂).1,
  P3_comm.2 <| ((P24 hy₁ hy₂ hx₁).2 hy).2 _, by
    rw [moveLeft_neg', ← P3_neg, neg_lt_neg_iff]
    exact ih _ (fst <| IsOption.moveRight _) (hx₁.moveRight _) hx₂⟩
state_before: 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
hi : ((-(x₁, x₂).1).moveLeft i).Numeric
⊢ IH3 (-(x₁, x₂).2) ((-(x₁, x₂).1).moveLeft i) (-(x₁, x₂).1) y₁ y₂
state_after: no goals

tactic: rw [moveLeft_neg', ← P3_neg, neg_lt_neg_iff]
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
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
hi : ((-(x₁, x₂).1).moveLeft i).Numeric
⊢ -(x₁, x₂).2 < (-(x₁, x₂).1).moveLeft i → P3 (-(x₁, x₂).2) ((-(x₁, x₂).1).moveLeft i) 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
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
hi : ((-(x₁, x₂).1).moveLeft i).Numeric
⊢ (x₁, x₂).1.moveRight (toLeftMovesNeg.symm i) < (x₁, x₂).2 →
    P3 ((x₁, x₂).1.moveRight (toLeftMovesNeg.symm i)) (x₁, x₂).2 y₁ y₂

tactic: exact ih _ (fst <| IsOption.moveRight _) (hx₁.moveRight _) hx₂
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
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
hi : ((-(x₁, x₂).1).moveLeft i).Numeric
⊢ (x₁, x₂).1.moveRight (toLeftMovesNeg.symm i) < (x₁, x₂).2 →
    P3 ((x₁, x₂).1.moveRight (toLeftMovesNeg.symm i)) (x₁, x₂).2 y₁ y₂
state_after: no goals