我正在写一条规则,即从循环图中的一个节点到目的地。为了做到这一点,我需要规则来记住访问过的节点在图表中的移动。我的问题是我希望能够像这样调用它:
?- 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是一个变量而不是一个列表。有没有解决方法,或者我的想法是错误的?
答案 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)
.