问题标签 [warren-abstract-machine]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
prolog - WAM 的替代品
我记得有一次读到至少有两种其他替代品与 WAM 大致同时发明。任何指针?
prolog - 在沃伦的抽象机器中,参数变量是在哪里创建的?
我正在尝试创建自己的 WAM 实现,并使用“Warren's Abstract Machine: A Tutorial Reconstruction”的图 2.10中的说明作为测试用例。但是,我需要传递A1
和传递A2
给get_structure
. 但是这两个变量是在哪里创建的?put_value
并且put_variable
两者都创建 A 变量,但都没有在说明中列出。
algorithm - WAM(Warren's Abstract Machine)中的统一算法示例
Warren 的抽象机器中的练习 2.2 :教程重构
要求对术语 f(X, g(X, a)) 和 f(b, Y) 进行表示,然后对这些术语的地址进行统一(分别表示为 a1 和 a2)。
我已经为这些术语构建了堆表示,它们如下:
现在我被要求跟踪统一(a1,a2),但是按照第 20 页的算法,我得到:
我的错误在哪里?
prolog - GNU Prolog:显示 WAM 代码进行查询?
是否可以使用GNU Prolog显示查询的 WAM 代码?
我知道我可以使用 pl2wam 为程序生成 WAM,但是我对程序执行的查询呢?有没有办法为此显示 WAM 代码?
我正在为 x64 Windows 使用 1.4.4 版
prolog - 用于执行 Prolog 的抽象机器的比较
我正在寻找研究论文或任何其他出版物,它们比较不同的抽象机器(不止一个)来执行 Prolog 与不基于抽象机器的 prolog 解释器。到目前为止,我所看到的是,尽管提出了其他抽象机器(例如Vienna Abstract Machine、Tree-Oriented Abstract Machine ),但大多数实现似乎都将它们的 prolog 解释器基于Warren Abstract Machine并且没有任何一般性比较。我对效率(而不是功能)的比较感兴趣,尽管所有比较的解释器都应该允许约束逻辑编程。
prolog - 在沃伦的抽象机器中,如果参数之一是寄存器,绑定如何工作?
我正在尝试创建自己的 WAM 实现,但我被困在练习 2.4
我无法理解如何执行unify_value X4
图 2.4 中的指令。
据我了解,该指令应将程序中的 Y 与查询中的 f(W) 统一起来。
unify_value X4
调用unify (X4,S)
其中 S=2(参见图 2.1)并且相应的堆单元是“REF 2”,而 X4 是“STR 5”。
Unify
(图2.7)应该bind
是那些值,但是我不明白怎么deref
注册。
“REF 2”在堆中,“STR 5”在寄存器中。你怎么bind
注册?
prolog - 显示给定 Prolog 程序的 WAM 代码
给定一个 Prolog 程序,是否有任何 GNU Prolog 命令来查看与该程序相关的 WAM 代码?
prolog - 什么时候执行 Warren 的抽象机程序指令?
我正在阅读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 代码块。进行查询时,会生成并执行其指令。如果查询正在调用已定义的过程,则执行其代码块。是这样的吗?
prolog - 为 L0 程序术语生成 WAM 代码的正确顺序是什么?
在Hassan Aït-Kaci 的“Warren's Abstract Machine: A Tutorial Reconstruction”第 2.2 节中,L0 查询的编译顺序非常明确:寄存器必须使用从左到右的广度优先搜索分配,代码必须使用左-右后序深度优先搜索。
在 2.3 节中,寄存器分配(L0 程序)的顺序很明确:从左到右的广度优先搜索。代码生成的顺序不是。给出了唯一的例子,我不知道我应该使用 BFS 还是 DFS 来生成代码。
有人可以给我以下 L0 程序的 WAM 代码吗?
p(q(r(a)),s(b))。
prolog - Ait-Kaci 的 WAM L1 的代码生成如何工作?
Hassan Aït-Kaci 的“Warren's Abstract Machine: A Tutorial Reconstruction”第 2.4 节将 L0 扩展到 L1 以支持抽象机器中的一组事实。四个新指令put_variable
、put_value
、get_variable
和get_value
有参数Xn
和Ai
,其含义不明确。描述只提到i
参数索引Ai
:i
谓词的第-个参数位置。n
来自哪里Xn
?图 2.9 展示了一个为查询生成的代码示例p(Z,h(Z,W),f(W))
。由于谓词p
的元数为 3 并且第一条指令是put_variable X4, A1
,n
因此不能是谓词的元数。