2011-11-02 88 views
5

让我先说这个问题可以通过没有Prolog经验的AI向导来回答。Minimax在“Prolog Programming for Artificial Intelligence”中的实现 - 什么是min_to_move/1和max_to_move/1?

优秀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/1max_to_move/1是。

任何人都可以解释这些给我吗?

在此先感谢!

回答

5

显然,当且仅当“最小化”的玩家要在位置Pos移动时,min_to_move(Pos)才为真。相反,对于max_to_move/1。就我个人而言,我觉得这里的编码风格不是很好。例如,有几次if-then-else(( - >)/ 2和(;)/ 2)似乎更适合表达意图。谓词名称也可以更具描述性(例如考虑“positions_best/2”来描述位置列表和最佳选择之间的关系,而不仅仅是“best/3”)并且更易读(例如“更好“,除了比”比较好“更难读?)。