【发布时间】:2021-01-06 17:12:08
【问题描述】:
逻辑编程背后的常用数学理论禁止 创建循环项,指示发生检查应该是 每次将变量与术语统一时完成。不幸的是,一个 发生检查将非常昂贵,以至于 使 Prolog 不切实际 一种编程语言。
但是,我运行 these benchmarks(Prolog 的)并看到 SWI Prolog 中发生检查 (OC) 的开启和关闭之间存在相当小的差异(小于 20%):
OC 关闭::- set_prolog_flag(occurs_check, false). in .swiplrc(重新启动)
?- run_interleaved(10).
% 768,486,984 inferences, 91.483 CPU in 91.483 seconds (100% CPU, 8400298 Lips)
true.
?- run(1).
'Program' Time GC
================================
boyer 0.453 0.059
browse 0.395 0.000
chat_parser 0.693 0.000
crypt 0.481 0.000
fast_mu 0.628 0.000
flatten 0.584 0.000
meta_qsort 0.457 0.000
mu 0.523 0.000
nreverse 0.406 0.000
poly_10 0.512 0.000
prover 0.625 0.000
qsort 0.574 0.000
queens_8 0.473 0.000
query 0.494 0.000
reducer 0.595 0.000
sendmore 0.619 0.000
simple_analyzer 0.620 0.000
tak 0.486 0.000
zebra 0.529 0.000
average 0.534 0.003
true.
OC 开启::- set_prolog_flag(occurs_check, true). in .swiplrc(重新启动)
?- run_interleaved(10).
% 853,189,814 inferences, 105.545 CPU in 105.580 seconds (100% CPU, 8083669 Lips)
true.
?- run(1).
'Program' Time GC
================================
boyer 0.572 0.060
browse 0.618 0.000
chat_parser 0.753 0.000
crypt 0.480 0.000
fast_mu 0.684 0.000
flatten 0.767 0.000
meta_qsort 0.659 0.000
mu 0.607 0.000
nreverse 0.547 0.000
poly_10 0.541 0.000
prover 0.705 0.000
qsort 0.660 0.000
queens_8 0.491 0.000
query 0.492 0.000
reducer 0.867 0.000
sendmore 0.629 0.000
simple_analyzer 0.757 0.000
tak 0.550 0.000
zebra 0.663 0.000
average 0.634 0.003
true.
这些基准是否不能代表实际使用情况? (我记得在某处读到它们被特别选为“相当有代表性”) SWI Prolog 是否实施了一些 SICStus 人不知道的优化技巧,这使得 OC 的成本很小?如果是这样,它们是否已发布? (我从 90 年代找到了一堆关于此的论文,但我不知道它们是否是最先进的)
【问题讨论】:
-
虽然我无法直接回答您的问题,但我们很高兴与 Jan Wielemaker(SWI Prolog 的创建者)在 SWI-Prolog Discourse (swi-prolog.discourse.group ) :-) 他相当活跃,所以我也可以建议您去那里。
-
这是交叉发布的here
-
@MostowskiCollapse 我的版本是 7.6.4 (Linux)。
current_prolog_flag(occurs_check, X)同意~/.swiplrc中的任何内容。 -
@MostowskiCollapse “试试这个:?- freeze(A,true),freeze(B,true),AB=s(A)-n.. 它会成功。” i> 我在 7.6.4 中看到一条错误消息(OC 设置为“错误”)。
-
@oguzismail:你在这里做的是破坏一个小标签。不,它对 Prolog 来说不仅仅是“有意义的”。与出现在很多地方的unification有关。
标签: prolog swi-prolog occurs-check