我有以下图表数据库:
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).下面是理解输出的代码,如下所示:
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).预期结果:
?-find_paths(v1, v4).
v1 -> v3 : 5
v3 -> v4 : 15
Total : 20
v1 -> v4 : 13
Total : 13我很难显示出想要的结果。
发布于 2021-12-07 17:05:45
因此,看起来您的程序按需要运行,只有输出“坏了”。如果更改了ouput谓词,您就可以了,例如:
printPath([_]).
printPath([X,Y|T]) :-
edge(X,Y,V),
write(X), write(' -> '), write(Y), write(" : "), writeln(V),
printPath([Y|T]).现在,如果路径中的单个节点总是被打印成一对节点以及它们的权重。要获得示例的确切顺序,您必须重写搜索例程。
用SWISH测试(也删除了一个nl,而不是使用writef/2):
?- find_paths(v1, v4).
v1 -> v4 : 13
Total: 13
v1 -> v3 : 5
v3 -> v4 : 15
Total: 20
false.https://stackoverflow.com/questions/70209467
复制相似问题