我在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个以上的元素:看第1个元素和&第二个元素连接, 以递归方式查看下一个元素是否已连接。 我为head& amp;定义了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的新手,我仍在努力理解语言语义。 请提出一个解决此问题的有效方法。
答案 0 :(得分:6)
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.