- •Введение
- •1. Задачи искуственного интеллекта
- •1.1. Представление задачи ии в виде пространства состояний. Поиск в глубину
- •1.1.1. Пространство состояний
- •1.2. Поиск в ширину в пространстве состояний. Поиск путей-кандидатов
- •1.2.1. Рекурсивная процедура поиска в ширину
- •1.2.2. Множества начальных вершин, прямой и обратный поиск
- •1.3. Поиск в ширину. Древовидное представление множества путей-кандидатов
- •1.3.1. Представление деревьев
- •1.3.2. Поиск в ширину с древовидным представлением путей кандидатов
- •1.4. Эвристический поиск
- •1.4.1. Различные стратегии управления поиском в пространствах состояний
- •1.4.2. Применение оценочных функций при эвристическом поиске
- •1.4.4. Монотонное ограничение h-функции
- •1.5. Программная реализация эвристического поиска. Игра в «8»
- •1.5.2. Основные процедуры эвристического поиска
- •1.5.3. Пространство состояний игры в «8»
- •1.5.4. Стратегия поиска
- •1.5.5. Листинг основного модуля эвристического поиска
- •1.6. Системы продукций. И-или графы
- •1.6.1. Системы продукций
- •1.6.2. Разложимые системы продукций
- •1.6.3 Дерево решения
- •1.7. Стратегии управления поиском на и-или графах
- •1.7.1. Представление задачи в виде и-или графов
- •1.7.2. Поиск в глубину на и-или графе
- •1.8. Эвристический поиск на и-или графах
- •1.8.1. Эвристическая оценочная функция для и-или графов
- •1.8.3. Некоторые свойства ао*-алгоритма
- •1.8.4. Программная реализация эвристического поиска на и-или графе
- •1.8.5. Задача о мостах
- •2. Экспертные системы
- •2.1. Общие сведения об экспертных системах
- •2.1.1. Характеристики экспертных систем
- •2.2. Архитектура эс, основанных на правилах
- •2.2.1. Структура экспертной системы
- •2.2.2. Эс «Угадай животное»
- •2.3. Экспертные системы, основанные на логике (фактах)
- •2.3.1. Структура экспертной системы, основанной на фактах
- •2.3.2. Механизм логического вывода эс, основанных на фактах
- •2.3.3. Сохранение трассы вывода при доказательстве цели
- •2.4. Вывод в условиях неопределенности
- •2.4.1. Общие проблемы
- •2.4.2. Точное вероятностное рассуждение
- •2.4.3. Схемы приближенных рассуждений
- •2.4.4. Биполярные схемы для коэффициентов определенности
- •2.4.5. Обратимые и необратимые правила
- •2.5. Сети вывода
- •2.5.1. Многоступенчатые рассуждения
- •2.5.2. Механизм объяснений
- •Библиографический список
2.2.2. Эс «Угадай животное»
Система пытается угадать задуманное животное, запрашивая у пользователя необходимую информацию и сохраняя полученные ответы. Каждое животное описывается рядом признаков, которыми оно обладает или нет. Информацию о наличии или отсутствии признаков система получает от пользователя. Получив у пользователя ответ на вопрос, система сохраняет его в динамической базе данных (ДБД), чтобы затем неоднократно использовать его в своих рассуждениях.
Например, факт, что животное имеет шерсть, будет записан в ДБД следующим образом:
dpositive("имеет", "шерсть").
В своих рассуждениях система будет использовать ответы пользователя в предикатах positive и negative. Например, ответ, что животное имеет шерсть, будет считан в предикат positive(«имеет», «шерсть»).
Главная цель имеет вид:
goal
animal_is(X), write(X).
Во время сеанса с пользователем главная цель поочередно сопоставляется с каждым правилом определения животного из базы знаний. Приведем в качестве примера правило определения тигра:
animal_is("тигр") :-
it_is("млекопитающее"),
it_is("плотоядное"),
positive("имеет","желтовато-коричневый цвет"),
positive("имеет","черные полосы").
Легко заметить, что подцели в теле правила имеют разные типы. Цели типа positive и negative — это описание конечных признаков животного, они соответствуют тем вопросам, которые система непосредственно задает пользователю.
Цели типа it_is — это выбор подкатегории. Пользователю не задается вопрос типа «Является ли задуманное животное млекопитающем?». Система находит в базе знаний правило описания млекопитающего
it_is("млекопитающее") :-
positive("имеет","шерсть"),!.
Затем система задает пользователю вопрос «Имеет ли задуманное животное шерсть?». В конечном итоге все подцели сведутся к целям типа positive и negative.
Самое главное, что следует выделить в работе экспертной системы — это ее способность задавать вопросы сообразно ситуации и способность работать с неполной и даже недостоверной информацией. Рассмотрим следующую ситуацию.
Для доказательства подцели, что животное является плотоядным, система задает пользователю вопрос «Ест ли задуманное животное мясо?». Предположим, что пользователь задумал тигра, но никогда не видел, чтобы тигр кого-либо ел, и поэтому отвечает «Нет». На этом месте любая программа, которая просто задает вопросы согласно проверочному списку, будет не в состоянии получить правильный результат, что задуманное животное — тигр. В экспертной системе, основанной на правилах, изначально заложена возможность доказательства цели с помощью разных правил. Получив ответ «Нет», система его игнорирует (так как пользователь не обязан обладать полной и достоверной информацией!) и находит в базе знаний следующее правило определения плотоядного:
it_is("плотоядное") :-
positive("имеет","острые зубы"),
positive("имеет","когти"),
positive("имеет","впередсмотрящие глаза").
Затем пользователь получает три новых вопроса: имеет ли животное острые зубы, когти и впередсмотрящие глаза. Если на все три вопроса будет получен ответ «Да», то система приходит к выводу, что задуманное животное — хищник.
/* "Птица, зверь или рыба" */
predicates
animal_is(symbol)
it_is(symbol)
positive(symbol, symbol)
negative(symbol, symbol)
ask(symbol,symbol,symbol)
remember(symbol,symbol,symbol)
clear_facts
run
% описание предикатов базы данных
database
dpositive(symbol,symbol)
dnegative(symbol,symbol)
% цель
goal
clear_facts,
run.
% факты и правила
clauses
% база знаний
animal_is("гепард") :-
it_is("млекопитающее"),
it_is("плотоядное"),
positive("имеет","желтовато-коричневый цвет"),
positive("имеет","темные пятна").
animal_is("тигр") :-
it_is("млекопитающее"),
it_is("плотоядное"),
positive("имеет","желтовато-коричневый цвет"),
positive("имеет","черные полосы").
animal_is("жираф") :-
it_is("копытное"),
positive("имеет","длинную шею"),
positive("имеет","длинные ноги"),
positive("имеет","темные пятна").
animal_is("зебра") :-
it_is("копытное"),
positive("имеет","черные полосы").
animal_is("страус") :-
it_is("птица"),
negative("может","летать"), % не летает
positive("имеет","длинную шею"),
positive("имеет","длинные ноги"),
positive("имеет","черно-белый цвет").
animal_is("пингвин") :-
it_is("птица"),
negative("может","летать"), % не летает
positive("может","плавать"),
positive("имеет","черно-белый цвет").
animal_is("альбатрос") :-
it_is("птица"),
positive("может","хорошо летать").
it_is("млекопитающее") :-
positive("имеет","шерсть"),!.
it_is("млекопитающее") :-
positive("может","давать молоко").
it_is("птица") :-
positive("имеет","крылья"),!.
it_is("птица") :-
positive("может","летать"),
positive("может","нести яйца").
it_is("рыба") :-
positive("может","плавать"),
positive("имеет", "плавники").
it_is("плотоядное") :-
positive("может", "есть мясо"),!.
it_is("плотоядное") :-
positive("имеет","острые зубы"),
positive("имеет","когти"),
positive("имеет","впередсмотрящие глаза").
it_is("копытное") :-
it_is("млекопитающее"),
positive("имеет","копыта"),!.
it_is("копытное") :-
it_is("млекопитающее"),
positive("может", "жевать траву").
/* Поиск в ДБД ответов пользователя. В случае отсутствия информации система задает вопрос и запоминает ответ*/
positive(X, Y) :-
dpositive(X, Y), !. % в ДБД есть ответ "да"
positive(X, Y) :-
not(dnegative(X, Y)), % в ДБД нет ответа "нет"
ask(X, Y, yes),!. % в ДБД был записан ответ "да"
positive(X, Y) :-
not(dnegative(X, Y)), % в ДБД нет ответа "нет"
remember(X,Y,no),!, % в ДБД был записан ответ "нет"
fail.
negative(X, Y) :-
dnegative(X, Y), !.
negative(X, Y) :-
not(dpositive(X, Y)),
ask(X, Y, no),!.
negative(X, Y) :-
not(dpositive(X, Y)),
remember(X,Y,yes),!,
fail.
% задание вопросов и анализ ответов
ask(X, Y, yes) :-
!, write(X," ", Y, '\n'),
readln(Reply),
upper_lower(Reply,Reply1),
frontchar(Reply1, 'y', _),
remember(X, Y, yes),!.
ask(X, Y, no) :-
!, write(X, " ", Y), nl,
readln(Reply),
upper_lower(Reply,Reply1),
frontchar(Reply1, 'n', _),
remember(X, Y, no),!.
% запись ответов в ДБД
remember(X, Y, yes) :-
assertz(dpositive(X,Y)),!.
remember(X, Y, no) :-
assertz(dnegative(X,Y)),!.
% очистка ДБД
clear_facts:-
retractall(_).
% запуск программы
run :-
animal_is(X), !, nl,
write("Ваше животное ", X),
nl, save("animal.dat"),clear_facts,
write("Нажмите пробел"),readchar(_).
run :-
nl, write("Ваше животное невозможно определить"),
nl, save("animal.dat"),
clear_facts, write("Нажмите пробел"),
readchar(_).
Задание. Дополнить базу знаний ЭС «Птица, зверь или рыба» следующими правилами:
Правилами для определения двух новых подкатегорий «дикое» и «домашнее».
Правилом определения домашней кошки.
Правилом определения любого животного, отсутствующего в базе знаний.