问题描述
我正在尝试用C对Prolog的WAM实现进行编程。我注意到Prolog数据类型仅以四种令牌类型描述:REF,STR,CON和LIS。
执行堆中的每个单元格都包含令牌的类型及其在堆中的位置。
请注意,它没有引用其实际名称(即Z,W)。堆不应该指向符号及其在符号表中的值吗?在纯prolog实现中是否存在符号表?我的解析器会创建符号表还是构造堆? WAM教程实施未提及任何内容。
解决方法
将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
。