WAM Prolog 有符号 Table 吗?

Does WAM Prolog have a Symbol Table?

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

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

请注意,没有任何对其实际名称(即 Z、W)的引用。堆不应该指向一个符号及其在符号table中的值吗?纯序言实现中是否有符号table?我的解析器是创建一个符号 table 还是构造一个堆? WAM A 教程实现没有提及任何内容。

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

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

考虑以下(使用 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