-- Mathlib/SetTheory/Game/Birthday.lean
theorem small_setOf_birthday_lt (o : Ordinal) : Small.{u} {x : Game.{u} // birthday x < o}

Proof state:
case h
o : Ordinal.{u}
IH : ∀ k < o, Small.{u, u + 1} { x // x.birthday < k }
S : Set Game := ⋃ a ∈ Set.Iio o, {x | x.birthday < a}
H : Small.{u, u + 1} ↑S := small_biUnion (Set.Iio o) fun a h => {x | x.birthday < a}
⊢ Small.{u, u + 1} { x // x.birthday < o }

Tactic:
obtain rfl | ⟨a, rfl⟩ | ho := zero_or_succ_or_limit o

Result:
case h.inl
IH : ∀ k < 0, Small.{u, u + 1} { x // x.birthday < k }
S : Set Game := ⋃ a ∈ Set.Iio 0, {x | x.birthday < a}
H : Small.{u, u + 1} ↑S := small_biUnion (Set.Iio 0) fun a h => {x | x.birthday < a}
⊢ Small.{u, u + 1} { x // x.birthday < 0 }

case h.inr.inl.intro
a : Ordinal.{u}
IH : ∀ k < Order.succ a, Small.{u, u + 1} { x // x.birthday < k }
S : Set Game := ⋃ a_1 ∈ Set.Iio (Order.succ a), {x | x.birthday < a_1}
H : Small.{u, u + 1} ↑S := small_biUnion (Set.Iio (Order.succ a)) fun a_1 h => {x | x.birthday < a_1}
⊢ Small.{u, u + 1} { x // x.birthday < Order.succ a }

case h.inr.inr
o : Ordinal.{u}
IH : ∀ k < o, Small.{u, u + 1} { x // x.birthday < k }
S : Set Game := ⋃ a ∈ Set.Iio o, {x | x.birthday < a}
H : Small.{u, u + 1} ↑S := small_biUnion (Set.Iio o) fun a h => {x | x.birthday < a}
ho : o.IsLimit
⊢ Small.{u, u + 1} { x // x.birthday < o }

Proof state:
y : PGame
IH : ∀ k < Order.succ (birthday ⟦y⟧), Small.{u, u + 1} { x // x.birthday < k }
S : Set Game := ⋃ a ∈ Set.Iio (Order.succ (birthday ⟦y⟧)), {x | x.birthday < a}
H : Small.{u, u + 1} ↑S := small_biUnion (Set.Iio (Order.succ (birthday ⟦y⟧))) fun a h => {x | x.birthday < a}
f : Set ↑S × Set ↑S → Game :=
  fun g =>
    ⟦PGame.mk (Shrink.{u, u + 1} ↑g.1) (Shrink.{u, u + 1} ↑g.2) (fun x => Quotient.out ↑↑((equivShrink ↑g.1).symm x))
        fun x => Quotient.out ↑↑((equivShrink ↑g.2).symm x)⟧
hy' : y.birthday = birthday ⟦y⟧
i :
  (PGame.mk (Shrink.{u, u + 1} ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).1)
      (Shrink.{u, u + 1} ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).2)
      (fun x =>
        Quotient.out ↑↑((equivShrink ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).1).symm x))
      fun x =>
      Quotient.out
        ↑↑((equivShrink ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).2).symm x)).LeftMoves
⊢ ∃ j,
    (PGame.mk (Shrink.{u, u + 1} ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).1)
            (Shrink.{u, u + 1} ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).2)
            (fun x =>
              Quotient.out
                ↑↑((equivShrink ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).1).symm x))
            fun x =>
            Quotient.out
              ↑↑((equivShrink ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).2).symm x)).moveLeft
        i ≈
      y.moveLeft j

Tactic:
obtain ⟨j, hj⟩ := ((equivShrink _).symm i).2

Result:
case intro
y : PGame
IH : ∀ k < Order.succ (birthday ⟦y⟧), Small.{u, u + 1} { x // x.birthday < k }
S : Set Game := ⋃ a ∈ Set.Iio (Order.succ (birthday ⟦y⟧)), {x | x.birthday < a}
H : Small.{u, u + 1} ↑S := small_biUnion (Set.Iio (Order.succ (birthday ⟦y⟧))) fun a h => {x | x.birthday < a}
f : Set ↑S × Set ↑S → Game :=
  fun g =>
    ⟦PGame.mk (Shrink.{u, u + 1} ↑g.1) (Shrink.{u, u + 1} ↑g.2) (fun x => Quotient.out ↑↑((equivShrink ↑g.1).symm x))
        fun x => Quotient.out ↑↑((equivShrink ↑g.2).symm x)⟧
hy' : y.birthday = birthday ⟦y⟧
i :
  (PGame.mk (Shrink.{u, u + 1} ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).1)
      (Shrink.{u, u + 1} ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).2)
      (fun x =>
        Quotient.out ↑↑((equivShrink ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).1).symm x))
      fun x =>
      Quotient.out
        ↑↑((equivShrink ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).2).symm x)).LeftMoves
j : y.LeftMoves
hj : ⟦y.moveLeft j⟧ = ↑↑((equivShrink ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).1).symm i)
⊢ ∃ j,
    (PGame.mk (Shrink.{u, u + 1} ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).1)
            (Shrink.{u, u + 1} ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).2)
            (fun x =>
              Quotient.out
                ↑↑((equivShrink ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).1).symm x))
            fun x =>
            Quotient.out
              ↑↑((equivShrink ↑({z | ∃ i, ⟦y.moveLeft i⟧ = ↑z}, {z | ∃ i, ⟦y.moveRight i⟧ = ↑z}).2).symm x)).moveLeft
        i ≈
      y.moveLeft j

