У меня есть предикат list_moves(Move)
, который дает все возможные ходы для игры. Тогда у меня есть следующие предикаты:Ждите конца предиката Prolog
find_best_move:-
nb_setval(best,0),
list_moves(NewMove),
nb_getval(best,OldMove),
better(OldMove,NewMove).
better(OldMove, NewMove):-
NewMove > OldMove,
nb_setval(best,NewMove), !.
better(_,_).
get_best_move(Move):-
find_best_move,
nb_getval(max,Move).
Я хочу, чтобы получить только один шаг, когда я называю get_best_move(Move)
: лучший. Проблема в том, что у меня есть лучший ход, но я также получаю много других ходов.
Exemple: Скажем, у меня есть следующие шаги в этом порядке от list_moves(Move)
(чем больше значение, тем лучше двигаться):
move1: 0
Move2: 1
move3: 2
move4: 1
move5: 2
move6: 0
я получаю следующий результат, вызвав get_best_move(Move)
:
move1
Move2
move3
move3
move3
move3
Дело: Я просто хочу, чтобы получить move3 один раз. Меня не волнует ни move1-2, ни 3 других вхождения move3.
Я думаю, что одно решение может быть «ждать», пока find_best_move
вызов в get_best_move
не закончена, вместо того, чтобы делать nb_getval
для каждого ответа дается find_best_move
.
Как это сделать? Есть ли другое решение?
Ваша программа использует очень проблемные встроенные вложения, в результате чего код, который не является r eentrant. См. Определение ['call_nth/2'] (http://stackoverflow.com/a/11400256/772868), как это сделать более чистым образом. – false
Рассмотрим 'setof (Nn, Np^(list_moves (Np), Nn - -Np), [Nn | _]), Nmax - -Nn'. – false