Главная arrow книги arrow Копия Глава 9. Логический вывод в логике первого п arrow Эффективная реализация логических программ
Эффективная реализация логических программ

Листинг 9.4. Псевдокод, представляющий собой результат компиляции предиката Append. Функция New-Variable возвращает новую переменную, отличную от всех других переменных, использовавшихся до сих пор. Процедура Call (continuation) продолжает выполнение с заданным продолжением continuation

•    Выражения предиката Append преобразуются в процедуру, а этапы логического вывода осуществляются путем вызова этой процедуры, поэтому не приходится выполнять поиск соответствующих выражений в базе знаний.

•    Как было описано выше, текущие связывания переменных хранятся в контрольном стеке. На первом этапе выполнения этой процедуры текущее состояние контрольного стека сохраняется в памяти, поэтому оно может быть восстановлено с помощью функции Reset-Trail, если попытка выполнения первого выражения окончится неудачей. Это приводит к отмене всех связываний, сформированных при первом вызове процедуры Unify.

•    Сложнейшей частью этой программы является использование продолжений для реализации точек выбора. Продолжение может рассматриваться как структура данных, в которой упакованы процедура и список параметров, вместе взятые, определяющая, что следует делать дальше, после успешного достижения текущей цели. Дело в том, что после достижения цели не было бы достаточно просто возвратить управление из процедуры, подобной Append, поскольку успех может быть достигнут несколькими способами, и каждый из них должен быть исследован. Параметр continuation, определяющий продолжение, позволяет решить эту проблему, поскольку он может быть вызван после каждого успешного достижения цели. В приведенном здесь коде процедуры Append, если первый параметр является пустым, то предикат Append достиг успеха. Затем вызывается продолжение с помощью процедуры Call (притом что в контрольном стеке находятся все подходящие связывания) для того, чтобы определить, что делать дальше. Например, если процедура Append вызвана на верхнем уровне дерева доказательства, то структура данных continuation будет использоваться для вывода информации о связывании переменных.