我试图理解这一点,但无济于事。勘误表中没有任何内容。以下是一些注意事项:
指令审查
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/2
A2 中的第一个和第二个参数(对吗?)
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