Prolog 程序的意外行为

Unexpected Behavior of Prolog program

我编写了一个序言程序来在无向图(或迷宫)中搜索路径。

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 nothing
solve(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. 

我错了。 (为什么??)

但是,当我输入:

?- 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),我就应该得到相同的结果。 我无法识别错误。

感谢任何帮助。谢谢

这是因为#3 参数不是您预期的#1 和#2 中两个节点之间的路径。如果您在 #3 中传递一个变量,目标 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.