Листинг 19.8. Изучение предиката path, предназначенного для поиска пути в графе
% Изучение предиката path[StartNode,GoalNode,Path), предназначенного % для поиска пути в графе
Ь Ориентированный граф
link ta,b) .
11ПК ^а f o^ -
link(b,с) -link(b,d) . link(d,e >.
backliteral( link[X,Y), [ X:item], [ Y:item] ) . backliteral( path{X, i, L) , [ X:item], [ Y:item, L:list]).
term£ list, [X|L], [ X:item, L:list]}. termt list, [] , [] ) .
prolog_predicate( link(X,Y)}.
start_clause( [ path{X,Y,L)] / [X : item,Y;item,L:list] >.
'i Примеры
ex( path( a, a, [a]}).
ex( path( b, b, [b]) ) .
ex{ path) e, e, [el) ) .
ex(path{ f, f,[f])) .
ex (path{ a, c,[a,c]) } .
ex< path( b, e, [b,d,e)) ) .
ex( path{ a, e, [a,b,d,*]) ) .
Ш>. [b])). [b,b]] ) . [e,d] ) ). [a,b,c])} |
next path( a, a,
next path( a, a,
next path ( a, a,
next patht e, d,
nex<path ( a, d,
U path ( a, e, (a])). nex( patht a, c, [a,c,a,c]) next patht a, d, Ea,d] ) ).
Последняя строка в логически выведенном определении может на первый взгляд показаться неожиданной, но в данном контексте она фактически эквивалентна ожидаемому значению path (В, С, [В|Е] I . Для получения последнего варианта требуется, чтобы количество этапов усовершенствования было на единицу меньше. Тот факт, что в этом процессе поиска было усовершенствовано только 35 гипотез, может показаться довольно удивительным, если принять во внимание следующие факты. Глубина усовершенствования приведенной выше гипотезы path, обнаруженной в процессе поиска, равна 12, а результаты оценки показывают, что размер дерева усовершенствования на этой глубине превышает 10'" гипотез! Но фактически выполнен поиск лишь в очень небольшой части этого пространства. Такие результаты можно объяснить тем, что в данном случае требования к полноте гипотезы ограничивают поиск особенно эффективно.
Изучение предиката, предназначенного для сортировки по методу вставки
Определение этой задачи обучения приведено в листинге 19.9. Данное определение нельзя назвать бесспорным, поскольку в нем фоновые знания весьма конкретно направлены на логический вывод процедуры сортировки по методу вставки. Напрашивается замечание, что при таком определении фоновых знаний мы практически уже были обязаны знать решение. Но такая постановка может служить иллюстраци-
Часть II. Применение языка Prolog в области искусственного интеллекта
ей типичной постановки задачи в области машинного обучения. Для того чтобы обучение было наиболее эффективным, мы должны передать программе обучения настолько качественное представление задачи, насколько это возможно, включая фоновые знания. Это неизбежно требует от пользователя размышлений по поводу возможных решений. В данном случае, в котором рассматривается поиск алгоритма сортировки, задача обучения была бы очень сложной без подобного полезного определения фоновых знаний. Но даже в этом случае оказывается, что рассматриваемая задача является наиболее сложной среди всех проведенных до сих пор экспериментов. Код, показанный в листинге 19.9, требует дополнительных комментариев. Дело в том, что в терме sort(Ll,L2) параметр L1, согласно принятому предположению, должен быть конкретизирован, тогда как L2 — это выходной параметр, который конкретизируется после вызова на выполнение процедуры sort. Для того чтобы логически выведенная процедура sort могла действовать при неконкретизированном параметре L2, один из примеров задан следующим образом:
ех( [ sort ( [c , a , b ] , L), L = [a,b,c] ] ) .
Листинг19.9. Изучение процедуры сортировки по методу вставки
% Изучение процедуры сортировки
backliteraK sort ( L, S), [L:list], [S:list]).
backliteraK insert_sorted( X, Ll, L2), [X:item, Ll:list], [L2:list]).
termf list, [X | L], [X:item, L: 1ist]) . termf list, [] , []) .
prolog_predicate( insert_sorted( x, lo, l)) . prolog_predicate ( x=y) .
start_clause( [sort (L1,L2) ] / [Ll:list, L2:1ist] ).
ex( sort ( [] , [] ) ) .
ex( sort ( [a], [a])) .
] ). % Второй параметр процедуры sort % неконкретизирован! |
ex( [ sort ( [c,a,b], L) , L = [a,b,c]
ex( sort ( [b,a,c] , [a,b,c])) .
ex( sort ( [c,d,b,e,a], [a,b,c,d,e])).
ex(sort( [a,d,c,b], [a,b,c,d])).
nex ( sort( [] , [a])) .
nex( sort ( [a,b] , [a])) .
nex( sort( [a,c], [b,c])).
nex ( sort ( [b,a,d,c], [b,a,d,c])).
nex( sort( [a,c,b], [a,c,b])).
nex( sort( [], [b,c,d])).
insert sorted( x, L, _) :- % "Защитное" предложение: проверка конкретизации
% параметров var(X) , ! , fail
var ( L ) , ! , fail
L = [Y|_] , var (Y) , ! , fail .
insert_sorted( X, [], [X]) :- !.
insert_sorted( X, [Y | L] , [X,Y | L]) :-
X @< Y, !. % Терм X "лексикографически предшествует" терму Y
insert_sorted( X, [Y I Li , [Y I Ll] ) :-insert_sorted ( x, l, Ll) .
Глава 19. Индуктивное логическое программирование
Это позволяет обеспечить возможность вызова процедуры sort с неконкретизиро-ванкым значением L, так, чтобы sort сформировала (а не просто распознала!) результат L и только после этого проверила его правильность. Необходимо также соблюдать осторожность при определении фонового предиката insert_sorted(X,Llp L2), чтобы можно было обеспечить конкретизацию параметров в соответствии с ожидаемым (например, X не является переменной). Полученные результаты приведены ниже.
Hypotheses generated: 3708 hypotheses refined: 2Ё4 To be refined:448
sort ( [],[]) . sort[[ft IB],D) ;-sort(B,C) ,
insert_sorted(A,C,D).
Изучение предиката, позволяющего распознать конструкцию арки
Эта задача обучения аналогична задаче реляционного обучения, описанной в главе 18, в которой в качестве примеров применяются конструкции, выполненные из блоков (рис. 19.2), и существует иерархия между типами блоков (которая определяется предикатом а ко [X, Y) — Y представляет собой разновидность (ако — a kind of) X; это отношение аналогично показанному на рис. 18.6). Примеры описывают конструкции, состоящие иа трех блоков. Первые два блока из трех определяют стойки арки, а третий блок определяет перекрытие. Поэтому одним из положительных примеров является crch(al,bl, cl), где а', Ы и с] — прямоугольные блоки, cl опирается на &1 и Ы, а между al и Ы ме определено отношение touch (соприкасается). Блоки а2, Ь2 и с2 образуют отрицательный пример (пех (а2,Ь2, c2J), поскольку блок с.2 не опирается на а2 и Ь2. Блоки а5, Ь5 и с5 образуют еще один отрицательный пример, поскольку с: не соответствует определению "устойчивого многоугольного блока". Определение задачи обучения распознаванию арки приведено в листинге 19.10. Фоновые предикаты в этом листинге включают также отрицание (not), которое применено к предикатам touch/2 и support/2. Такой фоновый предикат, как обычно, выполняется непосредственно интерпретатором Prolog по принципу отрицания как недостижения цели. В отличие от рис. 18.4, на рис. 19.2 количество отрицательных примеров увеличено для ограничения возможности выбора совместимых гипотез. Результат обучения приведен ниже.
Ij
Al
ы
ь>
С2
сД | с4 | \ | с5 | / | |||||||
аЗ | ЬЗ | а4 | Ь4 | »5 | Ь5 | ||||||
Рис. 19.2. Мир блоков с двумя положительными и тремя отрицательными примерами арки. Блоки al, Ы и cl показывают один положительный пример, а блоки а4, Ы и ей — второй. Один из отрииатслъныхпримеров показывают блоки а2, Ь2 и с2
Часть II. Применение языка Prolog в области искусственного интеллекта
Hypotheses generated: 368 Hypotheses refined: 10 To be refined: 151
arch{RrВr Cl : -support(B,C), not touch(A,B), support(A,C), isa{C, stable_pcly)
Арка состоит из стоек А, В и перекладины С
С опирается на В
А и Б не соприкасаются
С опирается на А
С - устойчивый многоугольный блок