1

解决方案

ppath(X,Y,M,Path,[Y|Path]) :- edge(X,Y,M),\+ memberchk(Y,Path).
path(X,Y,P,SoFar,Path) :- edge(X,W,M), \+ memberchk(W,SoFar),
    path(W,Y,N,[W|SoFar],Path), P is M+N.
 pravilo(X,Y,Z) :-
    aggregate(min(W), P^path(X,Y,W,[],P),Z).

这是我的代码。问题是起点是a,终点是z。

执行后出现错误,结果显示为[z, c, h, b]。但正确答案应该是 [a,b,c,z]。

请帮助解决我的问题。

4

1 回答 1

0

库(聚合)允许witness最小/最大标量操作。我们可以使用该功能来报告路径和行程长度:

path(X,Y,M,Path,FullPath) :-
    edge(X,Y,M), \+ memberchk(Y,Path),
    reverse([Y|Path], FullPath).
path(X,Y,P,SoFar,Path) :-
    edge(X,W,M), \+ memberchk(W,SoFar),
    path(W,Y,N,[W|SoFar],Path), P is M+N.

pravilo(X,Y,Z,Path) :-
    aggregate(min(W,P), P^path(X,Y,W,[X],P), min(Z,Path)).

请注意 edge/3: edge(b,e,16should be有一个错字edge(b,e,16).

一旦更正了数据库,我得到

pravilo(a,z,M,P).
M = 16,
P = [a, b, h, c, z].
于 2013-09-27T08:02:57.850 回答