首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找所有路径,并将图中每条路径的长度之和

查找所有路径,并将图中每条路径的长度之和
EN

Stack Overflow用户
提问于 2021-12-03 04:15:14
回答 1查看 134关注 0票数 0

我有以下图表数据库:

代码语言:javascript
复制
edge(v1, v2, 3).
edge(v1, v3, 5).
edge(v1, v4, 13).
edge(v1, v6, 25).
edge(v1, v7, 5).
edge(v2, v7, 17).
edge(v3, v4, 15).
edge(v4, v2, 4).
edge(v4, v6, 2).
edge(v7, v6, 15).

下面是理解输出的代码,如下所示:

代码语言:javascript
复制
path(A, B, [A, B], X) :- edge(A, B, X).
path(A, B, PathAB, Length) :-
    edge(A, C, X),
    path(C, B, PathCB, LengthCB),
    PathAB = [A | PathCB],
    Length is X + LengthCB.
find_paths(A, B) :-
    path(A, B, Path, Length),
    printPath(Path), nl,
    writef(' Total: %d', [Length]), nl,
    fail.
printPath([]).
printPath([X]) :- !, write(X).
printPath([X|T]) :- write(X), write(' -> '), printPath(T).

预期结果:

代码语言:javascript
复制
?-find_paths(v1, v4). 
v1 -> v3 : 5
v3 -> v4 : 15 
Total : 20 
v1 -> v4 : 13
Total : 13

我很难显示出想要的结果。

EN

回答 1

Stack Overflow用户

发布于 2021-12-07 17:05:45

因此,看起来您的程序按需要运行,只有输出“坏了”。如果更改了ouput谓词,您就可以了,例如:

代码语言:javascript
复制
printPath([_]).
printPath([X,Y|T]) :-  
    edge(X,Y,V), 
    write(X), write(' -> '), write(Y), write(" : "), writeln(V),
    printPath([Y|T]).

现在,如果路径中的单个节点总是被打印成一对节点以及它们的权重。要获得示例的确切顺序,您必须重写搜索例程。

用SWISH测试(也删除了一个nl,而不是使用writef/2):

代码语言:javascript
复制
?- find_paths(v1, v4).
v1 -> v4 : 13
Total: 13
v1 -> v3 : 5
v3 -> v4 : 15
Total: 20
false.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70209467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档