4

この質問は、Prolog の経験がない AI ウィザードでも答えられる可能性があると言っておきましょう。

優れた本Prolog Programming for Artificial Intelligenceには、非常に簡潔で巧妙なミニマックスの実装があります。

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

誰かが私にこれらを説明できますか?

前もって感謝します!

4

1 に答える 1

4

どうやら、min_to_move(Pos) は、「最小化」しているプレーヤーが位置 Pos で移動する場合にのみ true です。逆に max_to_move/1 の場合。個人的には、ここに示されているコーディング スタイルはあまり良くないと思います。たとえば、場合によっては、if-then-else ((->)/2 and (;)/2) の方が意図を表現するのに適しているように思われます。述語名は、はるかに説明的で (たとえば、単に "best/3" ではなく、位置のリストと最良の選択との関係を記述する "positions_best/2" を検討してください)、より読みやすいものにすることもできます (たとえば、"たとえば「better_of」よりも読みにくいだけでなく、「betterof」?)。

于 2011-11-02T12:09:02.870 に答える