据我所知,通过健全的统一,SLD 解析不应该创建循环数据结构(这是正确的吗?) 如果是这样,理论上可以以不需要垃圾收集 (GC) 的方式实现 Prolog。 但话又说回来,一个人可能不会。 对于基于 WAM 的 Prolog 实现来说,这是真的吗? SWI-Prolog 是这样吗? ...
据我所知,通过健全的统一,SLD 解析不应该创建循环数据结构(这是正确的吗?) 如果是这样,理论上可以以不需要垃圾收集 (GC) 的方式实现 Prolog。 但话又说回来,一个人可能不会。 对于基于 WAM 的 Prolog 实现来说,这是真的吗? SWI-Prolog 是这样吗? ...
WAM:A Tutorial Reconstruction 指出需要使用以下原则扁平化查询 p(Z, h(Z,W), f(W)): 话虽如此,查询扁平形式是: 我对外部变量的定义迷失了,请考虑以下几点: Y 是外部变量吗? 这个扁平化的形式应该如何? 根据我的理解,这将是构造: ...
我正在尝试用 C 编写 Prolog 的 WAM 实现。我注意到 Prolog 数据类型仅以四种标记类型进行描述:REF、STR、CON 和 LIS。 执行堆中的每个单元格都包含令牌的类型及其在堆中的位置。 请注意,没有对其实际名称(即 Z、W)的任何引用。 堆不应该指向符号表中的符号及其值 ...
我正在阅读 Hassan Ait-Kaci 的书Warren's Abstract Machine - A Tutorial Reconstruction 。 目前我被困在第 2.4 节“参数寄存器”上。 确切地说,我不明白的是如何从这些寄存器分配中获得(p.22)(用于查询p(Z,h(Z,W), ...
在sicstus-prolog的黑客攻击clpz的背景下,我想瞥一下SICStus Prolog生成的warren-abstract-machine代码。 举个例子,让我们剖析下面的谓词! 这就是我现在正在做的事情: 将is_list/1的2个子句拆分为2个单独的谓词,并添加 ...
在HassanAït-Kaci的“ Warren的抽象机:教程重构”第2.2节中,L0查询的编译顺序非常清楚:必须使用从左到右的广度优先搜索来分配寄存器,并且必须使用从左到右的宽度生成代码。从右到后的深度优先搜索。 在第2.3节中,(L0程序的)寄存器分配顺序是明确的:从左到右的宽度优先搜 ...
我正在阅读HassanAït-Kaci的“沃伦的抽象机器:教程的重构” 。 在第2章中,将在编译L0查询之后介绍L0程序的编译。 程序编译部分(2.3)开头为: 编译程序项p有点棘手,尽管不是很多。 观察到它假设一个查询?- -q将在堆上建立一个术语并将寄存器X1设置为包含其 ...
给定一个Prolog程序,是否有任何GNU Prolog命令来查看与该程序相关的WAM代码? ...
我正在尝试创建自己的WAM实施,并且坚持练习2.4 我不明白如何执行图2.4中的指令unify_value X4 。 据我了解,该指令应将程序中的Y与查询中的f(W)统一起来。 unify_value X4调用unify (X4,S) ,其中S = 2(参见图2.1),对应的堆 ...
我正在寻找研究论文或任何其他出版物,比较不同的抽象机器(不止一个)执行Prolog与不基于抽象机器的prolog解释器。 到目前为止我所看到的是,大多数实现似乎都是基于Warren Abstract Machine的prolog解释器,尽管提出了其他抽象机器(例如维也纳抽象机 , 面向树的抽象 ...
是否可以使用GNU Prolog显示查询的WAM代码? 我知道我可以使用pl2wam为该程序生成WAM,但是我对该程序执行的查询又如何呢? 有没有办法显示此的WAM代码? 我正在使用适用于x64 Windows的1.4.4版本 ...
沃伦抽象机器中的练习2.2 :教程重构 要求提供术语f(X,g(X,a))和f(b,Y)的表示形式,然后对这些术语的地址进行统一(分别表示为a1和a2)。 我为这些术语构造了堆表示形式,它们如下: 现在我被要求跟踪unify(a1,a2),但是按照第20页的算法在1中我得到: ...
我试图创建自己的WAM实现,并使用“ Warren的抽象机:教程重构” 图2.10中的说明作为测试用例。 但是,我需要将A1和A2传递给get_structure 。 但是两个变量都在哪里创建的? put_value和put_variable都创建A变量,但指令中均未列出。 ...