Algorithm prolog中的路径查找

Algorithm prolog中的路径查找,algorithm,prolog,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

我需要在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.

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

这是因为您的两个函数都是相同的,我认为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).

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

这是因为您的两个函数都是相同的,我认为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).

它只需要两个变量,我想这应该可以解决你的问题。

当我在SWI Prolog中尝试这个时,我在第二种情况下得到一个false。这是因为原子的名称,我已经更正了。很抱歉,当我在SWI Prolog中尝试这个时,我在第二种情况下得到一个false。这是因为原子的名称,我已经更正了我很抱歉