Swi prolog在有向图中找到点头的所有邻居

时间:2013-05-14 20:38:11

标签: graph prolog

我有一个如下所示的有向图:

arc(1, 2).
arc(1, 4).
arc(1, 5).
arc(3, 2).
arc(3, 7).
arc(4, 3).
arc(5, 6).
arc(6, 8).
arc(7, 6).
arc(9, 8).

我需要的是一个谓词,它将把我可以从特定节点转到的所有节点放在一个列表中。例如,对于节点1,结果列表应为L=[2,4,5],因为从1开始我可以转到2,4和5.无论如何完成,重要的是结果,节点必须在一个列表。 我曾试图以两种方式做到这一点,但失败了。

我尝试这样做的一个例子:

road(X,L,L2):- arc(X,Y), not(belong(Y,L)), append(L,[Y],L2), road(X,L2,_).   
road(X,L,L).  

belong(Y,L)是一个谓词,如果在Y内找到L,则返回true。
例如,当我运行road(1,[],L).时,结果为L=[2],这是正常的,因为谓词写得不好。
当我尝试使用递归时,我不知道该放置什么作为递归的正确停止,我希望你理解我想说的话。
我尝试了另一种使用失败的方式,但这种做法既不起作用,我现在也不记得我是怎么做到的 我希望有人可以快速提供解决方案:),提前谢谢。

1 个答案:

答案 0 :(得分:1)

您的代码需要相当多的更正:这是一个有效的版本。

road(X,L,L2) :- arc(X,Y), \+ memberchk(Y,L), !, road(X,[Y|L],L2).
road(_,L,L).

必须以这种方式调用它并将“返回”反向列表

?- road(1,[],L).
L = [5, 4, 2] .

但使用内置更容易,更有效:

?- findall(Y, arc(1,Y), L).