我有此代码:
link(a,b,4).
link(a,c,2).
link(b,g,5).
link(c,g,6).
link(c,d,5).
link(d,g,3).
path(S,D,TDist):-
link(S,D,TDist).
path(S,D,TDist):-
link(S,X,TD1), path(X,D,TD2), TDist=TD1+TD2.
这将遵循深度优先的搜索策略,但结果是它将为我提供所有路径,并且不会显示最短的路径。是否仍然可以使用该策略并找到最短路径?如果没有,使用什么搜索策略?以及如何实现它。
答案 0 :(得分:1)
我认为您的代码有问题:
TDist=TD1+TD2
不会计算总和,至少在返回路径时才使用is / 2。
如果图形包含循环,它将循环,但是假设数据实际上是DAG,我们现在就可以忽略。
我们只能说它的值,不能说出实际的路径。
无论如何,可以使用library(aggregate)查找最短路径。例如
?- aggregate(min(D), path(a,g,D), D).
D = 8.
或者,由于gnu-prolog没有库(聚合),因此请使用setof / 3计算的第一个元素:
?- setof(D, path(a,g,D), [Min|Rest]).
Min = 8,
Rest = [9, 10].