我正在尝试编写玩具逻辑编程查询语言,基于各种指令来源,包括SICP和 Prolog的艺术(AoP)。我刚刚开始研究统一算法的第一个草图("逻辑编程计算模型的核心"根据AoP),AoP注意到
当为特定逻辑编程语言实现统一算法时,避免了堆栈和统一器中的等式中的显式替换。相反,逻辑变量和其他术语由具有不同值的存储器单元表示,并且通过将表示逻辑变量的存储器单元分配给包含变量所绑定的术语的表示的单元来实现变量绑定。 (第1版,第71页)
阅读这篇文章让我意识到我对逻辑变量的工作原理只有粗略而实际的把握,但我并不真正理解它们是如何实现的。我甚至不确定将逻辑变量与声明性编程范例的其他区域中的不可变变量区分开来的精确的形式特征是什么。我将感激所有有启发性的解释和有益的参考。
答案 0 :(得分:5)
如果您想了解Prolog编译器和解释器的实现方式,请查看Warren Abstract Machine。
逻辑变量的基本思想是它们要么绑定到一个术语,要么是自由的,要么别名为不同的逻辑变量。
答案 1 :(得分:2)
部分答案,仅涉及逻辑变量的概念。
第一个近似可能是说逻辑变量就像数学变量一样:一旦学会了它们的价值,它就不会改变。这导致了一次性赋值变量的概念。这与命令式编程语言中的变量概念形成对比,在命令式编程语言中,它们象征性地识别存储器位置,从而允许破坏性(因此)多次分配。但是,回到逻辑变量,它会变得更好。逻辑变量可以统一,带有 term ,但该术语本身可能包含变量。反过来,这些变量可以在以后与其他术语进一步统一。请考虑Prolog中的以下示例:
?- V = a(Y).
V = a(Y).
?- V = a(Y), V = a(1).
V = a(1),
Y = 1.
在第二个查询中,变量V
进一步实例化统一它包含的变量Y
,并带有整数{{ 1}}。 1
运算符是Prolog 统一运算符。统一是一种逻辑操作,当你可以使用两个术语并使它们相等时,可能是通过将一个术语中的绑定变量转换为另一个术语中的子术语。
答案 2 :(得分:1)
实施中的主要区别是structure sharing
vs structure copying
。谷歌搜索为此提供了许多资源......
在我的Prolog翻译中,我选择了结构共享,所以在unify中显然需要详细处理(嗯,它非常3)简单思维方法):大部分实现都在那里,留给服务数据结构BindStack和TrailStack只是存储而不多......由于我的选择,实例化的Term必须一起引用它的环境。