【问题标题】:Findall with lists for Pacman netlogo gameFindall 与 Pacman netlogo 游戏列表
【发布时间】:2014-04-10 02:11:36
【问题描述】:

我是 prolog 的初学者,我正在尝试使用 netlogo 和 prolog 让 pacman 自行移动。所以这是我的代码的一部分:

walkfront(_,_,_,_,_,_,Pacman,DirP,Lab,Ghost,_,Pellet,_,_,Decision) :- findall(Dir, ( member(Dir,[0,90,180,270]), \+ ( member((G,false),Ghost), dangerous(Pacman,G,2,Dir,_) ) ), L), findall(Dir,(member(Dir,[0,90,180,270]),(member(P,Pellet))),T), chooseNotDangerous(L,Pacman,DirP,Lab,Dir,T)

walkfront(_,_,_,_,_,_,Pacman,DirP,Lab,Ghost,_,Pellet,_,_,Decision) 这一行包含我从 netlogo 获得的所有信息列表,Pacman 的位置是 pacman (x,y),DirP 是 pacman 面对的方向,Lab 是迷宫中的空闲空间, Ghost 是幽灵的位置 (x,y,eaten?),Pellet 是所有小球位置 (x,y) 的列表,Decision 是 pacman 选择的输出。
第一个 findall 应该给我所有没有鬼魂且不危险的方向 (Dir),并将它们保存在名为 L 的列表中。
第二个 findall,我希望它给我所有有颗粒的方向并将它们保存在一个名为 T 的列表中。
我的问题是这个 findall 是否正确,因为我的代码由于某种原因无法正常工作,我认为这可能是因为第二个 findall。
谢谢你帮助我:)。

【问题讨论】:

  • 所有这些论点!您的代码将是调试/维护的噩梦。关于调试,试试?- spy(chooseNotDangerous).

标签: prolog pacman prolog-findall


【解决方案1】:

从技术上讲,findall/3 永远不会失败,因为如果没有任何调用成功,它将以一个空的结果列表完成(当然,如果您的 Prolog 实现了异常,则例外)。

当然,如果没有所有代码,就不可能回答您的问题。而且,即使有所有可用的代码,您也可能得不到多少帮助(如果有的话),因为您的程序的 structure 似乎比建议的要复杂。

Prolog 是一种具有关系数据模型的语言,如果可以保持关系干净,最好规范化,最好使用这种数据模型。现在你有了一个带有 16 个参数的谓词。您将如何确保所有它们一起正确播放?

我想说 - 不要现在改变你的程序的结构,如果你成功调试它就可以了。但是下一个程序(如果有的话)使用另一种风格,以及 Prolog 提供的实现数据隐藏的工具。

普通的旧 Prolog 'only' 有复合术语:你的代码应该是

  packman(CurrPackManState, CurrGhostsState, NextPackManState, NextGhostsState) :-
    ...

其中 CurrGhostsState 应该是一个 CurrGhostState 的列表,并且这个列表的每个元素都应该与一个适当的结构相统一,隐藏关于位置、颜色、形状等的信息......

SWI-Prolog 现在有dicts,任何 Prolog 都可以让您使用 DCG 来降低代码的复杂性。请参阅 Markus Triska 的 this page,查找“隐式传递状态”。

此外,您始终可以选择将一些更新频率较低的信息(例如迷宫结构)放入全局数据库中,并使用 assert/retract。

【讨论】:

    猜你喜欢
    • 2014-02-03
    • 2012-07-04
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2015-07-04
    • 2014-01-28
    • 1970-01-01
    相关资源
    最近更新 更多