Абстрактная машина Уоррена
В 1983 году Дэвид Уоррен разработал абстрактную машину для выполнения Пролога , состоящую из архитектуры памяти и набора команд . [1] [2] [3] Эта конструкция стала известна как Абстрактная машина Уоррена (WAM) и стала де-факто стандартной целью для компиляторов Пролога .
Цель [ править ]
Целью компиляции кода Пролога в более низкоуровневый код WAM является повышение эффективности последующей интерпретации программы Пролога. Код Пролога достаточно легко преобразовать в инструкции WAM, которые можно более эффективно интерпретировать. Кроме того, последующие улучшения кода и компиляцию в машинный код часто легче выполнять на более низкоуровневом представлении.
Для написания эффективных программ на Прологе может оказаться полезным базовое понимание того, как работает WAM. Некоторые из наиболее важных концепций WAM — это индексация первого аргумента и ее связь с точками выбора, оптимизация хвостового вызова и освобождение памяти в случае сбоя.
Области памяти [ править ]
WAM имеет следующие области памяти:
- Глобальный стек или куча , используемый для хранения составных терминов.
- Локальный стек для фреймов окружения и точек выбора.
- След для записи того , какие привязки переменных следует отменить при возврате.
Пример [ править ]
Вот фрагмент кода Пролога:
девочка ( Салли ).
девушка ( Джейн ).
мальчик ( Б ) :- \+ девочка ( Б ).
Компилятор Пролога на основе WAM скомпилирует это в инструкции WAM, подобные следующим:
предикат ( девушка / 1 ) :
switch_on_term ( 2 , 1 , неудача , неудача , неудача ),
метка ( 1 ) : switch_on_atom ([( Салли , 3 ), ( Джейн , 5 )])
метка ( 2 ) : try_me_else ( 4 )
метка ( 3 ) : get_atom ( салли , 0 )
продолжить
метка ( 4 ) : доверие_мне_else_fail
метка ( 5 ) : get_atom ( джейн , 0 )
продолжения
предикат ( мальчик / 1 ) :
get_variable ( x ( 1 ), 0 )
put_structure ( девушка / 1 , 0 )
unify_local_value ( x ( 1 ))
выполнить (( \+ ) / 1 )])
Важной характеристикой этого кода является его способность справляться с различными способами вызова предикатов: любой аргумент может быть переменной, основным термином или частично созданным термином. Инструкции переключения обрабатывают разные случаи.
Ссылки [ править ]
- ^ Дэвид Х.Д. Уоррен (октябрь 1983 г.). Абстрактный набор команд Пролога (PDF) . Менло-Парк, Калифорния, США: Центр искусственного интеллекта при SRI International . Архивировано (PDF) из оригинала 19 июня 2022 г.
- ^ Хасан Айт-Каджи (18 февраля 1999 г.). Абстрактная машина Уоррена: учебная реконструкция (PDF) . Архивировано из оригинала 13 февраля 2003 г.
{{cite book}}
: CS1 maint: неподходящий URL ( ссылка ) - ^ Хасан Айт-Качи. «Абстрактная машина Уоррена: реконструкция учебника; книга, опечатки и слайды» . Архивировано из оригинала 19 января 2022 года . Проверено 7 марта 2011 г.