我想知道Prolog在C或C++中的实现方式如何.我主要感兴趣的是将它构建为C或C++库,尽管解释器应用程序也可以.我有兴趣阅读它的内部,即查询执行,即查找解决方案和相关的数据类型.如果您向我推荐任何有关主题的阅读材料或任何直接建议/建议,我将很高兴.读数可能适用于其他OOP语言或一般OOP.最耗尽的材料将解决这个问题.
我正在寻找研究论文或任何其他出版物,比较不同的抽象机器(不止一个)执行Prolog与不基于抽象机器的prolog解释器.到目前为止我所看到的是,大多数实现似乎都是基于Warren Abstract Machine的prolog解释器,尽管提出了其他抽象机器(例如维也纳抽象机,面向树的抽象机)并且没有任何一般的比较.我对效率的比较感兴趣(不是特征),尽管所有比较的解释器都应该允许约束逻辑编程.
逻辑编程背后的常用数学理论禁止创建循环项,规定每次变量与项统一时都应进行发生检查。不幸的是,发生检查会非常昂贵,以至于使 Prolog作为一种编程语言变得不切实际。
但是,我运行了这些基准测试(Prolog 的基准测试)并发现 SWI Prolog 在打开和关闭发生检查 (OC) 之间存在相当小的差异(小于 20%):
OC 关闭::- set_prolog_flag(occurs_check, false).在.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 …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建自己的WAM实现,我坚持练习2.4
我无法理解如何执行unify_value X4图2.4中的指令.
据我所知,该指令应该从查询中用程序中的f(W)统一Y.
unify_value X4调用unify (X4,S)S = 2(见图2.1),相应的堆单元格为"REF 2",X4为"STR 5".
Unify(图2.7)应该bind是那些值,但我不明白如何deref注册.
"REF 2"在堆中,"STR 5"在寄存器中.你怎么bind去登记册?