:: Conway's Games and Some of Their Basic Properties
:: by Robin Nittka
::
:: Received October 13, 2010
:: Copyright (c) 2010-2021 Association of Mizar Users
:: (Stowarzyszenie Uzytkownikow Mizara, Bialystok, Poland).
:: This code can be distributed under the GNU General Public Licence
:: version 3.0 or later, or the Creative Commons Attribution-ShareAlike
:: License version 3.0 or later, subject to the binding interpretation
:: detailed in file COPYING.interpretation.
:: See COPYING.GPL and COPYING.CC-BY-SA for the full text of these
:: licenses, or see http://www.gnu.org/licenses/gpl.html and
:: http://creativecommons.org/licenses/by-sa/3.0/.
environ
vocabularies CGAMES_1, RELAT_1, TARSKI, XBOOLE_0, ORDINAL1, FUNCT_1, CARD_1,
SUBSET_1, XXREAL_0, ORDINAL2, SUPINF_2, ARYTM_1, PARTFUN1, MSUALG_6,
FINSEQ_1, ARYTM_3, NAT_1, ORDINAL4, MESFUNC5, XCMPLX_0;
notations TARSKI, XBOOLE_0, XXREAL_0, RELAT_1, ORDINAL1, FUNCT_1, CARD_1,
PARTFUN1, ORDINAL2, SUBSET_1, COMPUT_1, FINSEQ_1, XCMPLX_0;
constructors ORDINAL2, COMPUT_1, RELSET_1;
registrations XBOOLE_0, XREAL_0, XXREAL_0, ORDINAL1, FUNCT_1, CARD_1,
SUBSET_1, RELAT_1, COMPUT_1, FINSEQ_1, NAT_1;
requirements REAL, SUBSET, BOOLE, NUMERALS, ARITHM;
begin :: Construction of days
reserve x,y,y1,y2,z,e,s for set;
reserve alpha,beta,gamma for Ordinal;
reserve n,m,k for Nat;
definition
struct left-right(# LeftOptions,RightOptions -> set #);
end;
definition
func ConwayZero -> set equals
:: CGAMES_1:def 1
left-right(#{},{}#);
end;
registration
cluster strict for left-right;
end;
definition
let alpha;
func ConwayDay(alpha) -> set means
:: CGAMES_1:def 2
ex f being Sequence st alpha in dom f & f.alpha = it
& for beta st beta in dom f holds f.beta = the set of all
left-right(#x,y#)
where x,y is Subset of union(rng (f|beta)) ;
end;
theorem :: CGAMES_1:1
for z being object holds
z in ConwayDay(alpha) iff ex w being strict left-right st z = w &
for x st x in (the LeftOptions of w) \/ (the RightOptions of w)
ex beta st beta in alpha & x in ConwayDay(beta);
theorem :: CGAMES_1:2
ConwayDay(0) = { ConwayZero };
theorem :: CGAMES_1:3
alpha c= beta implies ConwayDay(alpha) c= ConwayDay(beta);
registration
let alpha;
cluster ConwayDay(alpha) -> non empty;
end;
begin :: Games
definition
let x;
attr x is ConwayGame-like means
:: CGAMES_1:def 3
ex alpha st x in ConwayDay(alpha);
end;
registration
let alpha;
cluster -> ConwayGame-like for Element of ConwayDay(alpha);
end;
registration
cluster ConwayZero -> ConwayGame-like;
end;
registration
cluster ConwayGame-like strict for left-right;
cluster ConwayGame-like for set;
end;
definition
mode ConwayGame is ConwayGame-like set;
end;
definition
redefine func ConwayZero -> Element of ConwayDay(0);
end;
definition
func ConwayOne -> Element of ConwayDay(1) equals
:: CGAMES_1:def 4
left-right(#{ConwayZero},{}#);
func ConwayStar -> Element of ConwayDay(1) equals
:: CGAMES_1:def 5
left-right(#{ConwayZero},{ConwayZero}#);
end;
reserve g,g0,g1,g2,gO,gL,gR,gLL,gLR,gRL,gRR for ConwayGame;
theorem :: CGAMES_1:4
g is strict left-right;
registration
cluster ConwayGame-like -> strict for left-right;
end;
definition
let g;
func the_LeftOptions_of g -> set means
:: CGAMES_1:def 6
ex w being left-right st g = w & it = the LeftOptions of w;
func the_RightOptions_of g -> set means
:: CGAMES_1:def 7
ex w being left-right st g = w & it = the RightOptions of w;
end;
definition
let g;
func the_Options_of g -> set equals
:: CGAMES_1:def 8
(the_LeftOptions_of g) \/ (the_RightOptions_of g);
end;
theorem :: CGAMES_1:5
g1 = g2 iff
(the_LeftOptions_of g1 = the_LeftOptions_of g2
& the_RightOptions_of g1 = the_RightOptions_of g2);
registration
cluster the_LeftOptions_of ConwayZero -> empty;
cluster the_RightOptions_of ConwayZero -> empty;
cluster the_RightOptions_of ConwayOne -> empty;
end;
theorem :: CGAMES_1:6
g = ConwayZero iff the_Options_of g = {};
theorem :: CGAMES_1:7
x in the_LeftOptions_of ConwayOne iff x = ConwayZero;
theorem :: CGAMES_1:8
(x in the_Options_of ConwayStar iff x = ConwayZero)
& (x in the_LeftOptions_of ConwayStar iff x = ConwayZero)
& (x in the_RightOptions_of ConwayStar iff x = ConwayZero);
theorem :: CGAMES_1:9
g in ConwayDay(alpha) iff
for x st x in the_Options_of g
ex beta st beta in alpha & x in ConwayDay(beta);
definition
let g be set;
assume
g is ConwayGame;
func ConwayRank(g) -> Ordinal means
:: CGAMES_1:def 9
g in ConwayDay(it) & for beta st beta in it holds not g in ConwayDay(beta);
end;
theorem :: CGAMES_1:10
g in ConwayDay(alpha) & x in the_Options_of g implies x in ConwayDay(alpha);
theorem :: CGAMES_1:11
g in ConwayDay(alpha) &
(x in the_LeftOptions_of g or x in the_RightOptions_of g)
implies x in ConwayDay(alpha);
theorem :: CGAMES_1:12
g in ConwayDay(alpha) iff ConwayRank(g) c= alpha;
theorem :: CGAMES_1:13
ConwayRank(g) in alpha iff ex beta st beta in alpha & g in ConwayDay(beta);
theorem :: CGAMES_1:14
gO in the_Options_of g implies ConwayRank(gO) in ConwayRank(g);
theorem :: CGAMES_1:15
(gO in the_LeftOptions_of g or gO in the_RightOptions_of g)
implies ConwayRank(gO) in ConwayRank(g);
theorem :: CGAMES_1:16
not g in the_Options_of g;
theorem :: CGAMES_1:17
x in the_Options_of g implies x is ConwayGame-like left-right;
theorem :: CGAMES_1:18
(x in the_LeftOptions_of g or x in the_RightOptions_of g)
implies x is ConwayGame-like left-right;
theorem :: CGAMES_1:19
for w being strict left-right holds w is ConwayGame iff
for z st z in (the LeftOptions of w) \/ (the RightOptions of w)
holds z is ConwayGame;
begin :: Schemes of induction
scheme :: CGAMES_1:sch 1
ConwayGameMinTot { P[ConwayGame] } :
ex g st P[g] & for g1 st ConwayRank(g1) in ConwayRank(g) holds not P[g1]
provided
ex g st P[g];
scheme :: CGAMES_1:sch 2
ConwayGameMin { P[ConwayGame] } :
ex g st P[g] & for gO st gO in the_Options_of g holds not P[gO]
provided
ex g st P[g];
scheme :: CGAMES_1:sch 3
ConwayGameInd { P[ConwayGame] } : for g holds P[g]
provided
for g st (for gO st gO in the_Options_of g holds P[gO]) holds P[g];
begin :: Tree of a game
definition
let f be Function;
attr f is ConwayGame-valued means
:: CGAMES_1:def 10
for x st x in dom f holds f.x is ConwayGame;
end;
registration
let g;
cluster <*g*> -> ConwayGame-valued;
end;
registration
cluster ConwayGame-valued non empty for FinSequence;
end;
registration
let f be non empty FinSequence;
cluster -> natural non empty for Element of dom f;
end;
registration
let f be ConwayGame-valued non empty Function;
let x be Element of dom f;
cluster f.x -> ConwayGame-like;
end;
definition
let f be ConwayGame-valued non empty FinSequence;
attr f is ConwayGameChain-like means
:: CGAMES_1:def 11
for n being Element of dom f st n > 1 holds
f.(n-1) in the_Options_of f.n;
end;
theorem :: CGAMES_1:20
for f being FinSequence for n st n in dom f & n > 1
holds n-1 in dom f;
registration
let g;
cluster <*g*> -> ConwayGameChain-like;
end;
registration
cluster ConwayGameChain-like for ConwayGame-valued non empty FinSequence;
end;
definition
mode ConwayGameChain is
ConwayGameChain-like ConwayGame-valued non empty FinSequence;
end;
theorem :: CGAMES_1:21
for f being ConwayGameChain
for n,m being Element of dom f st n < m holds
ConwayRank(f.n) in ConwayRank(f.m);
theorem :: CGAMES_1:22
for f being ConwayGameChain
for n,m being Element of dom f st n <= m holds
ConwayRank(f.n) c= ConwayRank(f.m);
theorem :: CGAMES_1:23
for f being ConwayGameChain st f.(len f) in ConwayDay(alpha)
holds f.1 in ConwayDay(alpha);
definition
let g;
func the_Tree_of g -> set means
:: CGAMES_1:def 12
z in it iff ex f being ConwayGameChain st f.1 = z & f.(len f) = g;
end;
registration
let g;
cluster the_Tree_of g -> non empty;
end;
definition
let g;
func the_proper_Tree_of g -> Subset of the_Tree_of g equals
:: CGAMES_1:def 13
the_Tree_of g \ {g};
end;
theorem :: CGAMES_1:24
g in the_Tree_of g;
definition
let alpha;
let g be Element of ConwayDay(alpha);
redefine func the_Tree_of g -> Subset of ConwayDay(alpha);
end;
registration
let g;
cluster -> ConwayGame-like for Element of the_Tree_of g;
end;
theorem :: CGAMES_1:25
for f being ConwayGameChain for n being non zero Nat holds
f|n is ConwayGameChain;
theorem :: CGAMES_1:26
for f1,f2 being ConwayGameChain st
ex g st g = f2.1 & f1.(len f1) in the_Options_of g
holds f1^f2 is ConwayGameChain;
theorem :: CGAMES_1:27
x in the_Tree_of g iff
(x = g or ex gO st gO in the_Options_of g & x in the_Tree_of gO);
theorem :: CGAMES_1:28
gO in the_Tree_of g implies (gO = g or ConwayRank(gO) in ConwayRank(g));
theorem :: CGAMES_1:29
gO in the_Tree_of g implies ConwayRank(gO) c= ConwayRank(g);
theorem :: CGAMES_1:30
for s being set st g in s & for g1 st g1 in s holds the_Options_of g1 c= s
holds the_Tree_of g c= s;
theorem :: CGAMES_1:31
g1 in the_Tree_of g2 implies the_Tree_of g1 c= the_Tree_of g2;
theorem :: CGAMES_1:32
g1 in the_Tree_of g2 implies the_proper_Tree_of g1 c= the_proper_Tree_of g2;
theorem :: CGAMES_1:33
the_Options_of g c= the_proper_Tree_of g;
theorem :: CGAMES_1:34
the_Options_of g c= the_Tree_of g;
theorem :: CGAMES_1:35
g1 in the_proper_Tree_of g2 implies the_Tree_of g1 c= the_proper_Tree_of g2;
theorem :: CGAMES_1:36
gO in the_Options_of g implies the_Tree_of gO c= the_proper_Tree_of g;
theorem :: CGAMES_1:37
the_Tree_of ConwayZero = { ConwayZero };
theorem :: CGAMES_1:38
ConwayZero in the_Tree_of g;
scheme :: CGAMES_1:sch 4
ConwayGameMin2 { P[ConwayGame] } :
ex g st P[g] & for gO st gO in the_proper_Tree_of g holds not P[gO]
provided
ex g st P[g];
begin :: Scheme about definability of functions by recursion
scheme :: CGAMES_1:sch 5
Func1RecUniq { F(ConwayGame,Function) -> set } :
for g for f1,f2 being Function st
dom f1 = the_Tree_of g & dom f2 = the_Tree_of g
& (for g1 st g1 in dom f1 holds f1.g1 = F(g1,f1|the_proper_Tree_of g1))
& (for g1 st g1 in dom f2 holds f2.g1 = F(g1,f2|the_proper_Tree_of g1))
holds f1 = f2;
scheme :: CGAMES_1:sch 6
Func1RecEx { F(ConwayGame,Function) -> set } :
ex f being Function st dom f = the_Tree_of g &
for g1 st g1 in dom f holds f.g1 = F(g1,f|the_proper_Tree_of g1);
begin
definition
let g;
func -g -> set means
:: CGAMES_1:def 14
ex f being Function st dom f = the_Tree_of g & it = f.g
& for g1 st g1 in dom f holds f.g1 = left-right(#
{ f.gR where gR is Element of the_RightOptions_of g1 :
the_RightOptions_of g1 <> {} },
{ f.gL where gL is Element of the_LeftOptions_of g1 :
the_LeftOptions_of g1 <> {} } #);
end;
registration
let g;
cluster -g -> ConwayGame-like;
end;
theorem :: CGAMES_1:39
(for x holds x in the_LeftOptions_of -g iff
ex gR st gR in the_RightOptions_of g & x = -gR)
& (for x holds x in the_RightOptions_of -g iff
ex gL st gL in the_LeftOptions_of g & x = -gL);
theorem :: CGAMES_1:40
-(-g) = g;
theorem :: CGAMES_1:41
(gO in the_LeftOptions_of -g iff -gO in the_RightOptions_of g)
& (gO in the_LeftOptions_of g iff -gO in the_RightOptions_of -g)
& (gO in the_RightOptions_of -g iff -gO in the_LeftOptions_of g)
& (gO in the_RightOptions_of g iff -gO in the_LeftOptions_of -g);
definition
let g;
attr g is nonnegative means
:: CGAMES_1:def 15
ex s st g in s & for g1 st g1 in s for gR st gR in the_RightOptions_of g1
ex gRL st gRL in the_LeftOptions_of gR & gRL in s;
end;
definition
let g;
attr g is nonpositive means
:: CGAMES_1:def 16
-g is nonnegative;
end;
definition
let g;
attr g is zero means
:: CGAMES_1:def 17
g is nonnegative & g is nonpositive;
attr g is fuzzy means
:: CGAMES_1:def 18
not g is nonnegative & not g is nonpositive;
end;
definition
let g;
attr g is positive means
:: CGAMES_1:def 19
g is nonnegative & not g is zero;
attr g is negative means
:: CGAMES_1:def 20
g is nonpositive & not g is zero;
end;
registration
cluster zero -> nonnegative nonpositive for ConwayGame;
cluster nonpositive nonnegative -> zero for ConwayGame;
cluster negative -> nonpositive non zero for ConwayGame;
cluster nonpositive non zero -> negative for ConwayGame;
cluster positive -> nonnegative non zero for ConwayGame;
cluster nonnegative non zero -> positive for ConwayGame;
cluster fuzzy -> non nonnegative non nonpositive for ConwayGame;
cluster non nonnegative non nonpositive -> fuzzy for ConwayGame;
end;
theorem :: CGAMES_1:42
g is zero or g is positive or g is negative or g is fuzzy;
theorem :: CGAMES_1:43
g is nonnegative iff
for gR st gR in the_RightOptions_of g
ex gRL st gRL in the_LeftOptions_of gR & gRL is nonnegative;
theorem :: CGAMES_1:44
g is nonpositive iff
for gL st gL in the_LeftOptions_of g
ex gLR st gLR in the_RightOptions_of gL & gLR is nonpositive;
theorem :: CGAMES_1:45
(g is nonnegative iff
for gR st gR in the_RightOptions_of g holds gR is fuzzy or gR is positive)
& (g is nonpositive iff
for gL st gL in the_LeftOptions_of g holds gL is fuzzy or gL is negative);
theorem :: CGAMES_1:46
g is fuzzy iff
(ex gL st gL in the_LeftOptions_of g & gL is nonnegative) &
(ex gR st gR in the_RightOptions_of g & gR is nonpositive);
theorem :: CGAMES_1:47
g is zero iff
(for gL st gL in the_LeftOptions_of g holds gL is fuzzy or gL is negative) &
(for gR st gR in the_RightOptions_of g holds gR is fuzzy or gR is positive);
theorem :: CGAMES_1:48
g is positive iff
(for gR st gR in the_RightOptions_of g holds gR is fuzzy or gR is positive)
& (ex gL st gL in the_LeftOptions_of g & gL is nonnegative);
theorem :: CGAMES_1:49
g is negative iff
(for gL st gL in the_LeftOptions_of g holds gL is fuzzy or gL is negative)
& (ex gR st gR in the_RightOptions_of g & gR is nonpositive);
registration
cluster ConwayZero -> zero;
end;
registration
cluster ConwayOne -> positive;
cluster ConwayStar -> fuzzy;
end;
registration
cluster zero for ConwayGame;
cluster positive for ConwayGame;
cluster fuzzy for ConwayGame;
end;
registration
let g be nonpositive ConwayGame;
cluster -g -> nonnegative;
end;
registration
let g be nonnegative ConwayGame;
cluster -g -> nonpositive;
end;
registration
let g be positive ConwayGame;
cluster -g -> negative;
end;
registration
cluster negative for ConwayGame;
end;
registration
let g be negative ConwayGame;
cluster -g -> positive;
end;
registration
let g be fuzzy ConwayGame;
cluster -g -> fuzzy;
end;