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

发布于 2024-11-26 05:00:46 字数 858 浏览 1 评论 0原文

我在 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 和; 定义了 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 非常陌生,我仍在尝试理解语言语义。 请建议一种有效的方法来解决这个问题。

I have a graph in Prolog represented by the edges & weights:

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).

I need to write a predicate which takes a list of nodes & distance.

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

I've tried to write it, but it is very clumsy & doesn't give the intended result.

The basic idea I have is:
If it is a list of 2 elements then see if they are connected.
If more then 2 elements in the list: see if the 1st element & 2nd element are connected,
recursively see if the next elements are connected.
I have defined 2 auxiliary predicates for head & tail.

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).

I am very new to Prolog land and I am still trying to comprehend the language semantics.
Please suggest an efficient way to go about this problem.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

罪歌 2024-12-03 05:00:46
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([_], 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.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文