0

我想做的是找到一条有一些 givin facs 的路线。我做了一些研究,我已经知道我必须添加一个基本步骤和递归步骤。我已经实现了,但是当我必须转移时它不起作用。因此,如果它是邻居,它可以工作,但不是。

这就是我所拥有的:

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]).

欢迎任何帮助

4

2 回答 2

0

以下是按复杂性升序排列的三个提示:

  1. 您曾经拼错过一次“apeldoorn”,因此明显的测试route(zwolle,apeldoorn)并不能仅仅因为这个而起作用。
  2. 您需要表达邻居是对称的事实,以便您可以找到从 A 到 B 的路线,无论该事实是用一种方式表达还是另一种表达方式。
  3. 即使存在一条路线,在找到一条路线之前,您仍然可以通过输入不幸进入无限循环。为此,您需要一个“发生检查”,以防止您在执行递归步骤时进入循环。
于 2012-05-15T13:17:18.310 回答
0

我认为您需要查看Floyd-Warshall 算法。只需使用 Prolog 对其进行编码。具有递归和访问节点列表的方法根本不是最优的(参见 Richard O'Keefe,“Prolog 的工艺”,第 5.4 章)。但是通常warshall算法已经存在于图形操作库中,您需要学习如何使用它。

于 2012-05-15T22:42:17.693 回答