在prolog中寻找路径

时间:2012-11-30 15:47:18

标签: algorithm prolog

我需要在prolog中编写一个程序来查找路径,例如图表:

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.

我知道我应该在我的代码中添加一个cut来删除case 2中的false,但它也会在case 1中删除false。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

因为你的两个函数是相同的,我认为prolog检查两个....在第一种情况下它失败,因为只有一个函数满足它,即路径(c,b,P),但在第二种情况下    路径(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).

它只会期望两个变量,我认为这应该可以解决您的问题。