2011-11-02 8 views
5

Zacznę od stwierdzenia, że ​​na to pytanie mogą odpowiedzieć magowie AI bez doświadczenia Prolog.Minimax implement w "Prolog Programming for Artificial Intelligence" - co to min_to_move/1 and max_to_move/1?

Doskonała Prolog Programming for Artificial Intelligence książka ma tego dość lakoniczny i sprytny minimax realizacji:

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 

Jednak autor nie poszedł do większych długości opisując ją i pozostaje mi się zastanawiać, co min_to_move/1 i max_to_move/1 są .

Czy ktoś może mi to wyjaśnić?

Z góry dziękuję!

Odpowiedz

5

Najwyraźniej min_to_move (Pos) jest prawdziwe wtedy i tylko wtedy, gdy "minimalizujący" gracz wykona ruch na pozycji Poz. Odwrotnie dla max_to_move/1. Osobiście uważam, że przedstawiony tu styl kodowania nie jest zbyt dobry. Na przykład przy kilku okazjach, jeśli-then-else ((->)/2 i (;)/2) wydaje się być lepszym sposobem wyrażenia intencji. Nazwy predykatów mogą być również bardziej opisowe (np. "Position_best/2", aby opisać relację pomiędzy listą pozycji a najlepszym wyborem, zamiast tylko "best/3") i bardziej czytelne (co jest na przykład " lepsza "poza tym, że jest trudniejsza do odczytania niż na przykład" lepsze "?).