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