Минимаксная реализация в «Программе пролога для искусственного интеллекта» - что такое min_to_move / 1 и max_to_move / 1? - PullRequest
5 голосов
/ 02 ноября 2011

Позвольте мне начать с того, что на этот вопрос могут ответить мастера ИИ, не имеющие опыта работы с Прологом.

Отличная Программа по Прологу для искусственного интеллекта Книга имеет этот весьма лаконичный и умный минимакс.реализация:

minimax( Pos, BestSucc, Val)  :-
  moves( Pos, PosList), !,               % Legal moves in Pos produce PosList
  best( PosList, BestSucc, Val)
   ;
   staticval( Pos, Val).                 % Pos has no successors: evaluate statically 

best( [ Pos], Pos, Val)  :-
  minimax( Pos, _, Val), !.

best( [Pos1 | PosList], BestPos, BestVal)  :-
  minimax( Pos1, _, Val1),
  best( PosList, Pos2, Val2),
  betterof( Pos1, Val1, Pos2, Val2, BestPos, BestVal).

betterof( Pos0, Val0, Pos1, Val1, Pos0, Val0)  :-        % Pos0 better than Pos1
  min_to_move( Pos0),                                    % MIN to move in Pos0
  Val0 > Val1, !                                         % MAX prefers the greater value
  ;
  max_to_move( Pos0),                                    % MAX to move in Pos0
  Val0 < Val1, !.                                % MIN prefers the lesser value 

betterof( Pos0, Val0, Pos1, Val1, Pos1, Val1).           % Otherwise Pos1 better than Pos0

Тем не менее, автор не стал вдаваться в подробности в описании этого, и мне остается только удивляться, что такое min_to_move/1 и max_to_move/1.

Может кто-нибудьобъясните мне это?

Заранее спасибо!

1 Ответ

5 голосов
/ 02 ноября 2011

Очевидно, min_to_move (Pos) имеет значение true, если и только если «минимизирующий» игрок должен сделать ход в позиции Pos. Обратно для max_to_move / 1. Лично я нахожу стиль кодирования здесь не очень хорошим. Например, в некоторых случаях if-then-else ((->) / 2 и (;) / 2), кажется, лучше подходят для выражения намерения. Имена предикатов также могут быть гораздо более описательными (например, для определения отношения между списком позиций и наилучшим выбором вместо «best / 3», например, «position_best / 2») и более удобочитаемыми (например, что такое «) betterof "в дополнение к тому, что его сложнее читать, чем, например," better_of "?).

...