2011-11-02 85 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」)並且更易讀(例如「更好「,除了比」比較好「更難讀?)。