0

我正在尝试用 C 编写 Prolog 的 WAM 实现。我注意到 Prolog 数据类型仅在四种标记类型中描述:REF、STR、CON 和 LIS。

执行堆中的每个单元都包含令牌的类型及其在堆中的位置。

在此处输入图像描述

请注意,没有对其实际名称(即 Z、W)的任何引用。堆不应该指向符号表中的符号及其值吗?纯序言实现中是否有符号表?我的解析器是创建符号表还是构造堆?WAM A Tutorial Implementation 没有提到任何这些。

4

1 回答 1

3

将 WAM 视为一种机器代码 - 机器代码中没有符号表,尽管可执行文件中可能有一个单独的部分提供调试器或其他工具 1 可用于按名称显示值的信息。许多 Prolog 实现也可以显示局部变量名称,但这超出了 WAM 的范围。

当然,在将子句编译为 WAM 时会使用本地符号表,但它是单个子句的本地符号表,并且没有您在传统编程语言中看到的范围复杂性。

考虑以下(使用 SWI-Prolog):

1 ?- [user].
|: foo(Char) --> [Char], {check(Char)}, bar(Char). 
|: 
% user://1 compiled 0.03 sec, 1 clauses
true.

2 ?- listing(foo).
foo(A, [A|B], C) :-
    check(A),
    D=B,
    bar(A, D, C).

一个聪明的实现可以呈现listing(foo)为:

foo(Char, [Char|B], C) :-
    check(Char),
    bar(Char, B, C).

但在内部,它是完全一样的。DCG 扩展的额外变量从来没有名字,所以它们只是被赋予任意的名字,比如列表中的BC

于 2020-10-02T21:37:25.857 回答