S1=31
S2=32
Объяснение:
Чтобы выиграть первым ходом, в куче должно быть от 16 до 30 камней включительно. Соответственно, чтобы выиграть вторым ходом, необходимо чтобы камней было в два раза больше (если первым ходом игрок уменьшает число камней в два раза), то есть от 31 до 60 камней.
Но первым ходом игрок не обязательно уменьшает число камней в два раза. Он может просто взять один камень. В этом случае, в куче должно быть 31 или 32 камня.
С учетом того, что согласно условию задачи, выигрыш должен наступить независимо от того, каким будет первый ход, искомые значения 31 и 32.
domains treetype = tree(integer, treetype, treetype); empty
predicates
max_t(treetype, integer)
min_t(treetype, integer)
max(integer,integer,integer)
min(integer,integer,integer)
clauses
max(M,N,N) :- N>=M, !.
max(M,N,M) :- M>=N, !.
min(M,N,N) :- N<=M, !.
min(M,N,M) :- M<=N, !.
max_t(tree(X,empty,empty),X) :- !.
max_t(tree(X,empty,R),Q) :- max_t(R,N), max(X,N,Q). max_t(tree(X,L,empty),Q) :- max_t(L,N), max(X,N,Q).
max_t(tree(X,L,R),Q) :- max_t(L,LM), max_t(R,RM), max(RM,LM,QM), max(X,QM,Q).
min_t(tree(X,empty,empty),X) :- !.
min_t(tree(X,empty,R),Q) :- min_t(R,N), min(X,N,Q). min_t(tree(X,L,empty),Q) :- min_t(L,N), min(X,N,Q).
min_t(tree(X,L,R),Q) :- min_t(L,LM), min_t(R,RM), min(RM,LM,QM), min(X,QM,Q).