首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog findall/3:多个包

Prolog findall/3:多个包
EN

Stack Overflow用户
提问于 2013-04-11 04:59:39
回答 1查看 527关注 0票数 5

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

代码语言:javascript
复制
moveFox(+PrevState, -NextState, -PegList, +VisitedStates, -NewVisitedStates)

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

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

代码语言:javascript
复制
findall(NextState, moveFox(...), NextStatesList)

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

代码语言:javascript
复制
getMove(+PrevState, +NextState, -PegList)

与编写这样的谓词相比,我更愿意使用findall/3或等效的谓词。我的问题是,是否有某种方法可以在两个不同的列表中获得两个不同的变量。我是这样想的(如果它可以工作的话):

代码语言:javascript
复制
findall([NextState, PegList], moveFox(...), [NextStatesList, MoveList])

我可以在不运行两次findall/3 (难看的开销)或编写getMove(+PrevState, +NextState, -PegList)谓词的情况下实现这样的功能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-11 05:18:04

这个问题可以构建一个对列表,然后分离元素,就像库(pairs)一样

代码语言:javascript
复制
...
findall(NextState-PegList, moveFox(...), Pairs),
pairs_keys_values(Pairs, NextStates, Pegs),
...

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

代码语言:javascript
复制
pkv(K-V, K, V).
pairs_keys_values(Pairs, Keys, Vals) :-
    maplist(pkv, Pairs, Keys, Vals).
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15936298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档