Проектирование экспертной системы помогающей покупателю выбрать игрушку

Страницы работы

Содержание работы

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Кафедра экономической информатики

Расчетно-графическая работа

по дисциплине:

“Интеллектуальные информационные

 системы”

Факультет:           Бизнеса

Группа:                 ФБИ-62

Выполнили:     Королькова Е.С.

                          Паладийчук И.А.

Преподаватель:    Авдеенко Т.В.

Новосибирск

2009

Создание экспертной системы продукционного типа

Задание – вспомогательное. Исследовать работу программы GENI, сначала с базой правил, хранящейся в файле   GENI.GNI, затем с базой знаний, хранящейся в файле VACATION.GNI. В первом случае путем последовательного задания уточняющих вопросов программа угадывает задуманное животное. Во втором случае программа распознает место отдыха, о котором Вы мечтаете, также предварительно задав серию вопросов.

Программа представляет собой простейшую реализацию оболочки экспертной системы продукционного типа, на основе которой в дальнейшем предполагается строить более сложную экспертную систему

При исследовании работы программы рекомендуется исследовать работу некоторых наиболее непонятных предикатов, задавая в секции Goal соответствующую данному предикату цель. Например, для понимания работы предиката reverse можно в  разделе Goal задать цель reverse([2,5,8,4],Y) (закомментировав предварительно имеющуюся там цель).

А) Результатом выполнения данного задания должно явиться четкое понимание студентом работы данной программы и что изменится, если внести в программу те или иные коррективы (поэкспериментировать самостоятельно, объяснить изменение работы программы). Необходимо также нарисовать дерево вызова целей данной программы

Б) Необходимо для каждой из двух баз знаний построить дерево вывода на знаниях, а также аргументировано ответить на вопрос, прямая или обратная цепочка рассуждений используется в программе.

Задание - основное. По аналогии с программой GENI и лабораторной работой №3 написать программу, реализующую экспертную систему в выбранной Вами предметной области.

Отличием от программы GENI в Вашей программе должно явиться наличие достаточно объемной базы данных (как в 3 л.р.), т.е. базы фактов, хранящейся в файле. Заметим, что в программе  GENI имеется только база знаний в виде правил, а подтверждение фактов запрашивается у пользователя. Вы в своей программе можете основную (статическую) часть фактов хранить в базе данных, а некоторые подтверждения (динамическая часть фактов) запрашивать у пользователя экспертной системы.

Для того, чтобы экспертная система не выдавала только тривиальные, заведомо понятные решения, база знаний (база правил) должна быть достаточно объемной (около 50 правил, но не менее 30).

Провести тестирование построенной экспертной системы. Сделать выводы.

Выбрано: Система помогающая выбрать игрушку покупателю.

Текст программы:

GAME.PRO

domains

  CONDITIONS = CNO*

  HISTORY = RNO*

  RNO, CNO, FNO = INTEGER

  CATEGORY = STRING

  SLIST = STRING*

database - game

  rule(RNO,CATEGORY,CATEGORY,CONDITIONS)

  cond(CNO,STRING)

  topic(STRING maingoal)

database - tmp

  yes(CNO)

  no(CNO)

  fact(FNO,CATEGORY,CATEGORY)

predicates

  nondeterm go(HISTORY,CATEGORY)

  выбрать(RNO,HISTORY,CONDITIONS)

  notest(CNO)

  genq(HISTORY,RNO,CNO,STRING)

  задать_вопрос(HISTORY,RNO,STRING,CNO,INTEGER)

  sub_cat(CATEGORY,CATEGORY,CATEGORY)

  show_conditions(CONDITIONS,string)

  show_rule(RNO,string)

  reverse(CONDITIONS,CONDITIONS)

  reverse1(CONDITIONS,CONDITIONS,CONDITIONS)

  report(HISTORY,string)

clauses

  go(_,Mygoal):-

            not(rule(_,Mygoal,_,_)),

            !,

            nl,

            write("Ответ: ",Mygoal),nl,nl,

            !.

  go(HISTORY,Mygoal):-

            rule(RNO,Mygoal,NY,COND),

            выбрать(RNO,HISTORY,COND),

            go([RNO|HISTORY],NY).

  выбрать(RNO,HISTORY,[CNO|REST]):-

            yes(CNO),

            !,

            выбрать(RNO,HISTORY,REST).

  выбрать(_,_,[CNO|_]):-

            no(CNO),

            !,

            fail.

  выбрать(RNO,HISTORY,[CNO|REST]):-

            cond(CNO,NCOND),

            fronttoken(NCOND,"not",_COND),

            frontchar(_COND,_,COND),

            cond(CNO1,COND),

            notest(CNO1),

            !,

            выбрать(RNO,HISTORY,REST).

  выбрать(_,_, [CNO|_]):-

            cond(CNO,NCOND),

            fronttoken(NCOND,"not",_COND),

            frontchar(_COND,_,COND),

            cond(CNO1,COND),

            yes(CNO1),

            !,

            fail.

  выбрать(RNO,HISTORY,[CNO|REST]):-

            cond(CNO,TEXT),

            !,

            genq(HISTORY,RNO,CNO,TEXT),

            выбрать(RNO,HISTORY,REST).

  выбрать(_,_,[]).

  notest(CNO):-

            no(CNO),

            !.

  notest(CNO):-

            not(yes(CNO)),

            !.

  genq(HISTORY,RNO,CNO,TEXT):-

            write(TEXT," (Yes/No/Why):"),

            readchar(CH),

            upper_lower(CH,CHOICE),

            задать_вопрос(HISTORY,RNO,TEXT,CNO,CHOICE).

  задать_вопрос(_,_,_,CNO,'y'):-

            !,

            assert(yes(CNO)),

            write("Yes\n").

  задать_вопрос(_,_,_,CNO,'n'):-

            !,

            assert(no(CNO)),

            write("No\n"),

            fail.

  задать_вопрос(HISTORY,RNO,TEXT,CNO,'w'):-

            !,

            write("Why\n"),

            rule(RNO,Mygoal1,Mygoal2,_),

            !,

            sub_cat(Mygoal1,Mygoal2,Lstr),

            concat("Попытаюсь вам объяснить: ",Lstr,Lstr1),

            concat(Lstr1,"\nИспользуется правило ",Ls1),

            str_int(Str_num,RNO),

            concat(Ls1,Str_num,Ans),

            show_rule(RNO,Lls1),

            concat(Ans,Lls1,Ans1),

            report(HISTORY,Sng),

            concat(Ans1,Sng,Answ),

            write(Answ),

            nl,

            genq(HISTORY,RNO,CNO,TEXT).

  задать_вопрос(_,_,_,_,_):-

            write("\nOK, we are Terminating\n"),

            exit.

Похожие материалы

Информация о работе