我正在阅读Hassan Aït-Kaci's "Warren's Abstract Machine: A Tutorial Reconstruction"。
在第2章中,编译L0查询后会显示L0程序的编译。程序编译部分(2.3)以:
开头编译程序术语 p 只是有点棘手,尽管不是 许多。请注意,它假定查询
?-
q 将构建一个术语 在堆上并设置寄存器X1以包含其地址。从而, 将 q 统一到 p 可以按照术语结构进行 存在于X1中,只要它与仿函数的仿函数匹配 p 的结构。
因此,在执行从查询编译中获得的指令后,程序的编译是吗?这甚至有意义吗?我很困惑......
对我来说有意义的是:由程序的带注释的语法树生成的WAM代码由解释器存储。对于每个过程(在程序中定义),存储一块WAM代码。进行查询时,将生成并执行其指令。如果查询正在调用已定义的过程,请执行其代码块。是这样的吗?
答案 0 :(得分:3)
请注意,您引用的内容来自本文中介绍的一系列日益复杂的虚拟机:
我们在这里考虑ℒ 0 ,确实是一种非常简单的语言。在这种语言中,人们只能指定两种实体:程序术语和查询术语。程序和查询都是一阶项而不是变量。 ℒ 0 的语义很简单 无异于计算程序和查询的最常用的统一程序。
这种简单的语言按你所描述的那样解释。
在本书的后面部分中,更复杂的机器的设计和执行会逐渐变得更加复杂,例如,我们在几页之后就会发现:
在sub 1 中,编译的代码存储在代码区(
npm install
)中,这是一个可寻址的数据字数组,每个数据字包含一个可能标记的指令超过一个或多个由操作码组成的记忆词 其次是操作数。
这已经是你在帖子末尾描述的设计,当然这是在实践中如何编译实际的Prolog代码。
答案 1 :(得分:2)
因此,在执行从查询编译中获得的指令后,程序的编译是吗?这甚至有意义吗?我很困惑......
一开始,这是澄清的(2,最后一段):
这个想法非常简单:定义了一个程序术语 p ,可以提交任何查询{{1}} q ,如果 p,执行失败和 q 不统一,或通过将 q 与 p 统一而获得的 q 中的变量绑定成功。
正如@mat已经说明的那样:这是一个循序渐进的方法。从非常简单的程序开始。只需一个基础事实和查询。