Prolog findall/3 : more than one bag

标签 prolog prolog-findall

我正在为 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/

相关文章:

prolog - 为什么 swi-prolog 中的 findall/3 忽略变量绑定(bind)?

python - 如何建立一个问答系统来回答"is"或“否”

prolog - min_member/2的违反直觉的行为

windows - 将 SWI Prolog 代码编译为 Windows 可执行文件 - 解析器 Grails3 项目

ssl - 验证签名链SWI-Prolog

csv - Prolog,读取一个csv文件并做一个谓词。找到所有

prolog - Findall 包含 Pacman netlogo 游戏列表

haskell - 将 Haskell 翻译为 Prolog - 查找总和的子列表

html - 如何取消转义 Prolog 中的 html 属性值?