Documentation

CombinatorialGames.Surreal.Multiplication

Surreal multiplication #

In this file, we show that multiplication of surreal numbers is well-defined, and thus the surreal numbers form a linear ordered commutative ring. This is Theorem 8 in [Conway2001], or Theorem 3.8 in [SchleicherStoll].

An inductive argument proves the following three main theorems:

P1 allows us to define multiplication as an operation on numeric pregames, P2 says that this is well-defined as an operation on the quotient by IGame.Equiv, namely the surreal numbers, and P3 is an axiom that needs to be satisfied for the surreals to be a OrderedRing.

We follow the proof in [SchleicherStoll], except that we use the well-foundedness of the hydra relation CutExpand on Multiset IGame instead of the argument based on a depth function in the paper. As in said argument, P3 is proven by proxy of an auxiliary P4, which states that for x₁ < x₂ and y, then x₁ * y + x₂ * a < x₁ * a + x₂ * y when a ∈ yᴸ, and x₁ * b + x₂ * y < x₁ * y + x₂ * b when b ∈ yᴿ.

Reducing casework #

This argument is very casework heavy in a way that's difficult to automate. For instance, in P1, we have to prove four different inequalities of the form a ∈ (x * y)ᴸ → b ∈ (x * y)ᴿ → a < b, and depending on what form the options of x * y take, we have to apply different instantiations of the inductive hypothesis.

To greatly simplify things, we work uniquely in terms of left options, which we achieve by rewriting a ∈ xᴿ as -a ∈ (-x)ᴸ. We then show that our distinct lemmas and inductive hypotheses are invariant under the appropriate sign changes. In the P1 example, this makes it so that one case (mulOption_lt_of_lt) is enough to conclude the others (mulOption_lt), and the same goes for the other parts of the proof.

Note also that we express all inequalities in terms of Game instead of IGame; this allows us to make use of abel and all of the theorems on OrderedAddCommGroup.

Predicates P1 – P4 #

Symmetry properties of P1 – P4 #

Inductive setup #

P1 follows from the inductive hypothesis #

P2 follows from the inductive hypothesis #

P4 follows from the inductive hypothesis #

Instances and corollaries #

instance IGame.Numeric.mul (x y : IGame) [hx : x.Numeric] [hy : y.Numeric] :
(x * y).Numeric
instance IGame.Numeric.mulOption (x y a b : IGame) [x.Numeric] [y.Numeric] [a.Numeric] [b.Numeric] :
(mulOption x y a b).Numeric
theorem IGame.Numeric.mul_congr_left {x₁ x₂ y : IGame} [x₁.Numeric] [x₂.Numeric] [y.Numeric] (he : x₁x₂) :
x₁ * yx₂ * y
theorem IGame.Numeric.mul_congr_right {x y₁ y₂ : IGame} [x.Numeric] [y₁.Numeric] [y₂.Numeric] (he : y₁y₂) :
x * y₁x * y₂
theorem IGame.Numeric.mul_congr {x₁ x₂ y₁ y₂ : IGame} [x₁.Numeric] [x₂.Numeric] [y₁.Numeric] [y₂.Numeric] (hx : x₁x₂) (hy : y₁y₂) :
x₁ * y₁x₂ * y₂
theorem IGame.Numeric.mul_pos {x₁ x₂ : IGame} [x₁.Numeric] [x₂.Numeric] (h₁ : 0 < x₁) (h₂ : 0 < x₂) :
0 < x₁ * x₂
@[implicit_reducible]
noncomputable instance Surreal.instCommRing :
Equations
  • One or more equations did not get rendered due to their size.
