在prolog中查找图节点之间的距离

Posted

技术标签:

【中文标题】在prolog中查找图节点之间的距离【英文标题】:Finding distance between nodes of a graph in prolog 【发布时间】:2011-10-12 05:22:54 【问题描述】:

我在 Prolog 中有一个由边和权重表示的图表:

connected(a,b,2).
connected(b,e,1).
connected(b,l,5).
connected(b,g,2).
connected(c,s,2).
connected(d,a,2).
connected(d,k,4).
connected(d,l,7).
connected(e,m,2).

我需要编写一个谓词,它需要一个节点列表和距离。

?- dist([a,b,e],X).
X=3

我试过写它,但它非常笨拙并且没有给出预期的结果。

我的基本想法是: 如果它是 2 个元素的列表,则查看它们是否已连接。 如果列表中有超过 2 个元素:查看第一个元素和第二个元素是否连接, 递归查看下一个元素是否已连接。 我已经为 head & tail 定义了 2 个辅助谓词。

dist([A, B], X) :-
    connected(A, B, X).
dist([A|B], Length) :-
    connected(A, hd(B,H,N), X),  % sees if A & next element in the list are connected
    dist(tl(B,H,N), Length1),    % recursive call with the list excluding element A
    Length is X + Length1.       

hd([H|T],H,Q).
tl([H|T],T,Q).

我对 Prolog 领域非常陌生,我仍在尝试理解语言语义。 请提出解决此问题的有效方法。

【问题讨论】:

hdtl 谓词对我来说没有意义。参数Q 没有被使用,所以它什么也不做。而且谓词不返回值,所以你不能写像connected(A, hd(B,H,N), X) 这样的东西。或者更确切地说,你可以,但这并不意味着你的想法。 我试图使用 tail 来表示第一个元素之后的列表的其余部分。在您的回答中,您将列表表示为 '[A, B | T]'。相反,我试图通过使用 head 来获得 B。 hd函数中的Q是返回head的值。我知道这一切都很笨拙:(希望学得更快,做事的逻辑编程方式。 【参考方案1】:
dist([_], 0).            % path of length 0 has distance 0
dist([A, B | T], L) :-
    connected(A, B, L1), % A and B are connected directly, the distance is L1
    dist([B|T], L2),     % the distance between B and the last element is L2
    L is L1 + L2.

【讨论】:

这里在dist([B|T], L2)中,自动传递B之后的元素?它是如何工作的? 好的,我认为谓词 dist 递归直到基本情况..在第二次递归中,“dist([B|T], L2)”中的 B 代替了“dist”中的 A ([A, B | T], L) :- " 并且它的下一个元素代替 B 等直到基本情况。 [B|T] 表示以元素 B 和尾部 T 开头的路径/列表(也是元素列表)。因此,整个 dist([B|T], L2) 是一个子目标,它试图找到长度为 L2 的 [B|T] 形式的路径。 @svick & @prusswan ,我有点明白你的意思。我正在尝试做同样的事情,但有两个节点列表。也就是说,?- distlist[[a,b,e],[b,d,l],X). X=[3,12] 我遵循相同的逻辑,但我无法弄清楚如何将长度作为列表获取。如果我在这里发布代码,它看起来格式错误。我应该发布问题的答案还是在此处自行发布? @RBK,您可能应该为此提出一个新问题。

以上是关于在prolog中查找图节点之间的距离的主要内容,如果未能解决你的问题,请参考以下文章

在 Prolog 中的 is_a() 树中查找叶节点

尝试使用networkx查找两个节点之间的距离(欧几里得)

在node.js中查找两个地理点(lats,longs)之间距离的最佳方法

算法图解:广度优先搜索

《算法图解》3

算法丨广度优先搜索