微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WAM Prolog是否有符号表?

如何解决WAM Prolog是否有符号表?

我正在尝试用C对Prolog的WAM实现进行编程。我注意到Prolog数据类型仅以四种令牌类型描述:REF,STR,CON和LIS。

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

enter image description here

请注意,它没有引用其实际名称(即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扩展的额外变量从来没有名称,因此在清单中它们仅被赋予了任意名称,例如BC

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。