Prolog代码不起作用

时间:2012-01-17 15:07:14

标签: prolog

我在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

想知道原因。感谢

2 个答案:

答案 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]”的警告 虽然有时可以忽略这样的警告,但大多数情况下你的代码不能像预期的那样工作