Natural operations on ordinals #
The goal of this file is to define natural addition and multiplication on ordinals, also known as
the Hessenberg sum and product, and provide a basic API. The natural addition of two ordinals
a + b
is recursively defined as the least ordinal greater than a' + b
and a + b'
for a' < a
and b' < b
. The natural multiplication a * b
is likewise recursively defined as the least
ordinal such that a * b + a' * b'
is greater than a' * b + a * b'
for any a' < a
and
b' < b
.
These operations give the ordinals a CommSemiring
+ IsStrictOrderedRing
structure. To make the
best use of it, we define them on a type alias NatOrdinal
.
An equivalent characterization explains the relevance of these operations to game theory: they are the restrictions of surreal addition and multiplication to the ordinals.
Implementation notes #
To reduce API duplication, we opt not to implement operations on NatOrdinal
on Ordinal
. The
order isomorphisms NatOrdinal.of
and NatOrdinal.val
allow us to cast between them whenever
needed.
For similar reasons, most results about ordinals and games are written using NatOrdinal
rather
than Ordinal
(except when Nimber
would make more sense).
Todo #
- Prove the characterizations of natural addition and multiplication in terms of the Cantor normal form.
Basic casts between Ordinal
and NatOrdinal
#
Ordinal.induction
but for NatOrdinal
.
A type synonym for ordinals with natural addition and multiplication.
Equations
Instances For
Equations
Equations
A recursor for NatOrdinal
. Use as induction x
.
Equations
- NatOrdinal.ind mk a✝ = mk (NatOrdinal.val a✝)
Instances For
Natural addition #
Natural addition on ordinals a + b
, also known as the Hessenberg sum, is recursively defined
as the least ordinal greater than a' + b
and a + b'
for all a' < a
and b' < b
. In contrast
to normal ordinal addition, it is commutative.
Natural addition can equivalently be characterized as the ordinal resulting from adding up
corresponding coefficients in the Cantor normal forms of a
and b
.
Equations
- a.add b = max (⨆ (x : ↑(Set.Iio a)), Order.succ ((↑x).add b)) (⨆ (x : ↑(Set.Iio b)), Order.succ (a.add ↑x))
Instances For
Equations
- NatOrdinal.instAdd = { add := NatOrdinal.add }
Add two NatOrdinal
s as ordinal numbers.
Equations
- NatOrdinal.«term_+ₒ_» = Lean.ParserDescr.trailingNode `NatOrdinal.«term_+ₒ_» 65 65 (Lean.ParserDescr.binary `andthen (Lean.ParserDescr.symbol "+ₒ") (Lean.ParserDescr.cat `term 66))
Instances For
Equations
- One or more equations did not get rendered due to their size.
Equations
- NatOrdinal.instSuccAddOrder = { toSuccOrder := NatOrdinal.instSuccOrder, succ_eq_add_one := NatOrdinal.succ_eq_add_one'✝ }
Equations
- One or more equations did not get rendered due to their size.
A version of oadd_le_add
stated in terms of Ordinal
.
Natural multiplication #
Natural multiplication on ordinals a * b
, also known as the Hessenberg product, is recursively
defined as the least ordinal such that a * b + a' * b'
is greater than a' * b + a * b'
for all
a' < a
and b < b'
. In contrast to normal ordinal multiplication, it is commutative and
distributive (over natural addition).
Natural multiplication can equivalently be characterized as the ordinal resulting from multiplying
the Cantor normal forms of a
and b
as if they were polynomials in ω
. Addition of exponents is
done via natural addition.
Instances For
Equations
- NatOrdinal.instMul = { mul := NatOrdinal.mul }
Multiply two NatOrdinal
s as ordinal numbers.
Equations
- NatOrdinal.«term_*ₒ_» = Lean.ParserDescr.trailingNode `NatOrdinal.«term_*ₒ_» 70 70 (Lean.ParserDescr.binary `andthen (Lean.ParserDescr.symbol "*ₒ") (Lean.ParserDescr.cat `term 71))
Instances For
Equations
- NatOrdinal.instCommMagma = { toMul := NatOrdinal.instMul, mul_comm := NatOrdinal.mul_comm'✝ }
Equations
- NatOrdinal.instMulZeroClass = { toMul := NatOrdinal.instMul, toZero := instNatOrdinalZero, zero_mul := NatOrdinal.instMulZeroClass._proof_1, mul_zero := NatOrdinal.mul_zero'✝ }
Equations
- One or more equations did not get rendered due to their size.
Equations
- NatOrdinal.instDistrib = { toMul := NatOrdinal.instMul, toAdd := NatOrdinal.instAdd, left_distrib := NatOrdinal.mul_add✝, right_distrib := NatOrdinal.instDistrib._proof_1 }
Equations
- One or more equations did not get rendered due to their size.
A version of omul_le_mul
stated in terms of Ordinal
.