Листинг 23.4. Программа обобщения на основе объяснения
% ebg{ Goal, GeneralizedGoal, SufficientCondition; если
достаточное условие SufficientCondition, заданное в терминах операционных % предикатов, гарантирует, что GeneralizedGoal, обобщениецели Goal, % является истинным. Обобщениецели GeneralizedGoal не должно быть задано с помошью переменной
ebg ( true, true, true) :- !.
еЬд( Goal, GenGoai, GenGoal) :-operational( GenGoal} , call)Goal) .
ebg( (Goall,Goal2) , (Genl,Gen2), Cond} :- !, ebg ( Goall, Gen]., Condi) , ebg( Goal2, Gen2, Cond2), and{ Condi, Cond2, Cond). * Cond = (Condi,CondZ) в упрощенном виде
(Goal,Body)), % Новая копия % терма [GenGoal,GenBody) |
ebg( Goal, GenGoal, Cond) :-not operational! Goal) , clause! GenGoal, GenBody) , copy_term( [GenGoal,GenBody),
ebg( Body, GenBody, Cond) .
% and( Condi,CondH, Cond) если
I условие Cond представляет собой конъюнкцию условий Condi и Cond2
Ъ (возможно, з упрощенном виде)
and[ true,Cond, Cond) :- !. % [true and Cond) <==> Cond
and[ Cond, true,Cond,- :- !. % (Cond and true) <==> Cond.
cffl*f Condi , - COTid-2-; - f ■ Coud±/-етзпйЗ-г}--.-............................................................................... -
Теперь попытаемся исследовать проблемную область с описанием движений лифта. Предположим, что цель, которая должна быть решена и обобщена, состоит в определении последовательности движений Moves , которые переводят лифт с третьего этажа на шестой, как показано ниже. до( 3, 6, Moves)
Теперь можно вызвать на выполнение программу ebg и получить результирующую обобщенную цель и ее условие следующим образом:
?- Goal - до{ 3, 6, Moves) , GenGoal -до( Levell, LeveI2, GenMoves), ebg( Goal, GenGoal, Condition), asserta( ( GenGoal :- Condition)). Goal = got 3, 6, [ up, up, up] ) GenGoal - go ( Levell , Level2, ( up, up, up]) Condition = (0+1 + 1 + 1=:= Level2 - Levell) Moves = [ up, up, up]
Часть II.Применение языка Prolog в области искусственного интеллеш
Результирующее новое предложение, касающееся предиката до, состоит в следующем:
go( Leveil, Level2,[ up. Up, up] ) :-0 + 1 + 1 + 1 =-:- Level2 - Level 1.
С помощью метода EBG простая операция перемещения лифта вверх на три этажа была обобщена как операция перемещения вверх между любыми двумя этажами, находящимися друг от друга на расстоянии в три этажа. Чтобы решить задачу по достижению цели до ( 3, б, Moves), первоначальная программа выполняет поиск среди последовательностей действий по подъему (up) и спуску (down). А с помощью вновь выведенного предложения задача перемещения вверх с одного этажа на другой на расстояние в три этажа (например, до( 7, 10, Moves}) решается немедленно, без какого-либо поиска.
Метаинтерпретатор ebg, приведенный в листинге 23.4, снова является одной из производных простого метаинтерпретатора, показанного в листинге 23.1. Этот новый метаинтерпретатор вызывает встроенную процедуру copyterm. Вызов этой процедуры в форме copy_term{ Term, Copy)
позволяет сформировать для заданного терма Term его копию Сору с переименованными переменными. Это удобно, если требуется сохранить терм в его первоначальном виде и в то же время обеспечить его обработку таким образом, чтобы переменные этого терма могли стать конкретизированными. При такой обработке можно использовать копию терма, притом что переменные в первоначальном терме остаются незатронутыми.
Последнее предложение в процедуре ebg заслуживает дополнительного пояснения. Вызов
clause! GenGoal, GenBody)
обеспечивает выборку предложения, которое может использоваться для доказательства обобщенной цели. Это означает, что метаинтерпретатор фактически предпринимает попытку доказать обобщенную цель. Но следующая строка налагает некоторое ограничение на эту операцию: copy_term( ( GenGoal, GenBody), I Goal, Body))
В ней предъявляется требование, чтобы переменные GenGoal и Goal были согласованными. Согласование выполняется над копией GenGoai, поэтому переменные в этой общей цели остаются незатронутыми. Причина, по которой требуется такое согласование, состоит в том, что выполнение обобщенной цели должно ограничиваться такими альтернативными ветвями дерева доказательства (предложениями), которые являются применимыми для заданного примера (Goal). Благодаря этому выполнением обобщенной цели управляет сам пример. Подобное управление и составляет суть компиляции программы в стиле EBG Без такого управления возникает вероятность того, что будет найдено такое доказательство для GenGoai, которое не применимо для Goal. В подобных случаях обобщение полностью не соответствует примеру.
После того как пример обобщен и сформулирован в терминах операционных предикатов, он может быть добавлен в виде нового предложения к программе для использования при поиске ответов на будущие подобные вопросы путем оценки только операционных предикатов. Таким образом, метод компиляции KBG преобразует программу в "операционный" язык. Откомпилированная программа может выполняться интерпретатором, который "знает" только данный операционный язык. Одним из возможных преимуществ этого может стать создание более эффективной программы. Ее эффективность может быть повышена в следующих двух направлениях: во-первых, обработка операционных предикатов может осуществляться проще по сравнению с другими предикатами, и, во-вторых, последовательность обработки предикатов, показанная на примере, может оказаться более подходящей по сравнению с той, которая была предусмотрена в первоначальной программе, поскольку в откомпилированном определении вообще не появляются ветви, которые приводят к неудачному
Глава 23. Метапрограммирование
завершению. При компиляции программы с помощью метода EBG необходимо следить за тем, чтобы новые предложения не вступали в противоречие с первоначальными предложениями неконтролируемым способом.
Упражнение
23.3. Может показаться, что такой же эффект компиляции, достигаемый в методе EBG, может быть получен без использования примера, просто путем замены целей в первоначальном определении понятия их подцелями, взятыми из соответствующих предложений теории проблемной области, до тех пор, пока все цели не будут сокращены до операционных подцелей. Такая процедура называется развертыванием цели (цель "развертывается" в подцели). Обсудите эту идею по отношению к методу EBG и покажите, что в этом методе нельзя обойтись без управления с помощью некоторого примера. Кроме того, покажите, что новые определения понятий, выработанные с помощью метода EBG, представляют собой обобщение заданных примеров и поэтому не обязательно эквивалентны первоначальной программе (определения нового понятия могут быть неполными).