Есть ли в WAM Prolog таблица символов?
Я пытаюсь запрограммировать WAM-реализацию Prolog на C. Я заметил, что типы данных Prolog описаны только в четырех типах токенов: REF, STR, CON и LIS.
Каждая ячейка в куче выполнения содержит тип токена и его позицию в куче.
Обратите внимание, что нет никаких ссылок на его настоящее имя (например, Z, W). Разве куча не должна указывать на символ и его значение в таблице символов? Есть ли таблица символов в чистой реализации пролога? Создает ли мой парсер таблицу символов или кучу? WAM A Tutorial Implementation ничего из этого не упоминает.
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 никогда не имели имен, поэтому им просто давали произвольные имена, например
B
и
C
в списке.