gpt4 book ai didi

prolog - WAM 书 : How is code generated when dealing with argument registers (L1)?

转载 作者:行者123 更新时间:2023-12-04 15:24:30 24 4
gpt4 key购买 nike

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

准确的说,我不明白的是如何从这些寄存器赋值(p.22)中得到(for query 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。我在书中没有看到任何解释。我错过了什么?

最佳答案

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

指令回顾

  • put_structure f/n,Xi:将一个新的STR(和相邻仿函数)单元插入堆中,并将该单元复制到分配的寄存器地址中;
  • set_variable Xi:将一个新的REF单元插入包含其自身地址的堆中,并将其复制到给定的寄存器中;
  • set_value Xi:将一个新单元插入堆并复制到寄存器的值中。
  • 查询时:
    • put_variable Xn,Ai:变量在第 i 个参数位置的第一次出现将一个新的未绑定(bind) 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) 非常好。 X4X5 似乎隐含地是 A2 中 h/2 的第一个和第二个参数(是吗?)

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

关于prolog - WAM 书 : How is code generated when dealing with argument registers (L1)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62567036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com