gpt4 book ai didi

optimization - 在 Prolog 中查找连接到顶点的所有节点

转载 作者:行者123 更新时间:2023-12-04 00:51:48 24 4
gpt4 key购买 nike

我对寻路算法很好奇,所以我看了一下 Dijkstra 的。我正在使用 this视频作为指南(这就是我的图表的基础)。这是我正在使用的图表:

Image

我现在希望能够找到给定顶点的所有连接。我认为我应该为此使用 findall,我试图在下面的 all_connections 目标中使用它。但是,对于 main,我的输出是 [b,b,b,b]。为什么会这样?这是没有意义的。如果您明白我做错了什么,请告诉我。

connection(s, c, 3).
connection(c, l, 2).
connection(l, i, 4).
connection(l, j, 4).
connection(i, j, 6).
connection(i, k, 4).
connection(j, k, 4).
connection(k, e, 5).
connection(e, g, 2).
connection(g, h, 2).
connection(h, f, 3).
connection(f, d, 5).
connection(d, a, 4).
connection(b, d, 4).
connection(b, a, 3).
connection(b, s, 2).
connection(b, h, 1).
connection(a, s, 7).

are_connected(A, B, Score) :-
connection(A, B, Score);
connection(B, A, Score).

all_connections(A, Z) :-
findall(A, are_connected(A, _, _), Z).

main :-
all_connections(b, X),
write(X).

最佳答案

恭喜您解决了问题。如果您将解决方案作为答案发布,我们可以对其进行投票。

这是对其他事情的评论:由于您是一个相对初学者,现在是学习良好编码约定的最佳时机。具体来说,这个:

are_connected(A, B, Score) :-
connection(A, B, Score);
connection(B, A, Score).

非常糟糕。 Prolog 的析取是一个非常强大但常常令人困惑的工具。当您使用它时,使用应该真正突出。否则很容易将您的代码误认为是:

are_connected(A, B, Score) :-
connection(A, B, Score),
connection(B, A, Score).

按照您的写法,分号很容易在行尾遗漏。经验法则:永远不要在行尾使用 ;

备选方案:

are_connected(A, B, Score) :-
connection(A, B, Score).
are_connected(A, B, Score) :-
connection(B, A, Score).

(此转换仅在您定义的整个主体是析取时才有效。)

are_connected(A, B, Score) :-
( connection(A, B, Score)
; connection(B, A, Score) ).

或者:

are_connected(A, B, Score) :-
(
connection(A, B, Score)
;
connection(B, A, Score)
).

你明白了。这些变体中的每一个都清楚地表明您正在做的事情与使用连词非常不同

关于optimization - 在 Prolog 中查找连接到顶点的所有节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65739011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com