Proof state:
y : PGame
IH : ∀ k < Order.succ (birthday ⟦y⟧), Small.{u, u + 1} { x // x.birthday < k }
S : Set Game := ⋃ a ∈ Set.Iio (Order.succ (birthday ⟦y⟧)), {x | x.birthday < a}
H : Small.{u, u + 1} ↑S := small_biUnion (Set.Iio (Order.succ (birthday ⟦y⟧))) fun a h => {x | x.birthday < a}
f : Set ↑S × Set ↑S → Game :=
  fun g =>
    ⟦PGame.mk (Shrink.{u, u + 1} ↑g.1) (Shrink.{u, u + 1} ↑g.2) (fun x => Quotient.out ↑↑((equivShrink ↑g.1).symm x))
        fun x => Quotient.out ↑↑((equivShrink ↑g.2).symm x)⟧
hy' : y.birthday = birthday ⟦y⟧
i : y.RightMoves
this : ∃ b ≤ y.birthday, birthday ⟦y.moveRight i⟧ < b
⊢ ⟦y.moveRight i⟧ ∈ S

Tactic:
simpa [S, hy'] using this

Result:
no goals

Proof state:
case h
o : Ordinal.{u}
IH : ∀ k < o, Small.{u, u + 1} { x // x.birthday < k }
S : Set Game := ⋃ a ∈ Set.Iio o, {x | x.birthday < a}
⊢ Small.{u, u + 1} { x // x.birthday < o }

Tactic:
let H : Small.{u} S := @small_biUnion _ _ _ _ _ IH

Result:
case h
o : Ordinal.{u}
IH : ∀ k < o, Small.{u, u + 1} { x // x.birthday < k }
S : Set Game := ⋃ a ∈ Set.Iio o, {x | x.birthday < a}
H : Small.{u, u + 1} ↑S := small_biUnion (Set.Iio o) fun a h => {x | x.birthday < a}
⊢ Small.{u, u + 1} { x // x.birthday < o }

Proof state:
y : PGame
IH : ∀ k < Order.succ (birthday ⟦y⟧), Small.{u, u + 1} { x // x.birthday < k }
S : Set Game := ⋃ a ∈ Set.Iio (Order.succ (birthday ⟦y⟧)), {x | x.birthday < a}
H : Small.{u, u + 1} ↑S := small_biUnion (Set.Iio (Order.succ (birthday ⟦y⟧))) fun a h => {x | x.birthday < a}
f : Set ↑S × Set ↑S → Game :=
  fun g =>
    ⟦PGame.mk (Shrink.{u, u + 1} ↑g.1) (Shrink.{u, u + 1} ↑g.2) (fun x => Quotient.out ↑↑((equivShrink ↑g.1).symm x))
        fun x => Quotient.out ↑↑((equivShrink ↑g.2).symm x)⟧
hy' : y.birthday = birthday ⟦y⟧
i : y.RightMoves
⊢ ⟦y.moveRight i⟧ ∈ S

Tactic:
suffices ∃ b ≤ y.birthday, birthday ⟦y.moveRight i⟧ < b by simpa [S, hy'] using this

Result:
y : PGame
IH : ∀ k < Order.succ (birthday ⟦y⟧), Small.{u, u + 1} { x // x.birthday < k }
S : Set Game := ⋃ a ∈ Set.Iio (Order.succ (birthday ⟦y⟧)), {x | x.birthday < a}
H : Small.{u, u + 1} ↑S := small_biUnion (Set.Iio (Order.succ (birthday ⟦y⟧))) fun a h => {x | x.birthday < a}
f : Set ↑S × Set ↑S → Game :=
  fun g =>
    ⟦PGame.mk (Shrink.{u, u + 1} ↑g.1) (Shrink.{u, u + 1} ↑g.2) (fun x => Quotient.out ↑↑((equivShrink ↑g.1).symm x))
        fun x => Quotient.out ↑↑((equivShrink ↑g.2).symm x)⟧
hy' : y.birthday = birthday ⟦y⟧
i : y.RightMoves
⊢ ∃ b ≤ y.birthday, birthday ⟦y.moveRight i⟧ < b

Proof state:
y : PGame
IH : ∀ k < Order.succ (birthday ⟦y⟧), Small.{u, u + 1} { x // x.birthday < k }
S : Set Game := ⋃ a ∈ Set.Iio (Order.succ (birthday ⟦y⟧)), {x | x.birthday < a}
H : Small.{u, u + 1} ↑S := small_biUnion (Set.Iio (Order.succ (birthday ⟦y⟧))) fun a h => {x | x.birthday < a}
f : Set ↑S × Set ↑S → Game :=
  fun g =>
    ⟦PGame.mk (Shrink.{u, u + 1} ↑g.1) (Shrink.{u, u + 1} ↑g.2) (fun x => Quotient.out ↑↑((equivShrink ↑g.1).symm x))
        fun x => Quotient.out ↑↑((equivShrink ↑g.2).symm x)⟧
hy' : y.birthday = birthday ⟦y⟧
i : y.LeftMoves
⊢ birthday ⟦y.moveLeft i⟧ < y.birthday

Tactic:
exact (birthday_quot_le_pGameBirthday _).trans_lt (PGame.birthday_moveLeft_lt i)

Result:
no goals