В 1983 году, Дэвид HD Уоррен разработал абстрактную машину для выполнения Prolog, состоящую из архитектуры памяти и набора команд. Этот дизайн стал известен как Абстрактная машина Уоррена (WAM) и стал де-факто стандартной целью для компиляторов Prolog .
Цель компиляции кода Пролога в более низкоуровневый код WAM состоит в том, чтобы сделать последующую интерпретацию программы Пролога более эффективной. Код Пролога довольно легко преобразовать в инструкции WAM, которые можно интерпретировать более эффективно. Кроме того, последующие улучшения кода и компиляция в машинный код часто легче выполнять на более низкоуровневом представлении.
Для написания эффективных программ на Прологе может оказаться полезным базовое понимание того, как работает WAM. Некоторые из наиболее важных концепций WAM - это индексирование первого аргумента и его связь с точками выбора, оптимизация хвостового вызова и восстановление памяти в случае сбоя.
WAM имеет следующие области памяти:
Вот фрагмент кода Пролога:
girl (sally). девушка (джейн). мальчик (B): - \ + девочка (B).
Компилятор Пролога на основе WAM скомпилирует это в инструкции WAM, подобные приведенным ниже:
predicate (girl / 1): switch_on_term (2,1, fail, fail, fail), label (1): switch_on_atom ( [(sally, 3), (jane, 5)]) label (2): try_me_else (4) label (3): get_atom (sally, 0) continue label (4): trust_me_else_fail label (5): get_atom (jane, 0) предикат продолжения (мальчик / 1): get_variable (x (1), 0) put_structure (girl / 1,0) unify_local_value (x (1)) execute ((\ +) / 1)])
Важный Характерной чертой этого кода является его способность справляться с различными режимами, в которых могут быть вызваны предикаты: любой аргумент может быть переменной, основным термином или частично конкретизированным термином. Инструкции «переключателя» обрабатывают разные случаи.