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