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