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 扩展的额外变量从来没有名字,所以它们只是被赋予任意名称,例如清单中的 B
和 C
。
我正在尝试用 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 扩展的额外变量从来没有名字,所以它们只是被赋予任意名称,例如清单中的 B
和 C
。