我正在尝试用 C 编写 Prolog 的 WAM 实现。我注意到 Prolog 数据类型仅在四种标记类型中描述:REF、STR、CON 和 LIS。
执行堆中的每个单元都包含令牌的类型及其在堆中的位置。
请注意,没有对其实际名称(即 Z、W)的任何引用。堆不应该指向符号表中的符号及其值吗?纯序言实现中是否有符号表?我的解析器是创建符号表还是构造堆?WAM A Tutorial Implementation 没有提到任何这些。
我正在尝试用 C 编写 Prolog 的 WAM 实现。我注意到 Prolog 数据类型仅在四种标记类型中描述:REF、STR、CON 和 LIS。
执行堆中的每个单元都包含令牌的类型及其在堆中的位置。
请注意,没有对其实际名称(即 Z、W)的任何引用。堆不应该指向符号表中的符号及其值吗?纯序言实现中是否有符号表?我的解析器是创建符号表还是构造堆?WAM A Tutorial Implementation 没有提到任何这些。
将 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 扩展的额外变量从来没有名字,所以它们只是被赋予任意的名字,比如列表中的B
和C
。