首先让我说这个问题可以由没有Prolog经验的AI向导来回答.
优秀的人工智能Prolog编程书有一个非常简洁和聪明的极小极大实现:
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/1
和max_to_move/1
是.
任何人都可以向我解释这些吗?
提前致谢!
显然,当且仅当"最小化"玩家要在位置Pos移动时,min_to_move(Pos)才为真.相反,对于max_to_move/1.就个人而言,我发现这里的编码风格并不是很好.例如,有几次,if-then-else(( - >)/ 2和(;)/ 2)似乎更适合表达意图.谓词名称也可以更具描述性(考虑例如"positions_best/2"来描述位置列表和最佳选择之间的关系,而不仅仅是"最佳/ 3")并且更具可读性(例如"是什么")更好"除了更难阅读而不是例如"better_of"?).