gpt4 book ai didi

compilation - 现代 Prolog 编译器是否会在安全时自动优化发生检查?

转载 作者:行者123 更新时间:2023-12-04 08:25:28 26 4
gpt4 key购买 nike

编辑:此问题假设您启用了发生检查。不是关于 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 不执行发生检查,即使发生检查标志设置为真。
瑞图查达; David A. Plaisted (1994)。 “在序言中没有发生检查统一的正确性” .逻辑编程杂志。 18 (2): 99–122。 doi:10.1016/0743-1066(94)90048-5 .

关于compilation - 现代 Prolog 编译器是否会在安全时自动优化发生检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65281579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com