prolog - Prolog中发生检查的最坏情况是什么?
问题描述
许多论文确实指出,如下所示的等式统一问题可能在指数时间内运行,当occurs_check=true
. 没有规定这是顶级查询或子句主体,它只是等式统一问题:
X1 = f(X0, X0),
X2 = f(X1, X1),
..
Xn-1 = f(Xn-2, Xn-2),
Xn = f(Xn-1, Xn-1).
如果为真,这可能是发生检查的最坏情况,因为正常的变量共享统一是线性的。是否每个 Prolog 系统都必须将这个方程统一问题作为最坏的情况?
如果 Prolog 系统没有occurs_check=true
标志,可以尝试unify_with_occurs_check/2
代替(=)/2
.
解决方案
这是一个比较。我在子句主体内测试了等式统一问题。链接到测试的源代码和基准测试结果在这个答案的末尾:
test :-
B = f(A, A),
C = f(B, B),
D = f(C, C),
X = f(D, D).
Etc..
Jekejeke Prolog 1.4.6 和 SWI-Prolog 8.3.17 仍然是线性的。Jekejeke Prolog 使用静态分析,并不总是有效。SWI-Prolog 是动态执行的,我猜是处理循环项的副作用。但是 GNU Prolog 1.4.5 是指数级的。我使用的是 n=4、6、8 和 10:
开源:
线性还是指数?
https://gist.github.com/jburse/2d5fd1d3dd8436acceca52fdfc537581#file-size-pl
推荐阅读
- javascript - 多个堆叠模式 bs3 中的 ESC 键错误
- string - String.contains() 的时间复杂度
- mysql - 使用 Using temporary 解释 mysql 性能中的计划;使用文件排序;使用索引条件
- java - 由于数组上有额外的空格,JUnit AsserEquals() 失败
- sql - MS Access 2007 从不同的表中提取数据记录以自动填充字段
- angularjs - AngularJS - 查看退格键或删除键删除了哪个字符而不进行比较
- git - 如何使用来自 GitHub 的部署密钥下载单个原始文件?
- gcloud - gcloud 命令检查项目是否存在
- string - Python 3 查找所有重叠匹配
- python - 在散景服务器中选择线条颜色