Prolog findall/3:多于一个包



我正在为一款Fox and Geese类型的游戏编写AI。我的一个谓词是这样的:

moveFox(+PrevState, -NextState, -PegList, +VisitedStates, -NewVisitedStates)

它进入游戏状态并与狐狸一起移动。结果状态与NextState统一,实际移动与PegList统一。一切正常

我正在计算所有移动的效用得分' NextState。为了能够找到效用得分最高的状态,在比较它们的效用得分之前,我使用findall/3在列表中获取所有状态。

findall(NextState, moveFox(...), NextStatesList)

通过找到最大效用得分,我知道NextState(以及它在列表中的位置)具有最高的效用得分。只有一个问题,目前我还没有写任何谓词来推断哪一步是来NextState的,例如:

getMove(+PrevState, +NextState, -PegList)

不写这样的谓词,我宁愿使用findall/3或等价的。我的问题是是否有办法在两个不同的表中得到两个不同的变量。我是这样想的(如果它能起作用的话):

findall([NextState, PegList], moveFox(...), [NextStatesList, MoveList])

我可以实现这样的功能,而不必运行findall/3两次(丑陋的开销)或写getMove(+PrevState, +NextState, -PegList)谓词?

这个问题可以通过构建一个对列表,然后分离元素来解决,就像library(pairs)所做的那样

...
findall(NextState-PegList, moveFox(...), Pairs),
pairs_keys_values(Pairs, NextStates, Pegs),
...

如果您的Prolog没有pairs_keys_values/3,则可以使用mapplist或递归谓词轻松编写。以下是mapist的方法:

pkv(K-V, K, V).
pairs_keys_values(Pairs, Keys, Vals) :-
    maplist(pkv, Pairs, Keys, Vals).

相关内容

  • 没有找到相关文章

最新更新