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.
我编写了一个序言程序来在无向图(或迷宫)中搜索路径。
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.