首先我想说,即使没有Prolog经验,AI大神们也可能回答这个问题。
优秀的《人工智能Prolog编程》一书中有一个非常简洁巧妙的极小极大算法实现:
minimax( Pos, BestSucc, Val) :- moves( Pos, PosList), !, % Pos 的合法移动产生 PosList best( PosList, BestSucc, Val) ; staticval( Pos, Val). % Pos 没有后继节点:静态评估 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 比 Pos1 更好 min_to_move( Pos0), % MIN 在 Pos0 中移动 Val0 > Val1, ! % MAX 更喜欢更大的值 ; max_to_move( Pos0), % MAX 在 Pos0 中移动 Val0 < Val1, !. % MIN 更喜欢更小的值 betterof( Pos0, Val0, Pos1, Val1, Pos1, Val1). % 否则 Pos1 比 Pos0 更好
然而,作者并没有过多地描述它,我想知道 min_to_move/1
和 max_to_move/1
是什么。
谁能为我解释一下这些吗?
提前感谢!
回答:
显然,当且仅当“最小化”玩家需要在位置 Pos 中移动时,min_to_move(Pos) 为真。 max_to_move/1 则相反。 就我个人而言,我发现这里描述的编码风格不是很好。 例如,在几个场合,if-then-else ((->)/2 和 (;)/2) 似乎更适合表达意图。 谓词名称也可以更具描述性(例如考虑使用“positions_best/2”来描述位置列表和最佳选择之间的关系,而不仅仅是“best/3”)并且更具可读性(例如,除了比例如“better_of”更难阅读之外,“betterof”是什么?)。