Листинг 19,3. простая программа ilp- minihyper
% Программа MINIHYPER
% induce £ Hyp) :
% осуществляет логический вывод совместимой и полной гипотезы Hyp путем
4 постепенного усовершенствования нлча.."::. гипотез
induce! Hyp) :-
iter_deep( Кур, 0) . 4 Итеративное углубление, начиная
% с максимальной глубины 0
iter_deep( Hyp, MaxD) :-
write I 'MaxD = '!, write { MaxD), nl,
start_hyp( HypOi,
coir.plete{ HypO) г % Гипотеза ИурО охватывает все положительные примеры
depth_first( HypO, Hyp, KaxD) % Поиск в глубинус ограничением глубины
NewMaxD is MaxD + 1, iter_deepi Hyp, KewMaxD).
% depth_first! HypO, Hyp, MaxD] :
Ч преобразует гипотезу HypO путем усовершенствования в совместимую
% и полную гипотезу Hyp не больше чем за MaxD шагов
454Часть II.Применение языка Prolog в области искусственного интеллекта
depth_first( Hyp, Hyp, _) :-consistent( Hyp) .
depth_first( HypO, Hyp, MaxDO) :-MaxDO > 0, MaxDl is MaxDO - 1, refine_hyp( HypO, Hypl),
complete ( Hypl) , % Гипотеза Hypl охватывает все положительные примеры depth_first( Hypl, Hyp, MaxDl).
complete( Hyp) :- % Гипотеза Hyp охватывает все положительные примеры
not (ex( E) , % Положительный пример
once ( prove ( Е, Hyp, Answer)), % Доказать его с помощью гипотезы Hyp
Answer \== yes). % Возможно, что доказательство не найдено
consistent( Hyp) :- % Возможно, что гипотеза не охватывает ни одного
% отрицательного примера
not (nex( E) , % Отрицательный пример
once ( prove ( Е, Hyp, Answer)), % Доказать его с помощью гипотезы Hyp
Answer \= = no) . % Возможно, доказательство существует
% refine_hyp( HypO, Hyp) :
% предикат, который позволяет усовершенствовать гипотезу НурО
% и получить гипотезу Hyp
refine_hyp( HypO, Hyp) :-
conc( Clausesl, [ClauseO/VarsO | Clauses2], HypO), % Выбрать предложение
% ClauseO из гипотезы НурО conc( Clausesl, [Clause/Vars | Clauses2], Hyp), % Новая гипотеза refine ( ClauseO, VarsO, Clause, Vars) . % Усовершенствовать предложение Clause
% refine ( Clause, Args, NewClause, NewArgs) :
% предикат, который позволяет усовершенствовать предложение Clause
% с параметрами Args и получить предложение NewClause с параметрами NewArgs
% Усовершенствовать по методу согласования параметров
refine( Clause, Args, Clause, NewArgs) :-
conc( Argsl, [A | Args2], Args), % Выбрать переменную А
member( A, Args2), % Согласовать ее с другой переменной
conc( Argsl, Args2, NewArgs).
% Усовершенствовать по методу добавления литерала
refine( Clause, Args, NewClause, NewArgs) :-length( Clause, L), max_clause_length ( MaxL) , L < MaxL,
backliteraM Lit, Vars), % Литерал с определением фоновых знаний
cone( Clause, [Lit], NewClause), % Добавить литерал к телу предложения
cone( Args, Vars, NewArgs). % Добавить переменные литерала
% Значения параметров, заданные по умолчанию
max_proof_length( б) . % Общая длина доказательства с учетом вызовов
% предикатов, отличных от предикатов Prolog
max_clause_length( 3) . % Максимальное количество литералов в теле предложения
•
•
refine ( Clause, Vars, NewClause, NewVars). Позволяет усовершенствовать заданное предложение Clause с помощью переменных Vars и выработать усовершенствованное предложение NewClause с новыми переменными NewVars . Усовершенствованное предложение формируется путем согласования двух переменных в списке Vars или добавления нового фонового литерала к