【发布时间】: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 领域非常陌生,我仍在尝试理解语言语义。 请提出解决此问题的有效方法。
【问题讨论】:
-
hd和tl谓词对我来说没有意义。参数Q没有被使用,所以它什么也不做。而且谓词不返回值,所以你不能写像connected(A, hd(B,H,N), X)这样的东西。或者更确切地说,你可以,但这并不意味着你的想法。 -
我试图使用 tail 来表示第一个元素之后的列表的其余部分。在您的回答中,您将列表表示为 '[A, B | T]'。相反,我试图通过使用 head 来获得 B。 hd函数中的Q是返回head的值。我知道这一切都很笨拙:(希望学得更快,做事的逻辑编程方式。
标签: prolog graph-theory