2012-05-15 55 views
0

我想要做的是找到一些路线和一些安全区域。我做了一些研究,我已经知道我必须添加一个基本步骤和递归步骤。我已经实施了,但当我不得不转移时它不起作用。所以如果它是邻居,它是有效的,但不是。在prolog中规划一条路线

这是我有:

p(zwolle,apeldoor,36). 
p(apeldoorn,zutphen,22). 
p(hengelo,zwolle,60). 
p(zutphen,hengelo,45). 
p(arnhem,apeldoorn,30). 
p(arnhem,zutphen,24). 


%basic step 
route(Begin,End,PastCitys):- 
     not(member(End,PastCitys)), 
    p(Begin,End,_). 

%recursief 
route(Begin,End,PastCitys):- 
    p(Begin,Stepover,_), 
     not(member(Stepover,PastCitys)), 
    route(Stepover,End). 

plan(Begin,End):- 
    route(Begin,End,[Begin]). 

任何帮助是值得欢迎

回答

0

这里有复杂的升序李树斌提示:

  1. 你拼错“阿珀尔多伦”一次,所以明显的测试route(zwolle,apeldoorn)纯粹是因为这一点。
  2. 你需要表达一个事实,即相邻性是对称的,这样你就可以找到一条从A到B的路线,无论这个事实是以某种方式表达的。
  3. 即使存在路线,您仍然可以在发现路线之前进入无限循环的无限循环。为此,您需要一个“发生检查”,以防止您在进行递归步骤时进入周期。
+0

所以我已经添加了一张支票,但仍然不起作用,我知道它不是双向的。但那是为了以后。 你有什么可以帮助我吗? –

+0

这两个改变实际上就是你和成功之间的一切。如果您得到错误的答案,请跟踪电话并比较您所期望的情况。如果您无法弄清楚有什么不同,请编辑您的问题并发布示例。 –

+0

@JorneDeBlaere不要忘记谓词'route'应该有三个属性,而它在递归子句中似乎有两个。 –

0

我想你需要看看Floyd-Warshall algorithm。只需使用Prolog进行编码即可。递归和访问节点列表的方法并不是最优的(参见Richard O'Keefe,“The Prism of Prolog”,第5.4章)。但是通常warshall算法已经存在于一个图形操作库中,您需要研究如何使用它。

+0

谢谢,我要弄清楚。非常有帮助! –