2012-11-30 154 views
1

我需要在序言写一个程序寻找路径,例如,对于图:路径寻找在序言

edge(a, b). 
edge(a, c). 
edge(c, b). 

和测试用例是:

/* test case 1 */ 
?- path(a, b, P). 
P = [a, b] ; 
P = [a, c, b] ; 
false. 

/* test case 2 */ 
?- path(c,b,[c,b]). 
true. 

和我的代码是

path(X,Y,[X,Y]):- 
    edge(X,Y). 
path(X,Z,[X|P]):- 
    edge(X,Y), 
    path(Y,Z,P). 

然而,测试用例2,我的代码会显示

?- path(c,b,[c,b]). 
true; 
false. 

我知道我应该在我的代码中添加一个剪辑以删除案例2中的错误,但它也会删除案例1中的错误。我怎么解决这个问题?

+0

当我在SWI-Prolog中尝试这个时,我在第二种情况下得到一个错误。 – RonaldBarzell

+1

这是因为原子的名称,我有正确的。对于那个很抱歉 –

回答

1

这是因为你的两个函数都是一样的,我认为prolog检查两者......在第一种情况下它失败,因为只有一个函数满足它,即路径(c,b,P),但在第二种情况下,路径为 path (C,b,[C,b]

它同时检查功能

path(X,Y,[X|P] here X = c and P = b 
and 
path(X,Y,[X,Y]) here also X=c and Y = b 

使两者的功能作用在您需要修改例如您的案件之一 第二种情况相同:只有2个顶点可以使用

path(X,Y,[X|Y|[]]):- edge(X,Y). 

代替

path(X,Y,[X,Y]):- 
edge(X,Y). 

会想到只有两个变量,我想这应该解决您的问题。