switch(min, max). switch(max, min). init(min, 1). init(max, -1). next(state(N, P), state(N1, P1)) :- N > 0, N1 is N - 1, switch(P, P1). next(state(N, P), state(N1, P1)) :- N > 1, N1 is N - 2, switch(P, P1). next(state(N, P), state(N1, P1)) :- N > 2, N1 is N - 3, switch(P, P1). minmaxvalue(_, [], Acc, Acc) :- !. minmaxvalue(min, [S | Ss], Acc, V) :- value(S, V1), V1 < Acc, minmaxvalue(min, Ss, V1, V). minmaxvalue(min, [S | Ss], Acc, V) :- value(S, V1), V1 >= Acc, minmaxvalue(min, Ss, Acc, V). minmaxvalue(max, [S | Ss], Acc, V) :- value(S, V1), V1 >= Acc, minmaxvalue(max, Ss, V1, V). minmaxvalue(max, [S | Ss], Acc, V) :- value(S, V1), V1 < Acc, minmaxvalue(max, Ss, Acc, V). value(state(N, P), V) :- findall(X, next(state(N, P), X), Xs), init(P, I), minmaxvalue(P, Xs, I , V).