@[simp]
theorem Surreal.mk_mul (x y : IGame) [x.Numeric] [y.Numeric] :
mk (x * y) = mk x * mk y
theorem IGame.Numeric.mul_neg_of_pos_of_neg {x y : IGame} [x.Numeric] [y.Numeric] (hx : 0 < x) (hy : y < 0) :
x * y < 0
theorem IGame.Numeric.mul_neg_of_neg_of_pos {x y : IGame} [x.Numeric] [y.Numeric] (hx : x < 0) (hy : 0 < y) :
x * y < 0
theorem IGame.Numeric.mul_pos_of_neg_of_neg {x y : IGame} [x.Numeric] [y.Numeric] (hx : x < 0) (hy : y < 0) :
0 < x * y
theorem IGame.Numeric.mul_nonneg {x y : IGame} [x.Numeric] [y.Numeric] (hx : 0 x) (hy : 0 y) :
0 x * y
theorem IGame.Numeric.mul_nonpos_of_nonneg_of_nonpos {x y : IGame} [x.Numeric] [y.Numeric] (hx : 0 x) (hy : y 0) :
x * y 0
theorem IGame.Numeric.mul_nonpos_of_nonpos_of_nonneg {x y : IGame} [x.Numeric] [y.Numeric] (hx : x 0) (hy : 0 y) :
x * y 0
theorem IGame.Numeric.mul_nonneg_of_nonpos_of_nonpos {x y : IGame} [x.Numeric] [y.Numeric] (hx : x 0) (hy : y 0) :
0 x * y
theorem IGame.Numeric.mul_left_cancel {x y z : IGame} [x.Numeric] [y.Numeric] [z.Numeric] (hx : ¬x0) (h : x * yx * z) :
yz
theorem IGame.Numeric.mul_right_cancel {x y z : IGame} [x.Numeric] [y.Numeric] [z.Numeric] (hx : ¬x0) (h : y * xz * x) :
yz
@[simp]
theorem IGame.Numeric.mul_le_mul_iff_left {x y z : IGame} [x.Numeric] [y.Numeric] [z.Numeric] (hx : 0 < x) :
y * x z * x y z
@[simp]
theorem IGame.Numeric.mul_le_mul_iff_right {x y z : IGame} [x.Numeric] [y.Numeric] [z.Numeric] (hx : 0 < x) :
x * y x * z y z
@[simp]
theorem IGame.Numeric.mul_lt_mul_iff_left {x y z : IGame} [x.Numeric] [y.Numeric] [z.Numeric] (hx : 0 < x) :
y * x < z * x y < z
@[simp]
theorem IGame.Numeric.mul_lt_mul_iff_right {x y z : IGame} [x.Numeric] [y.Numeric] [z.Numeric] (hx : 0 < x) :
x * y < x * z y < z
@[simp]
theorem IGame.Numeric.mul_le_mul_left_of_neg {x y z : IGame} [x.Numeric] [y.Numeric] [z.Numeric] (hz : z < 0) :
z * x z * y y x
@[simp]
theorem IGame.Numeric.mul_le_mul_right_of_neg {x y z : IGame} [x.Numeric] [y.Numeric] [z.Numeric] (hz : z < 0) :
x * z y * z y x
@[simp]
theorem IGame.Numeric.mul_lt_mul_left_of_neg {x y z : IGame} [x.Numeric] [y.Numeric] [z.Numeric] (hz : z < 0) :
z * x < z * y y < x
@[simp]
theorem IGame.Numeric.mul_lt_mul_right_of_neg {x y z : IGame} [x.Numeric] [y.Numeric] [z.Numeric] (hz : z < 0) :
x * z < y * z y < x
theorem IGame.Numeric.mul_le_mul {a b c d : IGame} [a.Numeric] [b.Numeric] [c.Numeric] [d.Numeric] :
a bc d0 c0 ba * c b * d
theorem IGame.Numeric.mul_lt_mul {a b c d : IGame} [a.Numeric] [b.Numeric] [c.Numeric] [d.Numeric] :
a < bc d0 < c0 ba * c < b * d
@[simp]
theorem IGame.Numeric.mul_pos_iff_of_pos_left {a b : IGame} [a.Numeric] [b.Numeric] :
0 < a → (0 < a * b 0 < b)
@[simp]
theorem IGame.Numeric.mul_pos_iff_of_pos_right {a b : IGame} [a.Numeric] [b.Numeric] :
0 < b → (0 < a * b 0 < a)
theorem IGame.Numeric.mul_equiv_zero {x y : IGame} [x.Numeric] [y.Numeric] :
x * y0 x0 y0
theorem IGame.Numeric.mulOption_congr₁ {x₁ x₂ y a b : IGame} [x₁.Numeric] [x₂.Numeric] [y.Numeric] [a.Numeric] [b.Numeric] (he : x₁x₂) :
mulOption x₁ y a bmulOption x₂ y a b
theorem IGame.Numeric.mulOption_congr₂ {x y₁ y₂ a b : IGame} [x.Numeric] [y₁.Numeric] [y₂.Numeric] [a.Numeric] [b.Numeric] (he : y₁y₂) :
mulOption x y₁ a bmulOption x y₂ a b
theorem IGame.Numeric.mulOption_congr₃ {x y a₁ a₂ b : IGame} [x.Numeric] [y.Numeric] [a₁.Numeric] [a₂.Numeric] [b.Numeric] (he : a₁a₂) :
mulOption x y a₁ bmulOption x y a₂ b
theorem IGame.Numeric.mulOption_congr₄ {x y a b₁ b₂ : IGame} [x.Numeric] [y.Numeric] [a.Numeric] [b₁.Numeric] [b₂.Numeric] (he : b₁b₂) :
mulOption x y a b₁mulOption x y a b₂