我在prolog中有以下代码来生成从一个节点到另一个节点的路径,但我无法在屏幕上看到我的结果。我只是得到 true 作为答案。最后一个变量名称不绑定到结果:
edge(a,b).
edge(b,d).
edge(b,c).
edge(c,d).
path(A,B,P):-
path_1(A,B,[A],P).
path_1(A,B,P,Path):- last_element(P,S),S=B.
path_1(A,B,P,Path):-
edge(A,X),\+member(X,P),append(P,[X],NewP),
path_1(X,B,NewP,NewP).
last_element([X],X).
last_element([H|T],X):-
last_element(T,X).
当我运行此代码时,我希望得到类似:K=[a,b,d]
等的内容:path(a,d,K)
但它没有出现。仅显示 true 。
想知道原因。感谢
答案 0 :(得分:1)
在您的代码中,Path
未在递归规则中更新。改变它:
path_1(A,B,P,Path):-
edge(A,X),\+member(X,P),append(P,[X],NewP),
path_1(X,B,NewP,P1), append([A], P1, Path).
运行良好:)
当显然有A-X边和X-B路时,A-B路径应为A + X-B路径。
答案 1 :(得分:0)
当P
中的path/3
变量被实例化时,Path
中的path_1/4
变量将被实例化。
但是,您永远不会在Path
中使用path_1/4
,因此变量不会与您观察到的结果绑定
由于您使用swi-prolog,您应该收到类似“Singleton variables:[Path]”的警告 虽然有时可以忽略这样的警告,但大多数情况下你的代码不能像预期的那样工作