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

Bha*_*rat 2 graph prolog

我在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).
Run Code Online (Sandbox Code Playgroud)

我需要编写一个带有节点和距离列表的谓词.

?- dist([a,b,e],X).
X=3
Run Code Online (Sandbox Code Playgroud)

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

我的基本想法是:如果它是2个元素的列表,那么看看它们是否已连接.如果列表中有多于2个元素:查看第一个元素和第二个元素是否已连接,则递归查看下一个元素是否已连接.我已经为头部和尾部定义了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).
Run Code Online (Sandbox Code Playgroud)

我是Prolog的新手,我仍然想要理解语言语义.请建议一个有效的方法来解决这个问题.

svi*_*ick 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.
Run Code Online (Sandbox Code Playgroud)