Findall与Pacman网络标志游戏列表



我是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),Decision是Pacman选择的输出
第一个findall应该给我所有没有鬼魂和不危险的方向(Dir),并将它们保存在一个名为L的列表中。
第二个findall,我希望它能给我所有有小球的方向,并将它们保存在一个名为T的列表中。
我的问题是,这个findall是否正确,因为我的代码由于某种原因无法工作,我认为这可能是第二个findall的原因
谢谢你帮我:)。

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

当然,如果没有所有的代码,就不可能回答你的问题。而且,即使有了所有可用的代码,您也可能得不到什么帮助,因为程序的structure似乎比建议的更复杂。

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

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

简单的老Prolog"only"有复合术语:您的代码应该是

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

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

SWI Prolog现在有dict,任何Prolog都可以让您使用DCG来降低代码的复杂性。请参阅Markus Triska的此页面,查找"隐含传递状态"。

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

相关内容

  • 没有找到相关文章

最新更新