2012-01-17 32 views
1

我在序言中有以下代码来产生从一个节点到另一个节点的路径,但我无法在屏幕上看到我的结果。我只是得到true作为答案。最后一个变量名称不绑定到的结果:Prolog代码不工作

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

尝试'trace'。这会有很大的帮助。 – 0605002 2012-01-17 15:19:20

+0

我已追溯到sooo时间,但无法找到它 – 2012-01-17 15:20:39

回答

0

path/3中的P变量将在实例化path_1/4中的Path变量时被实例化。
但是,你永远在path_1/4使用Path,因此当你观察

由于您使用SWI-序言你应该得到这样的“变量辛格尔顿:[路径]”警告变量不绑定到的结果。
虽然有时它是确定忽略这样的警告,大部分代码是行不通的时代,你预期

+0

感谢您的回复。我想在这里理解一些东西。 path_1/4中的最后一行是path_1(X,B,NewP,NewP),所以我认为“Path”被NewP中的值替换,所以它必须工作。你能向我解释一下为什么不是这样。谢谢。你说的是对的,但我希望你能帮助我,为什么我的想法是错误的 – 2012-01-17 15:28:25

+0

'path_1/4'的第一个子句应该将'Path'绑定到'P'。 – twinterer 2012-01-17 15:34:38

+0

好的我已经完成了这个:path_1(A,B,P,Path): - last_element(P,S),S = B,Path = P。但仍然得到相同的“真实”。 Path = P是否错误? – 2012-01-17 15:40:27

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路径。

+0

我认为你的最后一行应该追加(NewP,[X],Path)。虽然它还没有和我一起工作。我不知道为什么 – 2012-01-17 16:35:33

+0

更新:)现在它应该工作。 – 0605002 2012-01-17 16:37:49

+0

@Eddy Freeman它工作正确吗? – 0605002 2012-01-18 20:35:21