【问题标题】:Swi prolog finding all the neighbours of a nod in a directed graphSwi prolog 在有向图中查找节点的所有邻居
【发布时间】:2013-05-14 20:38:11
【问题描述】:

我有一个像这样表示的有向图:

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) 是一个谓词,如果在 L 中找到 Y,则返回 true。
例如,当我运行road(1,[],L). 时,结果是L=[2],这是正常的,因为谓词写得不好。
当我尝试使用递归来实现时,我不知道该把什么作为递归的正确停止,我希望你能理解我想说的话。
我尝试了另一种使用失败的方法,但也没有用,我现在不记得我是怎么做到的了。
我希望有人能快速提出解决方案:),在此先感谢。

【问题讨论】:

  • 您介意输入任何尝试的代码吗?

标签: prolog graph-theory


【解决方案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).

【讨论】:

  • 非常感谢您的回答,我之前尝试过findall功能但是我用错了。
猜你喜欢
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2010-10-27
相关资源
最近更新 更多