Листинг 19.4. Формулировка задачи для изучения предиката определения принадлежности к списку
Ь Формулировка задали лля изучения предиката member(X,L) backliteral( member(X,L), [L:listI, iX:item] ), % Фоновый литерал Ч Усовершенствование термов
term.!list, [X|L], [ К:item, L:iist]>. terrat list, [) , [1) .
prolog_predicate( fail). Ч тоновый литерал отсутствует в программе
I на языке Prolog
start_clause ( [ member (X,!,) ] / [ X:item, L:list]).
% Положительные и отрицательные примеры
ess! member! a, [a])) . ех[ member! b, [агЬ])).
ex ( member ( d, [з,Ь,с, d, е] ) ) .
пег:! member ! Ь, [а])) .
пех ( member ( d, [а,Ь] ) ) .
пех ( meraber{ f, [a,b, c,d, ej) ) .
460
Часть II.Применение языка Prolog в области искусственного интеллекта
Назначение входных и выходных параметров состоит в следующем. Если какой-либо параметр литерала является входным, то предполагается, что он должен конкретизироваться при каждом выполнении этого литерала. Это означает, что если при усовершенствовании предложения такой литерал добавляется к телу предложения, то каждая из его входных переменных должна быть немедленно согласована с некоторой существующей переменной в предложении. В приведенном выше примере должна быть немедленно согласована с существующей переменной переменная L (также относящаяся к типу "список") при каждом добавлении литерала member (X,L) к предложению. Подобное согласование должно обеспечивать, чтобы входной параметр был конкретизирован ко времени выполнения данного литерала. С другой стороны, выходные параметры могут быть согласованы с другими переменными позднее. Поэтому при усовершенствовании предложения выходные переменные обрабатываются по такому же принципу, как и все переменные в программе M1NIHYPER. Но ограничения на типы исключают возможность согласования переменных разных типов. Поэтому переменная X типаitem (элемент) не может быть согласована с переменной L типа list (список).
Возможные усовершенствования переменных с преобразованием в структурированные термы определяются следующим предикатом: terra: Type, Texm, Vars)
Он указывает, что переменная типа Туре в предложении может быть заменена термом Тегт; Vars — это список переменных и их типов, которые встречаются в терме Term. Поэтому в листинге 19.4 предложения
termi; list, [X|L], [ X:itera, L:Iist]). term[list, [],[]).
указывают, что переменная типа list может быть преобразована в процессе усовершенствования в терм |Х; jj, где X относится к типу item, a '. — к типу list, или что эта переменная может быть заменена константой [] (без переменных). Во всей данной главе предполагается, что символ ":" введен как инфиксный оператор. В листинге 19.4 предложение start_clause( [ mex.ber<X,L) J / [ X:iteir,, L:list]) .
объявляет форму предложений в начальных гипотезах графа усовершенствования. Каждая начальная гипотеза представляет собой список начальных предложений, количество которых не может превышать некоторого максимального количества (копий). Список начальных гипотез формируется автоматически. Максимальное количество предложений в гипотезе определяется предикатом max_clauses. Он может быть задан пользователем соответствующим образом с учетом специфики задачи обучения.
Теперь определим оператор усовершенствования программы HYPER в соответствии с приведенным выше описанием. Для усовершенствования любого предложения необходимо выполнить одно из перечисленных ниже действий,
1. Согласовать две переменные в предложении, например XI = Х2. Могут быть согласованы только переменные одного и того же типа.
2. Преобразовать в процессе усовершенствования переменную предложения в фоновый терм. При этом могут использоваться только термы, определенные предикатом term/З, а тип переменной и тип терма должны соответствовать друг другу.
3. Добавить фоновый литерал к предложению. Все входные параметры литерала должны быть согласованы (недетерминированно) с существующими переменными предложения (такого же типа).
Как и в программе MINIHYPER, для усовершенствования гипотезы .-:. в программе HYPER выбирается одно из предложений С. в гипотезе предложение : преобразуется в процессе усовершенствования в предложение С и формируется новая гипотеза Н путем замены предложения С в гипотезе :; , предложением С. В листин-
Глава 19. Индуктивное логическое программирование
re 19.5 показана последовательность усовершенствований при изучении предиката member.
Листинг 19.5.Последовательность усовершенствований от начальной гипотезы до целевой гипотезы. Обратите внимание на четвертый шаг, в котором добавлен литерал и его входной параметр немедленно согласован с существующей переменной того же типа
member[Xl,Ll). member(X2,L2).
t Усовершенствовать герм Ll = [X3|L3] member(Xl, [X3|L3]). member(X2,L2) .
4- Согласовать XI = X3 member(Xl, [Xl|L3]) . member(X2,L2).
I Усовершенствовать терм L2 = [X4[L4] member (XI, [XI iL3J ) . member(X2, [X4IL4]).
ir Ввести либерал member (X5, 1-5) и согласовать входные параметры L5 ~ L4 member(Xl, [X1IL3]). member (X2, [X4IL4]) :- member <x5rL4t,
l Согласовать Х2 = X5 member(XI, [X1IL3]) . гаеяЬегЮ, [X4|L4]> :- member <X2,L4>.
В программе HYPER к этим операциям добавлены некоторые полезные эвристические функции, которые часто позволяют намного уменьшить вычислительную сложность. Первая эвристическая функция предусматривает, что если в гипотезе Но имеется лишь одно предложение, которое охватывает отрицательный пример, то вырабатываются только усовершенствования, вытекающие из данного предложения. Причина этого состоит в том, что для получения совместимой гипотезы должно быть обязательно усовершенствовано именно такое предложение. Вторая эвристическая функция состоит в том, что отбрасываются "избыточные" предложения (которые содержат несколько копий одного и того же литерала). А третья эвристическая функция обеспечивает исключение ^удовлетворяемых предложений. Предложение является неудовлетворяемым, если его тело невозможно логически вывести с помощью предиката prove из текущей гипотезы.
Такой оператор усовершенствования предназначен для выработки наименее конкретных уточнений (Least Specific Specialization •— LSS). Уточнение И гипотезы Нс называется наименее конкретным, если не существует других уточнений гипотезы более общих, чем Н. Но в действительности рассматриваемый оператор усовершенствования позволяет лишь приблизиться к LSS. Этот оператор усовершенствования позволяет достичь I-SS только в условиях того ограничения, что количество предложений в гипотезе после усовершенствования остается тем же самым. Без этого ограничения оператор LSS должен был бы увеличивать количество предложений в гипотезе. Это может привести к созданию оператора усовершенствования, не совсем приемлемого с точки зрения практики из-за его вычислительной сложности, поскольку при его использовании количество предложений в усовершенствованной гипотезе может стать очень большим. Но ограничение, предусмотренное в данной программе, которое требует сохранения неизменного количества предложений в гипотезе после ее усовершенствования, является не слишком жестким. Если для решения требуется формирование гипотезы с большим количеством предложений, то такая гипотеза может быть выработана из другой начальной гипотезы, которая имеет достаточное количество предложений.
462Часть II. Применение языка Prolog в области искусственного интеллекта
Поиск
Поиск начинается с множества начальных гипотез. Оно представляет собой множество всех возможных мультимножеств определяемых пользователем начальных предложений, вплоть до некоторого максимального количества предложений в гипотезе. Как правило, в начальной гипотезе появляется несколько копий одного и того же начального предложения. Типичное начальное предложение представляет собой нечто довольно общее и нейтральное, такое как conc( LI, L2, L3). В процессе поиска граф усовершенствования рассматривается как дерево (если к одной и той же гипотезе ведет несколько путей, то в дереве появляется несколько копий этой гипотезы). Поиск начинается с нескольких начальных гипотез, которые становятся корнями несвязанных друг с другом деревьев поиска. Поэтому, строго говоря, пространство поиска представляет собой не дерево, а лее.
Программа HYPER выполняет поиск по заданному критерию с использованием функции оценки Cost (Hypothesis), в которой учитывается размер гипотезы (как описано ниже), а также ее точность по отношению к заданным примерам. Стоимость гипотезы Н определяется с помощью следующей простой формулы: Cost HI = мл * SizeJH) + w2 * MegCover(H>
где NegCover(H) — количество отрицательных примеров, охватываемых гипотезой Н, Определение "гипотеза Н охватывает пример Е" трактуется в рамках осторожной интерпретации ответа Answer в предикате prove. В этой формуле н и ■.■:. обозначают весовые коэффициенты. Размер гипотезы определяется как взвешенная сумма количества литералов и количества переменных в гипотезе следующим образом: Size£H> = Ь * количество^ли*ералоь(Н> + к, * количество_переменныа (н)
В коде программы HYPER, приведенном в этой главе, фактически используются следующие значения весовых коэффициентов: w: -- 1, w2 = 1С, ki = 10, к2 = 1. Это соответствует приведенной ниже формуле.
Cost(H> - количество_переменных(Н) + 10 * количество_лктералов (Н) + 10 * HegCover(H)
Эти значения весовых коэффициентов выбраны произвольным образом, но их относительные величины были интуитивно обоснованы на основании следующих рассуждений. При увеличении количества переменных в гипотезе вычислительная сложность ее обработки возрастает, поэтому количество переменных должно учитываться. Но вычислительная сложность в большей степени зависит от количества литералов, поэтому такое количество должно рассматриваться как составляющая стоимости с большим весовым коэффициентом. Любой охваченный отрицательный пример вносит такой же вклад в увеличение стоимости гипотезы, как и литерал. Это соответствует интуитивному пониманию того, что каждый дополнительный литерал должен исключать возможность охвата гипотезой, по меньшей мере, одного отрицательного примера. Проведенные эксперименты принесли довольно неожиданные результаты, согласно которым эти весовые коэффициенты можно изменять в значительных пределах без существенного воздействия на производительность поиска [18].