我需要在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。我该如何解决这个问题?
答案 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).
它只会期望两个变量,我认为这应该可以解决您的问题。