【问题标题】:What is the execution order of recursive datalog?递归数据日志的执行顺序是什么?
【发布时间】:2020-03-03 05:22:03
【问题描述】:
Q(a, b) :- Edge(a, b).
Q(a, b) :- Q(a, x),
            Edge(x, b).

这段代码的作用是搜索所有可达的节点对。那是如何递归的?

【问题讨论】:

  • 那是一些奇怪的数据记录——谓词名是大写的,变量名是小写的。这怎么可能?

标签: recursion datalog


【解决方案1】:

这是递归的,因为谓词调用自己:

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).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2019-12-20
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多