3

我正在阅读Hassan Aït-Kaci 的“Warren's Abstract Machine: A Tutorial Reconstruction”

第 2 章在 L0 查询编译之后介绍 L0 程序的编译。程序编译部分(2.3)开始于:

编译一个程序术语p只是有点棘手,虽然不是很多。观察它假定查询?- q将在堆上建立一个术语并设置寄存器 X1 以包含其地址。因此,将q统一到p可以通过遵循 X1 中已经存在的期限结构来进行,只要它与函子匹配p的结构。

那么程序的编译是在查询编译得到的指令执行之后进行的吗?这甚至有意义吗?我很困惑...

对我来说有意义的是:由程序的注释语法树生成的 WAM 代码由解释器存储。对于每个过程(在程序中定义),都会存储一个 WAM 代码块。进行查询时,会生成并执行其指令。如果查询正在调用已定义的过程,则执行其代码块。是这样的吗?

4

2 回答 2

3

请注意,您引用的内容来自本文介绍的一系列日益复杂的虚拟机的开头:

我们在这里考虑 ℒ 0,确实是一种非常简单的语言。在这种语言中,只能指定两种实体:程序术语和查询术语。程序和查询都是一阶项,但不是变量。ℒ 0的语义简单地相当于计算程序和查询的最通用的统一符。

这种简单的语言按照您的描述进行解释。

在本书后面的章节中,更复杂机器的设计和执行相应地变得更加复杂,并且在几页之后我们已经发现例如:

在 ℳ 1中,编译后的代码存储在代码区域( CODE) 中,这是一个可寻址的数据字数组,每个数据字包含一个或多个内存字上可能标记的指令,该内存字由操作码和操作数组成。

这已经是您在帖子末尾描述的设计,这当然是实际 Prolog 代码的编译方式。

于 2016-10-28T09:10:31.987 回答
2

那么程序的编译是在查询编译得到的指令执行之后进行的吗?这甚至有意义吗?我很困惑...

一开始,这是澄清的(2,最后一段):

这个想法很简单:定义了一个程序术语p,可以提交任何查询?-q,如果pq不统一,则执行失败,或者通过将q中的变量与p统一获得的绑定成功。

正如@mat 已经指出的那样:这是一个循序渐进的方法。从非常简单的程序开始。只有一个基本事实和一个查询。

于 2016-10-28T12:13:40.070 回答