recursion - 递归数据记录的执行顺序是什么?
问题描述
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).
推荐阅读
- java - 如何从纪元微秒或纳秒创建 Java Instant?
- split - 使用 XSLT 基于标签拆分 XML 文件
- java - 检查字符串是否仅包含特定数字(例如“111”)
- tensorflow - 如何使用多个 model_spec 创建单个 PredictRequest()?
- r - 是否可以通过以括号格式指示变量名称来使用“汇总”功能?
- angular - 自定义组件未正确加载到 mat-tab(角度材料)中
- java - 是否有一个 json 简单函数可以从 jsonobject 获取所有键?
- graphql - Graphql 获取 2 个标签之间的所有提交
- nlp - RASA NLU-我想在单词之后提取任何内容(单词、数字或特殊字符)作为实体
- php - 用于匹配查询字符串中的模式的正则表达式