5

我正在为 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)谓词吗?

4

1 回答 1

3

这个问题可以通过建立一个 pair 列表来解决然后像 library( pairs ) 那样分离元素

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

如果您的 Prolog 没有pairs_keys_values/3,那么使用maplist 或通过递归谓词编写都很容易。这是maplist方式:

pkv(K-V, K, V).
pairs_keys_values(Pairs, Keys, Vals) :-
    maplist(pkv, Pairs, Keys, Vals).
于 2013-04-10T21:18:03.523 回答