-- Mathlib/SetTheory/Surreal/Basic.lean
theorem Relabelling.numeric_imp {x y : PGame} (r : x ≡r y) (ox : Numeric x) : Numeric y

Proof state:
x : PGame
IHl : ∀ (i : x.LeftMoves) {y : PGame}, x.moveLeft i ≡r y → (x.moveLeft i).Numeric → y.Numeric
IHr : ∀ (j : x.RightMoves) {y : PGame}, x.moveRight j ≡r y → (x.moveRight j).Numeric → y.Numeric
y : PGame
r : x ≡r y
ox : x.Numeric
i : y.LeftMoves
j : y.RightMoves
⊢ y.moveLeft i < y.moveRight j

Tactic:
rw [← lt_congr (r.moveLeftSymm i).equiv (r.moveRightSymm j).equiv]

Result:
x : PGame
IHl : ∀ (i : x.LeftMoves) {y : PGame}, x.moveLeft i ≡r y → (x.moveLeft i).Numeric → y.Numeric
IHr : ∀ (j : x.RightMoves) {y : PGame}, x.moveRight j ≡r y → (x.moveRight j).Numeric → y.Numeric
y : PGame
r : x ≡r y
ox : x.Numeric
i : y.LeftMoves
j : y.RightMoves
⊢ x.moveLeft (r.leftMovesEquiv.symm i) < x.moveRight (r.rightMovesEquiv.symm j)

Proof state:
x : PGame
IHl : ∀ (i : x.LeftMoves) {y : PGame}, x.moveLeft i ≡r y → (x.moveLeft i).Numeric → y.Numeric
IHr : ∀ (j : x.RightMoves) {y : PGame}, x.moveRight j ≡r y → (x.moveRight j).Numeric → y.Numeric
y : PGame
r : x ≡r y
ox : x.Numeric
i : y.LeftMoves
⊢ (y.moveLeft i).Numeric

Tactic:
exact IHl _ (r.moveLeftSymm i) (ox.moveLeft _)

Result:
no goals

Proof state:
x y : PGame
r : x ≡r y
ox : x.Numeric
⊢ y.Numeric

Tactic:
induction' x using PGame.moveRecOn with x IHl IHr generalizing y

Result:
case IH
x : PGame
IHl : ∀ (i : x.LeftMoves) {y : PGame}, x.moveLeft i ≡r y → (x.moveLeft i).Numeric → y.Numeric
IHr : ∀ (j : x.RightMoves) {y : PGame}, x.moveRight j ≡r y → (x.moveRight j).Numeric → y.Numeric
y : PGame
r : x ≡r y
ox : x.Numeric
⊢ y.Numeric

Proof state:
case IH
x : PGame
IHl : ∀ (i : x.LeftMoves) {y : PGame}, x.moveLeft i ≡r y → (x.moveLeft i).Numeric → y.Numeric
IHr : ∀ (j : x.RightMoves) {y : PGame}, x.moveRight j ≡r y → (x.moveRight j).Numeric → y.Numeric
y : PGame
r : x ≡r y
ox : x.Numeric
⊢ y.Numeric

Tactic:
apply Numeric.mk (fun i j => ?_) (fun i => ?_) fun j => ?_

Result:
x : PGame
IHl : ∀ (i : x.LeftMoves) {y : PGame}, x.moveLeft i ≡r y → (x.moveLeft i).Numeric → y.Numeric
IHr : ∀ (j : x.RightMoves) {y : PGame}, x.moveRight j ≡r y → (x.moveRight j).Numeric → y.Numeric
y : PGame
r : x ≡r y
ox : x.Numeric
i : y.LeftMoves
j : y.RightMoves
⊢ y.moveLeft i < y.moveRight j

x : PGame
IHl : ∀ (i : x.LeftMoves) {y : PGame}, x.moveLeft i ≡r y → (x.moveLeft i).Numeric → y.Numeric
IHr : ∀ (j : x.RightMoves) {y : PGame}, x.moveRight j ≡r y → (x.moveRight j).Numeric → y.Numeric
y : PGame
r : x ≡r y
ox : x.Numeric
i : y.LeftMoves
⊢ (y.moveLeft i).Numeric

x : PGame
IHl : ∀ (i : x.LeftMoves) {y : PGame}, x.moveLeft i ≡r y → (x.moveLeft i).Numeric → y.Numeric
IHr : ∀ (j : x.RightMoves) {y : PGame}, x.moveRight j ≡r y → (x.moveRight j).Numeric → y.Numeric
y : PGame
r : x ≡r y
ox : x.Numeric
j : y.RightMoves
⊢ (y.moveRight j).Numeric

Proof state:
x : PGame
IHl : ∀ (i : x.LeftMoves) {y : PGame}, x.moveLeft i ≡r y → (x.moveLeft i).Numeric → y.Numeric
IHr : ∀ (j : x.RightMoves) {y : PGame}, x.moveRight j ≡r y → (x.moveRight j).Numeric → y.Numeric
y : PGame
r : x ≡r y
ox : x.Numeric
j : y.RightMoves
⊢ (y.moveRight j).Numeric

Tactic:
exact IHr _ (r.moveRightSymm j) (ox.moveRight _)

Result:
no goals

Proof state:
x : PGame
IHl : ∀ (i : x.LeftMoves) {y : PGame}, x.moveLeft i ≡r y → (x.moveLeft i).Numeric → y.Numeric
IHr : ∀ (j : x.RightMoves) {y : PGame}, x.moveRight j ≡r y → (x.moveRight j).Numeric → y.Numeric
y : PGame
r : x ≡r y
ox : x.Numeric
i : y.LeftMoves
j : y.RightMoves
⊢ x.moveLeft (r.leftMovesEquiv.symm i) < x.moveRight (r.rightMovesEquiv.symm j)

Tactic:
apply ox.left_lt_right

Result:
no goals