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

标签 optimization prolog dijkstra path-finding logic-programming

我对寻路算法很好奇,所以我看了一下 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/

相关文章:

mysql - 为什么 innodb 缓冲池内存在命令 "optimize table"之后增长?

PHP Laravel Facade __callStatic 参数列表

list - 将矩阵分解为序言中第一个元素的列表和剩余元素的子列表

c++ - 如何从最小堆 C++ 中释放内存

algorithm - 如何通过虚线(车站)路径找到路径,例如地铁 map

algorithm - 分支定界(+扩展列表)与 Dijkstra 图算法之间的区别

c - STM32 VCP驱动——只有优化后指针才会失效

c# - .Net Core 3.1 中的 IEnumerable.OrderBy().First() 优化是否记录在任何地方?

返回 prolog-false 而不是数字

prolog - 简单的 Prolog 生成器