【问题标题】:Does WAM Prolog have a Symbol Table?WAM Prolog 有符号表吗?
【发布时间】:2020-10-02 20:06:34
【问题描述】:

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

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

请注意,没有提及其实际名称(即 Z、W)。堆不应该指向符号表中的符号及其值吗?纯序言实现中是否有符号表?我的解析器是创建符号表还是构造堆? WAM A Tutorial Implementation 没有提到这些。

【问题讨论】:

  • ZW 是逻辑变量。 WAM 不需要跟踪变量名称。在此示例中,Z 分配给单元格 2,W 分配给单元格 3,因此需要保持一致的是分配给它们的单元格,如您发布的图中所示。应该有某种原子表来跟踪原子(在示例中为phf)。

标签: prolog symbol-table warren-abstract-machine


【解决方案1】:

将 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

【讨论】:

  • 所以我解析完我的语言后,我应该使用语法树直接创建我的堆吗?
  • 我不明白你的问题。你的意思是使用语法来确定发出什么样的指令?如果是这样,这有点像编译 C++ 或 Python:一些代码导致在堆栈上分配,而其他代码在堆上分配 - 执行机器代码(对于 C++)或字节码(对于 Python)时不需要语法树)(我已经有几十年没有研究过 WAM 了,所以也许最近从事这方面工作的人可以为您提供更好的帮助。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多