gpt4 book ai didi

Prolog findall/3 : more than one bag

转载 作者:行者123 更新时间:2023-12-02 02:42:20 27 4
gpt4 key购买 nike

我正在为 Fox and Geese 类型的游戏编写 AI。我的谓词之一如下所示:

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

它需要一个游戏状态并与狐狸一起移动。结果状态与 NextState 统一,实际移动与 PegList 统一。一切都按预期进行。

我正在计算所有移动 NextState 的效用分数。为了能够找到效用分数最高的州,我使用 findall/3 获取列表中的所有州,然后再比较它们的效用分数。

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

通过查找最大效用分数,我知 Prop 有最高效用分数的 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,则可以使用映射列表或通过递归谓词轻松编写。这是maplist方式:

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

关于Prolog findall/3 : more than one bag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15936298/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com