2013-09-27 48 views
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]。

请帮助解决我的问题。

回答

0

库(aggregate)允许在最小/最大标量运算上使用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)). 

注有在边缘的错字/ 3:edge(b,e,16应该edge(b,e,16).

一旦纠正了DB,我得到

pravilo(a,z,M,P). 
M = 16, 
P = [a, b, h, c, z].