Листинг 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 или добавления нового фонового литерала к