2011-11-02 6 views
5

Lasciatemi dire che questa domanda può essere risolta da maghi dell'IA senza esperienza con Prolog.Strumento Minimax in "Prolog Programming for Artificial Intelligence" - quali sono min_to_move/1 e max_to_move/1?

L'eccellente Prolog Programming for Artificial Intelligence libro ha questo piuttosto laconico e intelligente applicazione Minimax:

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 

Tuttavia, l'autore non è andato a molto lungo nel descriverla e sto lasciato a chiedersi cosa min_to_move/1 e max_to_move/1 sono .

Qualcuno può spiegarmelo?

Grazie in anticipo!

risposta

5

Apparentemente, min_to_move (Pos) è vero se e solo se il giocatore "minimizzante" deve effettuare una mossa in posizione Pos. Viceversa per max_to_move/1. Personalmente, trovo che lo stile di codifica qui illustrato non sia molto buono. Ad esempio, in diverse occasioni, if-then-else ((->)/2 e (;)/2) sembra essere più adatto per esprimere l'intenzione. I nomi dei predicati potrebbero anche essere molto più descrittivi (si consideri ad esempio "positions_best/2" per descrivere una relazione tra un elenco di posizioni e una scelta migliore, anziché solo "migliore/3") e più leggibile (ad esempio, " meglio di "oltre a essere solo più difficile da leggere rispetto ad esempio" better_of "?).

Problemi correlati