我编写了一个Prolog程序,用于在无向图(或迷宫)中搜索路径。
pway(a, b,10).pway(b, e,10).pway(b, c,10).pway(d, e,10).pway(c, d,10).pway(e, f,10).pway(g, e,10).solve(X,X,T,N) :- write(T), N is 0. % do nothingsolve(X,Y,T,N) :- pway(X, Z,C), not(member(Z, T)), solve(Z, Y, [Z|T],M), N is M+C. % There is a pway from X to Z, new list has z as head.solve(X,Y,T,N) :- pway(Z, X,C), not(member(Z, T)), solve(Z, Y, [Z|T],M),N is M+C. % same, just takes care of non-directedness
我打算使用这个程序来进行如下查询:
?- solve(a,f,P,N).
即,给出从a到f的路径P及其成本。
但这并未按预期工作。当我输入(P预期是一个列表)
?- solve(e,b,P,N).false.
我得到false。(为什么?)
但是,当我输入:
?- solve(e,b,[],N).[b,e,f]N = 30 ;[b,c,d,e,f]N = 50 ;[b]N = 10 ;[b,e,d]N = 30 ;[b,c,d]N = 30 ;[b,e,g]N = 30 ;[b,c,d,e,g]N = 50 ;false.
我得到了结果。实际上,我从不希望在Prolog程序本身中使用write命令,我应该只通过输入第一个查询(返回false的那个)就能得到相同的结果。我无法找出错误所在。
任何帮助都将不胜感激。谢谢。
回答:
这是因为第三个参数并不是你所期望的#1和#2两个节点之间的路径。如果你在第三个参数中传递一个变量,那么目标not(member(Z, T))
总是会失败,因此solve/3
也会失败。
从你所说的话来看,你可能想要做的是这样的东西。
solve(X,Y,T,N) :- solve(X,Y,[],N,T).solve(X,X,T,0,T).solve(X,Y,T,N,O) :- pway(X, Z,C), \+ member(Z, T), solve(Z, Y, [Z|T],M,O), N is M+C.solve(X,Y,T,N,O) :- pway(Z, X,C), \+ member(Z, T), solve(Z, Y, [Z|T],M,O),N is M+C.