3

我正在阅读 Hassan Ait-Kaci 的书Warren's Abstract Machine - A Tutorial Reconstruction。目前我被困在第 2.4 节“参数寄存器”上。

确切地说,我不明白的是如何从这些寄存器分配中获得(第 22 页)(用于查询p(Z,h(Z,W),f(W))):

A1 = Z
A2 = h(A1,X4)
A3 = f(X4)
X4 = W

对于这些说明(第 24 页):

put_variable X4,A1
put_structure h/2,A2
set_value X4
set_variable X5
put_structure f/1,A3
set_value X5
call p/3

比如,X5 是从哪里来的?在寄存器赋值中,X4 指的是变量 W,没有 X5。但是在说明中,X5 指的是(本质上是什么)W,而 X4 现在指的是 Z。我在书中没有看到解释。我错过了什么?

4

1 回答 1

2

我试图理解这一点,但无济于事。勘误表中没有任何内容。以下是一些注意事项:

指令审查

  • put_structure f/n,Xi:将一个新的STR(和相邻的仿函数)单元推送到堆上,并将该单元复制到分配的寄存器地址中;
  • set_variable Xi:将一个新REF单元推入包含其自己地址的堆上,并将其复制到给定的寄存器中;
  • set_value Xi:将一个新单元推入堆中并复制到寄存器的值中。
  • 查询时:
    • put_variable Xn,Ai:在第 i 个参数位置第一次出现的变量将一个新的未绑定REF单元推送到堆上,并将其复制到该变量的寄存器以及参数寄存器中Ai;和
    • put_value Xn,Ai(用于查询):稍后出现将其值复制到参数寄存器Ai中。
  • 在事实的情况下:
    • get_variable Xn,Ai: 在第 i 个参数位置第一次出现的变量将其设置为参数寄存器的值Ai;和
    • get_value Xn,Ai: 后面的出现与 的值统一Ai

所以,关于那个查询

p(Z,h(Z,W),f(W)))

第 17 页和第 19 页的编码似乎不同

Page 17 in the print edition    Page 19 in the print edition
(given as is)                   (translated by me from the WAM code)

A1 = Z                          A1 = Z
A2 = h(A1,X4)                   A2 = h(X4,X5)
A3 = f(X4)                      A3 = f(X5)
X4 = W                          X4 = Z
                                X5 = W

编辑:左边的代码似乎允许出现在非根位置的变量出现在“参数寄存器”中,这在右边是不允许的,因此是间接的。

编码

Ai参数寄存器,Xi是一些值寄存器。

put_variable X4,A1       Z is a argument root freshvar created in X4
                         and also goes into A1
put_structure h/2,A2     h/2 functor goes into A2
                         (1)
set_value X4             New (empty) cell is created, goes into the 
                         value of X4 
                         (2)
set_variable X5          W is a non-root freshvar created in X5
                         (3)
put_structure f/1,A3     f/1 functor goes into A3
set_value X5             New (empty) cell is created, goes into the 
                         value of X5 
                         (4)
call p/3                 Go!

在位置 (1),到目前为止,一切都很好。X4并且X5似乎隐含地是h/2A2 中的第一个和第二个参数(对吗?)

X4 ----+---> [unbound REF] = Z (variable appearing at root)
       |
A1 ----+

A2 --------> [h/2] = h(X4,X5)

在 (2)

X4 ----+---> [] = Z (variable appearing at root)
       |
A1 ----+

A2 --------> [h/2] = h(X4,X5)

在 (3)

X4 ----+---> [] = Z (variable appearing at root)
       |
A1 ----+

A2 --------> [h/2] = h(X4,X5)

X5 --------> [myself REF] (variable not appearing at root)

在 (4)

X4 ----+---> [] = Z (variable appearing at root)
       |
A1 ----+

A2 --------> [h/2] = h(X4,X5)

A3 --------> [f/1] = f(X5)

X5 --------> [] = W

于 2020-06-26T11:17:38.440 回答