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中定义图:边和路径,查找两个顶点之间是不是有路径

在 Prolog 中的 is_a() 树中查找叶节点

Prolog中的反向查找? (我如何找到关于 X 的所有真实情况?)

Prolog 中的递归 - 寻找城市之间的路径

Prolog:如何调整跟踪中显示的列表的最大长度?

列表替换中的 Prolog 元素