【发布时间】:2020-03-03 05:22:03
【问题描述】:
Q(a, b) :- Edge(a, b).
Q(a, b) :- Q(a, x),
Edge(x, b).
这段代码的作用是搜索所有可达的节点对。那是如何递归的?
【问题讨论】:
-
那是一些奇怪的数据记录——谓词名是大写的,变量名是小写的。这怎么可能?
Q(a, b) :- Edge(a, b).
Q(a, b) :- Q(a, x),
Edge(x, b).
这段代码的作用是搜索所有可达的节点对。那是如何递归的?
【问题讨论】:
这是递归的,因为谓词调用自己:
q(A, B) :- q(A, X),edge(X, B).
实际的执行顺序取决于实现。它可能是“自下而上”:
edge(A,B) 派生q(A,B)
q(A, B) :- q(A, X),edge(X, B).,直到达到一个固定点(即不能进一步推导出q(A,B))。不过,与 Prolog 不同,您应该能够重新排列代码而不会产生非终止搜索的风险。
这应该也可以:
q(A, B) :- q(A, X),edge(X, B).
q(A, B) :- edge(A, B).
【讨论】: