- •Введение в экспертные системы
- •1.Что такое экспертная система?
- •2.Экспертные системы как один из видов программ искусственного интеллекта
- •3. Ориентированный на человека диалог
- •4. Структура экспертных систем
- •5. Представление знаний
- •6. Методы вывода
- •7. Система пользовательского интерфейса
- •8. Экспертные системы, базирующиеся на правилах
- •9. Рекомендации по разработке экспертных систем
- •10. База знаний для определения вида животного
- •11. Проектирование и реализация системы, базирующейся на правилах
- •12. Варианты заданий
11. Проектирование и реализация системы, базирующейся на правилах
После того как спроектирована база знаний, можно начинать писать на Турбо-Прологе программу для манипулирования ею. Для простоты и большей ясности в программе, которая рассматривается в этом разделе, основное внимание уделяется процессам, возникающим во время консультации с экспертной системой. Эти процессы включают управление потоком данных, поступающих от пользователя, получение информации из базы данных и выдачу результатов консультации.
Теперь можно разработать структурную схему, чтобы зафиксировать организацию программных модулей и правил. Рис.4 показывает результирующую структурную схему. На рис. 4 можно видеть, что главным модулем (или целью) является run. Модули ask(X,Y) (спроси) и remember(X,Y,Reply) (запомни) управляют потоком данных от пользователя. Другие модули обновляют рабочие данные и выдают результаты консультации.
Используя эту схему, вы можете теперь разработать экспертную систему на Турбо-Прологе, базирующуюся на правилах. Сначала необходимо сделать декларации базы данных. База данных будет хранить ответы пользователя на вопросы системы пользовательского интерфейса (СПИ). Эти данные являются утвердительными или отрицательными ответами. Далее нужно объявить предикаты для выполнения вывода (машина вывода) и взаимодействия с пользователем (система пользовательского интерфейса).
Рис.4. Структурная диаграмма для экспертной системы «Животные»
Все вместе - это следующие декларации:
database
xpositive(symbol,symbol)
xnegative(symbo1,symbo1)
predicates
run
ask(symbol,symbol)
animal_is(symbol)
it_is(symbol)
positive(symbo1,symbo1)
negative(symbo1,symbo1)
remember(symbo1,symbo1,symbo1)
clear_facts
Предикаты базы данных xpositive и xnegative используются для хранения утвердительных и отрицательных ответов пользователя. Первые четыре предиката нужны для взаимодействия с пользователем, а остальные шесть - для механизма вывода.
Должны быть составлены семь продукционных правил: по одному для каждого вида. Каждое правило должно идентифицировать вид по признаку принадлежности к группе млекопитающих или птиц, а для млекопитающих так же – к группе плотоядных или травоядных. Как следует из данных и показано на древовидной структуре, это - главные подкатегории (см. рис. 3). Здесь идентификацию производит правило it_is. Затем правило positive идентифицирует характеристики животного в каждом отдельном случае. И it_is, и positive используются механизмом вывода.
Механизм вывода должен иметь правила для управления данными, вводимыми пользователем, чтобы сопоставлять их с продукционными правилами и сохранять "трассу" (или запоминать) отрицательных и утвердительных ответов. Правила positive и negative используются для сопоставления данных пользователя с данными в продукционных правилах. Правило remember (запоминание) производит добавление утверждений с ответами «да» и «нет», которые могут использоваться при сопоставлении с образцом:
positive(X,Y) :-
xpositive(X,Y),!. positive(X,Y) :-
not(negative(X,Y)),!,
ask(X,Y).
negative(X,Y) :-
xnegative(X.Y),!.
remember(X,Y,yes) :-
asserta(xpositive(X,Y)). remember(X,Y,no) :-
asserta(xnegative(X,Y)), fail.
clear_facts :-
retract(xpositive(_,_)), fail.
clear_facts :-
retract(xnegative(_,_)), fail.
Назначение системы пользовательского интерфейса (СПИ) - связать вводимые пользователем данные с системой логического вывода. Связь осуществляет главный модуль run. Модуль ask(X,Y) (спроси) запрашивает данные у пользователя и сохраняет ответы в базе знаний.
run:- animal_is(X),!,
write("\n Ваше животное - ",X),
nl,nl,clear_facts.
run:-write("\n Невозможно определить "),
write("какое животное Вы имеете в виду. \n\n"),clear_facts.
ask(X,Y):-
write(X," оно ",Y,"?\n"),
readln(Reply),
remember(X,Y,Reply).
Консультирующий модуль run имеет две альтернативные формы. Первая взаимодействует с механизмом вывода; если результат цикла «распознавание – действие» - положительный, то результат сообщается пользователю. Вторая форма сообщает о негативном результате.
Построим экспертную систему, способную определить одного из 7 животных, которых загадал пользователь. Она будет задавать вопросы, делая выводы из полученных ответов. Типичный диалог с этой системой имеет вид:
Goal: run
имеет ли шерсть?
да
Ест ли мясо?
да
Желтовато-коричн. цвета?
да
Имеет ли темные пятна?
да
Ваше животное - гепард!
Нашим первым шагом будет создание базы знаний, структура которой представлена на рис.3. Можно добавлять факты в нашу базу данных с помощью стандартного предиката asserta.
asserta(xpositive(“имеет”, “черные полосы”))
Для этого xpositive должен быть объявлен в начале программы в секции database:
domains
...
database
xpositive(symbol,symbol)
predicates
...
clauses
...
Предложения предиката, описанного в секции database не должны содержать правил (только факты). Наше описание базы данных будет иметь следующий вид:
xpositive(symbol,symbol)
xnegative(symbol,symbol)
Связь между предикатами xpositive и positive устанавливается первым правилом для предиката positive
positive(X,Y) if xpositive(X,Y),!.
Другими словами предикат xpositive базы данных эквивалентен предикату positive. Также имеем аналогичные правила для negative:
negative(X,Y) if xnegative(X,Y),!.
Следующее правило предиката positive будет запрашивать у пользователя информацию, если еще нет данных, опровергающих конкретный факт:
positive(X,Y) if
not(xnegative(X,Y)) and ask(X,Y,yes).
Второе правило для предиката negative аналогично
negative(X,Y) if
not(xpositive(X,Y)) and ask(X,Y,no).
Предикат ask задает вопрос и запоминает ответ. Для начала работы программы нужно задать цель run.
Предикат clear_facts удаляет факты, которые мы, возможно, добавим в базу данных в процессе работы.
Таким образом, на выполнение последующих целей не будет оказываться влияние (первоначальная информация не будет искажена). После уничтожения этих фактов clear_facts ожидает нажатия пробела для возврата в систему Турбо Пролога.
/**********Экспертная система «Животные»*********************/
database
xpositive(symbol,symbol)
xnegative(symbol,symbol)
predicates
run
animal_is(symbol)
it_is(symbol)
positive(symbol,symbol)
negative(symbol,symbol)
clear_facts
remember(symbol,symbol,symbol)
ask(symbol,symbol)
clauses
/***********************Оболочка ********************************/
run:- animal_is(X),!,
write("\n Ваше животное - ",X),
nl,nl,clear_facts.
run:-write("\n Невозможно определить "),
write("какое животное Вы имеете в виду. \n\n"),clear_facts.
positive(X,Y) if xpositive(X,Y),!.
positive(X,Y) if not(xnegative(X,Y)) and ask(X,Y).
negative(X,Y) if xnegative(X,Y),!.
negative(X,Y) if not(xpositive(X,Y)) and ask(X,Y).
ask(X,Y):-
write(X," оно ",Y,"?\n"),
readln(Reply),
remember(X,Y,Reply).
remember(X,Y,"да"):-asserta(xpositive(X,Y)).
remember(X,Y,"нет"):-asserta(xnegative(X,Y)),fail.
clear_facts:-retract(xpositive(_,_)),fail.
clear_facts:-retract(xnegative(_,_)),fail.
clear_facts:-write("\n\n Нажмите пробел, чтобы выйти из программы."), readchar(_).
/************** База знаний************************************/
animal_is("гепард") if
it_is("млекопитающее") and
it_is("плотоядное") and
positive("имеет","рыжевато-коричневый цвет") and
positive("имеет","темные пятна").
animal_is("тигр") if
it_is("млекопитающее") and
it_is("плотоядное") and
positive("имеет","рыжевато-коричневый цвет") and
positive("имеет","темные полосы").
animal_is("жираф") if
it_is("травоядное") and
positive("имеет","длинную шею") and
positive("имеет","длинные ноги") and
positive("имеет","темные пятна").
animal_is("зебра") if
it_is("травоядное") and
positive("имеет","черные полосы").
animal_is("пингвин") if
it_is("птица") and
positive(" ","не летает") and
positive(" ","плавает") and
positive("имеет","черный и белый цвета").
animal_is("страус") if
it_is("птица") and
positive(" ","не летает") and
positive("имеет","длинную шею") and
positive("имеет","длинные ноги") and
positive("имеет","черный и белый цвета").
animal_is("альбатрос") if
it_is("птица") and
positive(" ","летает хорошо").
it_is("млекопитающее") if
positive("имеет","шерсть").
it_is("млекопитающее") if
positive(" ","дает молоко").
it_is("птица") if
positive("имеет","перья").
it_is("птица") if
positive(" ","летает") and
positive(" ","кладет яйца").
it_is("плотоядное") if
positive(" ","ест мясо").
it_is("плотоядное") if
positive("имеет","острые зубы") and
positive("имеет","лапы") and
positive("имеет","глаза спереди").
it_is("травоядное") if
it_is("млекопитающее") and
positive("имеет","копыта").
it_is("травоядное") if
it_is("млекопитающее") and
positive(" ","жует жвачку").
