【发布时间】:2014-02-05 08:24:50
【问题描述】:
我对 Prolog 很陌生。我在graph.pl中定义了下图:
这是我的 Prolog 代码:
edge(a,e).
edge(e,d).
edge(d,c).
edge(c,b).
edge(b,a).
edge(d,a).
edge(e,c).
edge(f,b).
path(X,X).
path(X,Y):- edge(X,Z) ; path(Z,Y).
我是这样理解的:只有在顶点X和顶点Z之间有一条边并且顶点@之间有一条路径时,顶点X和顶点Y之间才有一条路径987654329@ 和顶点Y(某种递归)。
对于所呈现的图表是否正确?当我向 Prolog 询问顶点 A 和顶点 F 之间的路径时,它给了我 true ......这甚至都不对!这段代码可能有什么问题?
【问题讨论】:
-
;是 OR。,是 AND。所以你的path子句不正确。 -
@mbratch:当我将
;更改为,时,Prolog 闲逛...没有回答。对于我的图表,答案应该是错误/否。 -
;仍然不正确,必须是,。另一个问题是代码不处理电路中的路径问题,因此它可以在电路中循环,直到堆栈溢出,然后才能找到解决方案。您需要收集“您去过的地方”的列表,以确保您不会重复路径。 -
@mbratch:好的,谢谢,现在说得通了。但是,我的图表的适当规则应该是什么样子?
-
一种方法是让您的规则收集您走过的边缘列表,如果您已经去过那里,则不要选择它们。如果你用谷歌搜索“prolog graph”,你会在网上找到几个例子,这些例子都清楚地说明了这个问题,比如csupomona.edu/~jrfisher/www/prolog_tutorial/2_15.html。
标签: prolog graph-theory transitive-closure