Prolog:在递归变量时列出一个列表

时间:2016-05-11 09:29:40

标签: recursion prolog

我正在写一条规则,即从循环图中的一个节点到目的地。为了做到这一点,我需要规则来记住访问过的节点在图表中的移动。我的问题是我希望能够像这样调用它:

?- routeToDestination(startNode, destinationNode, Path)

并获取存储在Path变量中的图形的路径。当我尝试在Path变量中追加节点时,我遇到了一些问题,因为它没有作为列表启动。到目前为止,我的规则看起来像这样:

routeToDestination(Destination, Destination, Path).
routeToDestination(Origin, Destination, Path):-
    link(Origin, Via),
    \+ visited(Via, Path),
    appendEnd(Path, Via, Result),
    routeToDestination(Via, Destination, Result).

这里的链接是一些事实,告诉我们哪里有来自Via的连接(即我检查我可以从哪个节点通过Via),访问检查该元素是否已经在路径中(不想访问两次) ),appendEnd是典型的追加函数(http://www.doc.gold.ac.uk/~mas02gw/prolog_tutorial/prologpages/lists.html):

append([],List,List).
append([Head|Tail],List2,[Head|Result]):-
    append(Tail,List2,Result).

每当我尝试进行调用时,它看起来像append函数失败,因为Path是一个变量而不是一个列表。有没有解决方法,或者我的想法是错误的?

1 个答案:

答案 0 :(得分:0)

Prolog中一个非常常见的习惯用法是使用 helper 谓词,它带有一个或多个为你维护状态的附加参数。通常,这样的帮助者将具有相同的名称和不同的arity。

在该模式下,给定一个有向图定义的有向图:

link(a,b).
link(a,c).
link(b,d).
link(d,a).

一个人可能会如此遍历它:

connected( A , B , P ) :-
  setof(X,link(X,_),As) ,
  member(A,As) ,
  connected(A,B,[],P) ,
  .

connected( B , B , V , P ) :-
  reverse(V,P)
  .
connected( A , B , V , P ) :-
  link(A,X) ,
  \+ member(X,V) ,
  connected(X,B,[A|V],P)
  .