Combinatorial games #
In this file we construct the quotient of games IGame
under equivalence, and prove that it forms
an OrderedAddCommGroup
. We take advantage of this structure to prove two particularly tedious
theorems on IGame
, namely IGame.mul_add_equiv
and IGame.mul_assoc_equiv
.
It might be tempting to write mk (x * y)
as mk x * mk y
, but the latter is not well-defined, as
there exist x₁ ≈ x₂
and y₁ ≈ y₂
with x₁ * y₁ ≉ x₂ * y₂
. See
CombinatorialGames.Counterexamples.Multiplication
for a proof.
Games up to equivalence.
If x
and y
are combinatorial games (IGame
), we say that x ≈ y
when both x ≤ y
and y ≤ x
.
Broadly, this means neither player has a preference in playing either game, as a component of a
larger game. This is the standard meaning of x = y
in the literature, though it is not a strict
equality, e.g. {0, 1 | 0}
and {1 | 0}
are equivalent, but not identical as the former has an
extra move for Left.
In particular, note that a Game
has no well-defined notion of left and right options. This means
you should prefer IGame
when analyzing specific games.
Instances For
Alias of the reverse direction of Game.mk_eq_mk
.
Construct a Game
from its left and right sets.
This is given notation {s | t}ᴳ
, where the superscript G
is to disambiguate from set builder
notation, and from the analogous constructors on IGame
and Surreal
.
Note that although this function is well-defined, this function isn't injective, nor do equivalence
classes in Game
have a canonical representative.
Instances For
Construct a Game
from its left and right sets.
This is given notation {s | t}ᴳ
, where the superscript G
is to disambiguate from set builder
notation, and from the analogous constructors on IGame
and Surreal
.
Note that although this function is well-defined, this function isn't injective, nor do equivalence
classes in Game
have a canonical representative.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Game.instAdd = { add := Quotient.map₂ HAdd.hAdd @IGame.add_congr }
Equations
- Game.instNeg = { neg := Quotient.map Neg.neg @IGame.neg_congr }
Equations
- Game.instPartialOrder = inferInstanceAs (PartialOrder (Antisymmetrization IGame fun (x1 x2 : IGame) => x1 ≤ x2))
Equations
- One or more equations did not get rendered due to their size.