prolog中的路径查找
Posted
技术标签:
【中文标题】prolog中的路径查找【英文标题】:path finding in prolog 【发布时间】:2012-11-18 20:47:05 【问题描述】:我需要在 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 中的错误,但它也会删除案例 1 中的错误。我该如何解决这个问题?
【问题讨论】:
当我在 SWI-Prolog 中尝试这个时,我在第二种情况下得到一个错误。 这是因为原子的名称,我已经更正了。对此感到抱歉 【参考方案1】:这是因为你的两个函数都是相同的,我认为 prolog 会检查这两个......在第一种情况下它失败了,因为只有一个函数满足它,即 path(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中的路径查找的主要内容,如果未能解决你的问题,请参考以下文章
Prolog中定义图:边和路径,查找两个顶点之间是不是有路径