Есть ли в WAM Prolog таблица символов?

Я пытаюсь запрограммировать реализацию Пролога WAM в C. Я заметил, что типы данных Пролога описаны только в четырех типах токенов: REF, STR, CON и LIS.

Каждая ячейка в куче выполнения содержит тип маркера и его положение в куче.

введите здесь описание изображения

Обратите внимание, что нет никакой ссылки на его фактическое имя (например, Z, W). Разве куча не должна указывать на символ и его значение в таблице символов? Есть ли таблица символов в реализации чистого пролога? Создает ли мой парсер таблицу символов или кучу? В реализации WAM A Tutorial ничего из этого не упоминается.


person Skalwalker    schedule 02.10.2020    source источник
comment
Z и W — логические переменные. WAM не нужно отслеживать имена переменных. В этом примере Z была назначена ячейка 2, а W - ячейка 3, поэтому необходимо согласовать ячейку, назначенную им, как показано на опубликованном вами рисунке. Должна быть какая-то таблица атомов для отслеживания атомов (в примере p, h и f).   -  person gusbro    schedule 02.10.2020


Ответы (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.

person Peter Ludemann    schedule 02.10.2020
comment
Итак, после того, как я проанализирую свой язык, я должен использовать синтаксическое дерево для непосредственного создания своей кучи? - person Skalwalker; 03.10.2020
comment
Я не понимаю вашего вопроса. Вы имеете в виду использование синтаксиса для определения того, какую инструкцию выдавать? Если это так, то это немного похоже на компиляцию C++ или Python: часть кода приводит к размещению в стеке, а другой код размещается в куче — синтаксическое дерево не требуется при выполнении машинного кода (для C++) или байтового кода (для Python). ) (Я не смотрел на WAM буквально десятилетиями, так что, возможно, кто-то, кто работал над этим совсем недавно, может помочь вам лучше.) - person Peter Ludemann; 04.10.2020