作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:此问题假设您启用了发生检查。不是关于 setting Prolog flags .
30 年前有很多关于在安全的情况下自动优化发生检查的论文(大约 90% 的谓词,在典型的代码库中)。提出了不同的算法。现代 Prolog 编译器(例如 SWI Prolog)会做类似的事情吗(当发生检查打开时)?他们喜欢什么算法?
例如,他们是否会在编译这样的谓词时删除发生检查:
less(0, s(_)).
less(s(X), s(Y)) :- less(X, Y).
(来自下面的讨论
this answer )
最佳答案
当发生检查标志设置为“真”时,有多种优化可以优化发生检查。这对于在常见情况下使声音统一可行是必要的。典型的优化是检测磁头的线性度:
linear(Head) :-
term_variables(Head, Vars),
term_singletons(Head, Singletons),
Vars == Singletons.
在这种情况下,调用子句时可以省略发生检查。我们可以对
less/2
进行测试例如头部是否是线性的。事实证明,两个头都是线性的:
?- linear(less(0, s(_))).
true.
?- linear(less(s(X), s(Y))).
true.
因此,Prolog 系统可以完全省略谓词
less/2
的发生检查。并产生良好的统一。例如,在检查中间代码时,可以在 Jekejeke Prolog 中看到这种优化。指令 unify_linear 用于:
?- vm_list(less/2).
less(0, s(A)).
0 unify_linear _0, 0
1 unify_linear _1, s(A)
less(s(X), s(Y)) :-
less(X, Y).
0 unify_linear _0, s(X)
1 unify_linear _1, s(Y)
2 goal_last less(X, Y)
与指令 unify_term 相比,指令 unify_linear 不执行发生检查,即使发生检查标志设置为真。
关于compilation - 现代 Prolog 编译器是否会在安全时自动优化发生检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65281579/
我是一名优秀的程序员,十分优秀!