Findall与Pacman netlogo游戏列表

时间:2014-04-10 02:11:36

标签: prolog pacman prolog-findall

我是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,吃掉?),Pellet是弹丸所有位置的列表(x,y),决定是pacman选择的输出。
第一个findall应该给我所有没有鬼魂并且没有危险的方向(Dir)并将它们保存在名为L的列表中。 第二个,我想让它给我所有有颗粒的方向并将它们保存在名为T.的列表中 我的问题是,如果这个findall是正确的,因为我的代码由于某种原因不起作用,我认为它可能是因为第二个findall。 谢谢你帮助我:)。

1 个答案:

答案 0 :(得分:2)

从技术上讲,findall / 3永远不会失败,因为如果没有任何调用成功,它将以空结果列表完成(好吧,例外,如果你的Prolog实现它们)。

当然,如果没有所有代码,就无法回答你的问题。而且,即使所有代码都可用,您也会得到很少 - 如果有的话 - 帮助,因为您的程序的structure似乎比可能的更复杂。

Prolog是一种具有关系数据模型的语言,当可以保持关系清洁时,最好采用这种数据模型,最好是规范化。现在你有一个带有 16 参数的谓词。你是如何确保所有一起正确播放的?

我想说 - 如果你成功调试好了,不要改变现在程序的结构。但是下一个程序 - 如果有的话 - 使用另一种样式,以及Prolog提供的实现数据隐藏的功能。

普通老Prolog'仅'具有复合词:您的代码可能是

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

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

SWI-Prolog现在有dicts,任何Prolog都会让你使用DCG来降低代码的复杂性。请参阅马库斯·特里斯卡的this page,寻找“隐含地传递状态”。

此外,您总是可以选择在全局数据库中使用断言/撤消来放置一些不太频繁更新的信息(例如迷宫结构)。

相关问题