我对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
和顶点Y
之间存在边并且顶点Z
和顶点Y
之间存在路径时,才存在顶点X
和顶点Y
之间的路径(一种递归)。
对于给出的图来说,这样理解是否正确?当我询问Prolog关于顶点A
和顶点F
之间的路径时,它给出了true
……这甚至都不正确!在这段代码中可能有什么问题呢?
;
表示“或者”,,
表示“并且”。因此,您的path
子句不正确。 - lurker;
改为,
时,Prolog 卡住了...没有给出答案。对于我的图形,答案应该是 false/no。 - yak;
是错误的,必须改为,
。另一个问题是代码不能处理在闭环路径上的情况,所以它可能会在解决问题之前一直在闭环路径上转圈,直到栈溢出。您需要收集“已经走过的路径”的列表,以确保不重复走相同的路径。 - lurker