Категория
|
Решаемая проблема
|
Интерпретация
|
Описание ситуации по информации, поступающей от датчиков
|
Прогноз
|
Определение вероятных последствий заданных ситуаций
|
Диагностика
|
Выявление причин неправильного функционирования системы по
наблюдениям
|
Проектирование
|
Построение конфигурации объектов при заданных ограничениях
|
Планирование
|
Определение последовательности действий
|
Наблюдение
|
Сравнение результатов наблюдений с ожидаемыми результатами
|
Отладка
|
Составление рецептов исправления неправильного
функционирования системы
|
Выполнение последовательности предписанных исправлений
|
Обучение
|
Диагностика и исправление поведения обучаемого
|
Управление
|
Управление поведением системы как целого
|
1.3 Классификация экспертных систем
Классификация ЭС по решаемой задаче:
· Интерпретация данных
· Диагностирование
· Мониторинг
· Проектирование
· Прогнозирование
· Сводное Планирование
· Обучение
· Управление
· Ремонт
· Отладка
Классификация ЭС по связи с реальным временем:
· Статические ЭС - это ЭС, решающие задачи в условиях не
изменяющихся во времени исходных данных и знаний.
· Квазидинамические ЭС
· Динамические ЭС - это ЭС, решающие задачи в условиях
изменяющихся во времени исходных данных и знаний.
2. СРЕДЫ РАЗРАБОТКИ
Интегрированная среда разработки, ИСР (англ. IDE, Integrated development
environment или integrated debugging environment) - система программных
средств, используемая программистами для разработки программного обеспечения
(ПО).
Обычно среда разработки включает в себя:
· текстовый редактор
· компилятор и/или интерпретатор
· средства автоматизации сборки
· отладчик.
2.1 Язык логического программирования Пролог
Пролог (фр. Program mationen Logique) - язык и система логического
программирования, основанные на языке предикатов математической логики
дизъюнктов Хорна, представляющей собой подмножество логики предикатов первого
порядка.
Основными понятиями в языке Пролог являются факты, правила логического
вывода и запросы, позволяющие описывать базы знаний, процедуры логического
вывода и принятия решений.
Факты в языке Пролог описываются логическими предикатами с конкретными
значениями. Правила в Прологе записываются в форме правил логического вывода с
логическими заключениями и списком логических условий.
Особую роль в интерпретаторе Пролога играют конкретные запросы к базам
знаний, на которые система логического программирования генерирует ответы
«истина» и «ложь». Для обобщённых запросов с переменными в качестве аргументов
созданная система Пролог выводит конкретные данные в подтверждение истинности
обобщённых сведений и правил вывода.
Факты в базах знаний на языке Пролог представляют конкретные сведения
(знания). Обобщённые сведения и знания в языке Пролог задаются правилами
логического вывода (определениями) и наборами таких правил вывода (определений)
над конкретными фактами и обобщёнными сведениями[1].
Начало истории языка относится к 1970-м годам. Будучи декларативным
языком программирования, Пролог воспринимает в качестве программы некоторое
описание задачи или баз знаний и сам производит логический вывод, а также поиск
решения задач, пользуясь механизмом поиска с возвратом и унификацией.
2.2 Общие сведения о BorlandC++ Builder
++ Builder- программный продукт, инструмент быстрой разработки приложений
(RAD), интегрированная среда программирования (IDE), система, используемая
программистами для разработки программного обеспечения на языке C++.++ Builder
объединяет в себе комплекс объектных библиотек (STL, VCL, CLX, MFC и др.),
компилятор, отладчик, редактор кода и многие другие компоненты. Цикл разработки
аналогичен Delphi. Большинство компонентов, разработанных в Delphi, можно
использовать и в C++ Builder без модификации, но обратное утверждение не
верно.++ Builder содержит инструменты, которые при помощи drag-and-drop
действительно делают разработку визуальной, упрощает программирование благодаря
встроенному WYSIWYG - редактору интерфейса и пр.
Формы являются основой приложений C++ Builder. Создание пользовательского
интерфейса приложения заключается в добавлении в окно формы элементов объектов
C++ Builder, называемых компонентами.
Компоненты C++ Builder располагаются на палитре компонентов, выполненной
в виде многостраничного блокнота. Важная особенность C++ Builder состоит в том,
что он позволяет создавать собственные компоненты и настраивать палитру
компонентов, а также создавать различные версии палитры компонентов для разных
проектов.
Компоненты разделяются на видимые и невидимые. Визуальные компоненты
появляются во время выполнения точно так же, как и во время проектирования.
Примерами являются кнопки и редактируемые поля. Не визуальные компоненты
появляются во время проектирования как пиктограммы на форме. Они никогда не
видны во время выполнения, но обладают определенной функциональностью.
3. РАЗРАБОТКА ЭКСПЕРТНОЙ СИСТЕМЫ «Выбор спортивного инвентаря»
Разработка экспертной системы разбита на три этапа: выбор метода
реализации экспертной системы, непосредственно кодирование программы и
тестирование системы.
3.1 Выбор метода реализации экспертной системы
На сегодняшний день существует две основные возможности для реализации
экспертных систем. Это связано с наличием двух весьма различных подходов к
решению задачи.
· Первый подход основывается на использовании для построения
экспертной системы некоторого процедурного языка, со всеми его недостатками и
достоинствами для решения данной задачи.
· Второй подход - использование языков программирования
математической логики, языков в которых имеются имеющие огромное значение для
построения экспертных систем возможности.
Для экспертной системы лучшим решением является использование некоторого
логического языка. Если сравнить код, реализующий одну и ту же экспертную
систему (механизм вывода), то у процедурного языка он будет гораздо более
объемным и более сложным. А наличие таких механизмов в языке как сопоставление
образцов (унификации), древовидное представление структур, автоматический
возврат делают его просто незаменимым языком для программирования экспертных
систем. Общепринятое представление экспертной системы в виде базы знаний и
механизма вывода не полностью пригодно для экспертных систем, написанных на
Прологе. Многие функции механизма вывода обеспечиваются самим Прологом. Базы
знаний, образованные средствами Пролога, являются выполняемыми. Однако Пролог
не обеспечивает некоторых важных свойств экспертных систем, обычно встроенных в
механизм вывода. Примеры таких свойств порождение объяснений и рассуждения в
условиях неопределенности. Исходя из этого, средой для реализации основной
части экспертной системы был выбран язык Пролог, в качестве одного из лучших
представителей языков логического программирования. Для построения оболочки
используется BorlandC++Builder 6и стандартный компонент LSEngine.
3.2 Построение экспертной системы: описание логической части
программы
Программа представляет собой интерактивную оболочку, которая может
задавать пользователю вопросы. Когда программа задает вопрос, пользователь
может ответить «Да» или «Нет».
Возможность задания вопроса «Почему» реализуется в программе с помощью
списка, в котором записывается весь путь, по которому прошла программа для
вывода цели к текущему моменту времени. По запросу пользователя из списка
извлекается его голова и выдается на экран, это и есть то нужное правило.
Кроме ответа на вопрос «Почему» программа имеет возможность отвечать на
вопрос «Как», после вывода сделанного экспертной системой пользователь может
проследить весь процесс вывода.
Далее, на рис.3.1. представлена база знаний в виде дерева, поясняющего
ход размышлений экспертной системы при ответах пользователя.
3.3 Интерфейс экспертной системы:Windows - приложение
Оболочка экспертной системы разрабатывалась с помощью средств С++.
Визуально она разделена на две части. Первая используется для опроса
пользователя, а также позволяет просматривать ход рассуждения. Вторая
предоставляет визуализацию базы знаний и непосредственно работу правилами.
Общий вид представлен на рисунке 3.2.
Рис. 3.2. Главная форма экспертной системы.
Первое что необходимо сделать - это загрузить базу знаний. После этого
код файла, который мы загрузили, появится в правой части (рис. 3.3.).
Рис.3.3. Загрузили базу знаний.
Рисунок 3.4. иллюстрирует опрос пользователя в поисках верного решения.
Рис.3.4. Опрос базы.
На рисунке 3.5. отображен результат ответа на вопрос «Почему?», что
позволяет пользователю системы узнать ход дальнейших рассуждений системы.
Рис. 3.5. Иллюстрация работы кнопки «Почему».
Рисунок 3.6. иллюстрирует конечный результат опроса - выбор спортивного
инвентаря.
Рис.3.6. Конечный результат опроса.
Рисунок 3.7. показывает возможность просмотра хода принятия решений экспертной
системой.
Рис.3.7. Ход принятия решений.
ЗАКЛЮЧЕНИЕ
В ходе выполнения данного курсового проекта были достигнуты все
поставленные цели и задачи.
Результатом выполнения данной курсовой работы стало создание экспертной
системы «Выбор спортивного инвентаря», позволяющей выбирать наиболее подходящий
для Вас инвентарь.
Данная система опрашивает пользователя, учитывая его личные предпочтения.
Пользователь заранее должен определиться, в каком виде спорта он будет заниматься.
Предполагается, что данная экспертная система будет актуальна для
начинающих спортсменов, но в этом случае базу знаний придётся значительно
расширить, так как в данном курсовом проекте используется лишь ряд инвентаря.
В процессе выполнения данной курсовой работы были изучены среды
разработки AMZI! Prolog и BorlandC++ Builder, а так же общие принципы их
взаимодействия. Так же был изучен язык рекурсивно-логического программирования Prolog, и углублены знания языка
объектно-ориентированного программирования C++. Были освоены принципы построения баз знаний.
ПРИЛОЖЕНИЕ
:- op(790, fx, 'если').
:- op(780, xfx, 'то').
:- op(770, xfy, 'и').
:- op(765, fx, 'не').
gethow :- !,
clause('главнаяцель'(X),MainGoal),'как'(MainGoal),fail.
'решить'
:-abolish('ответ'/2),'назначениеэкспертнойсистемы'(G),clause('главнаяцель'(X),MainGoal),'решить'(MainGoal),resultwrite(X),!.
'известно'('не' A) :-
'ответ'(A,_).
'известно'(A) :- 'ответ'(A,_).
'предложение'(A,B) :- 'если' B 'то' A.
'предложение'(A,'истина') :-
'ответ'(A,'истина').
'предложение'('не' A,'истина')
:- 'ответ'(A,'ложь').
'предложение'(A,B) :- clause(A,B).
'решить'(Goal) :- 'решить'(Goal,[]).
'решить'('истина',_).
'решить'(A 'и' B,Rules) :-
!,'решить'(A,Rules),'решить'(B,Rules).
'решить'(A 'или' B,Rules) :-
!,('решить'(A,Rules);'решить'(B,Rules)).
'решить'(A,Rules)
:-'предложение'(A,B),'решить'(B,['правило'(A,B)|Rules]).
'решить'(A,Rules) :-'можноспросить'(A),not
'известно'(A),'спросить'(A,Answer),'ответить'(Answer,A,Rules).
'можно спросить'('не' A) :-
!,'вопрос'(A).
'можно спросить'(A) :-
'вопрос'(A).
'спросить'('не' A,Answer) :- !,
opros(A,Ans),string_term(Ans,Answer).
'спросить'(A,Answer) :- opros(A,Ans),string_term(Ans,Answer).
'ответить'(y,'не' A,Rules) :- !,assert('ответ'(A,'истина')),fail.
'ответить'(y,A,Rules) :- !,assert('ответ'(A,'истина')).
'ответить'(n,'не' A,Rules) :- !,assert('ответ'(A,'ложь')).
'ответить'(n,A,Rules) :- !,assert('ответ'(A,'ложь')),fail.
'ответить'(why,A,[Rule|Rules]) :-
!,'вывестиправило'(Rule),'спросить'(A,Answer),'ответить'(Answer,A,Rules).
'ответить'(why,A,[]) :-
!,donerule,'спросить'(A,Answer),'ответить'(Answer,A,[]).
'ответить'(hl,A,[]) :- !,halt.
'ответить'(_,A,Rules) :-write($ответьтеy,nили
why$),nl,'спросить'(A,Answer),'ответить'(Answer,A,Rules).
'вывести правило'('правило'(A,B)) :-showrule(A,B).
'доказать'('истина','истина').
'доказать'(A 'и' B,(ProofA,ProofB)):-'доказать'(A,ProofA),'доказать'(B,ProofB).
'доказать'(A 'или' B,(ProofA,ProofB)):-('доказать'(A,ProofA);'доказать'(B,ProofB)).
'доказать'(A,(A:-Proof):-'предложение'(A,B),'доказать'(B,Proof).
'как'(Goal) :- 'доказать'(Goal,Proof),'интерпретировать'(Proof).
'интерпретировать'((Proof1,Proof2)) :- 'интерпретировать'(Proof1),'интерпретировать'(Proof2).
'интерпретировать'(Proof) :-'факт'(Proof,Fact),showfact(Fact,1).
'интерпретировать'(Proof)
:-'правило'(Proof,Head,Body,Proof1),showfact(Head,2),'вывести
правило1'('правило'(Head,Body)),'интерпретировать'(Proof1).
'вывести правило1'('правило'(A,B)) :-showrule1(A,B).
'факт'((Fact:-true),Fact).
'правило'((Goal:-Proof),Goal,Body,Proof) :-Proof \= true,
'извлечьтело'(Proof,Body).
'извлечьтело'((Proof1,Proof2),(Body1,Body2))
:-!,'извлечьтело'(Proof1,Body1),'извлечьтело'(Proof2,Body2).
'извлечьтело'((Goal:-Proof),Goal).
ФайлDB.pro
'главная цель'(X) :- 'ссылка'-X.
'назначение экспертной системы'($Экспертная система составление меню в
ресторане$).
'вопрос'('Нужен спортивный инвентарь?').
'вопрос'('Для тренажерного зала?').
'вопрос'('Нужна одежда?').
'вопрос'('Полный комплект?').
'вопрос'('Для велоспорта?').
'вопрос'('Спортивная обувь?').
'вопрос'('Нужна штанга?').
'вопрос'('Нужен мяч?').
'вопрос'('Блины нужны?').
'вопрос'('Нужны гири?').
'вопрос'('Для футбола?').
'вопрос'('Нужны лыжи?').
'если' 'Нужен спортивный инвентарь?' 'то' 'ссылка1'-'А1'.
'если' 'не' 'Нужен спортивный инвентарь?' 'то' 'ссылка1'-'А2'.
'если' 'ссылка1'-'А1' 'и' 'Для тренажерного зала?' 'то' 'ссылка2'-'А3'.
'если' 'ссылка1'-'А1' 'и' 'не' 'Для тренажерного зала?' 'то'
'ссылка2'-'А4'.
'если' 'ссылка1'-'А2' 'и' 'Нужна одежда?' 'то' 'ссылка2'-'А5'.
'если' 'ссылка1'-'А2' 'и' 'не' 'Нужна одежда?' 'то' 'ссылка2'-'А6'.
'если' 'ссылка2'-'А3' 'и' 'Полный комплект?' 'то' 'ссылка3'-'А7'.
'если' 'ссылка2'-'А3' 'и' 'не' 'Полный комплект?' 'то' 'ссылка3'-'А8'.
'если' 'ссылка2'-'А4' 'и' 'Для велоспорта?' 'то' 'ссылка3'-'А9'.
'если' 'ссылка2'-'А4' 'и' 'не' 'Для велоспорта?' 'то' 'ссылка3'-'А10'.
'если' 'ссылка2'-'А5' 'то' 'ссылка'-'Спортивный костюм Adidas'.
'если' 'ссылка2'-'А6' 'и' 'Спортивная обувь?' 'то' 'ссылка3'-'А11'.
'если' 'ссылка2'-'А6' 'и' 'не' 'Спортивная обувь?' 'то' 'ссылка3'-'А12'.
'если' 'ссылка3'-'А8' 'и' 'Нужна штанга?' 'то' 'ссылка4'-'А13'.
'если' 'ссылка3'-'А8' 'и' 'не' 'Нужна штанга?' 'то' 'ссылка4'-'А14'.
'если' 'ссылка3'-'А9' 'то' 'ссылка'-'Велосипед'.
'если' 'ссылка3'-'А10' 'и' 'Нужен мяч?' 'то' 'ссылка4'-'А15'.
'если' 'ссылка3'-'А10' 'и' 'не' 'Нужен мяч?' 'то' 'ссылка4'-'А16'.
'если' 'ссылка3'-'А11' 'то' 'ссылка'-'Кроссовки Adidas'.
'если' 'ссылка3'-'А12' 'то' 'ссылка'-'Не можем помочь'.
'если' 'ссылка4'-'А13' 'и' 'Блины нужны?' 'то' 'ссылка5'-'А17'.
'если' 'ссылка4'-'А13' 'и' 'не' 'Блины нужны?' 'то' 'ссылка5'-'А18'.
'если' 'ссылка4'-'А14' 'и' 'Нужны гири?' 'то' 'ссылка5'-'А19'.
'если' 'ссылка4'-'А14' 'и' 'не' 'Нужны гири?' 'то' 'ссылка5'-'А20'.
'если' 'ссылка4'-'А15' 'и' 'Для футбола?' 'то' 'ссылка5'-'А21'.
'если' 'ссылка4'-'А15' 'и' 'не' 'Для футбола?' 'то' 'ссылка5'-'А22'.
'если' 'ссылка4'-'А16' 'и' 'Нужны лыжи?' 'то' 'ссылка5'-'А23'.
'если' 'ссылка4'-'А16' 'и' 'не' 'Нужны лыжи?' 'то' 'ссылка5'-'А24'.
'если' 'ссылка5'-'А17' 'то' 'ссылка'-'Штанга + блины'.
'если' 'ссылка5'-'А18' 'то' 'ссылка'-'Штанга без блинов'.
'если' 'ссылка5'-'А19' 'то' 'ссылка'-'Комплект гирь'.
'если' 'ссылка5'-'А20' 'то' 'ссылка'-'Эспандер'.
'если' 'ссылка5'-'А21' 'то' 'ссылка'-'Футбольный мяч'.
'если' 'ссылка5'-'А22' 'то' 'ссылка'-'Волейбольный мяч'.
'если' 'ссылка5'-'А23' 'то' 'ссылка'-'Пара лыж'.
'если' 'ссылка5'-'А24' 'то' 'ссылка'-'Бейсболка'.
ФайлUnit1.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Amzi"
#pragma resource "*.dfm"*Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
__stdcallP_Resultwrite(TEngIDEngID)
{(Form1->LSEngine1->GetPStrParm(1));;
}
//---------------------------------------------------------------------------__stdcallP_Showrule(TEngIDEngID)
{
//отвечает на вопрос почему;t;=
"Если ";->LSEngine1->GetParm(2, dTERM, &t);= S + "
" + Form1->LSEngine1->TermToPStr(t);->LSEngine1->GetParm(1,
dTERM, &t);= S + " То " +
Form1->LSEngine1->TermToPStr(t);(S);;
}
//---------------------------------------------------------------------------__stdcallP_Showfacts(TEngIDEngID)
{S, S1;t;->LSEngine1->GetParm(1, dTERM, &t);=
Form1->LSEngine1->TermToPStrQ(t);(Form1->LSEngine1->GetIntParm(2)
== 1) {= " содержится в базезнаний";
} else {= " доказывается:";
}= S +
S1;->Solution->Lines->Add("");->Solution->Lines->Add(S);;
}
//---------------------------------------------------------------------------__stdcall
P_Showrule1(TEngIDEngID) {S;t;->LSEngine1->GetParm(2, dTERM, &t);=
" Если " +
Form1->LSEngine1->TermToPStr(t);->Solution->Lines->Add("");->Solution->Lines->Add(S);->LSEngine1->GetParm(1,
dTERM, &t);= " То " + Form1->LSEngine1->TermToPStr(t);->Solution->Lines->Add(S);;
}
//---------------------------------------------------------------------------__stdcallP_Opros(TEngIDEngID)
{
//опроспользователяS;;->Edit2->Text =
Form1->LSEngine1->GetPStrParm(1);->Show();->LastModalRes =
mresNone;->CloseApp = false;(Form1->LastModalRes == mresNone&&
!Form1->CloseApp) {>ProcessMessages();(Form1->CloseApp) {=
"hl";
} else {(Form1->LastModalRes) {:= "y";;:=
"n";;:= "why";;
}
}
}(Form1->LSEngine1->UnifyPStrParm(2, S)) {;
} else {;
}
}
//---------------------------------------------------------------------------__fastcall
TForm1::LoadBaseClick(TObject *Sender)
{
//ЗагрузитьбазузнанийS;t;(OpenDialog1->Execute())
{="reconsult('"+OpenDialog1->FileName.SubString(OpenDialog1->FileName.LastDelimiter("\\")+1,OpenDialog1->FileName.Length())+"')";{->ExecPStr(t,
S);
} catch(...) {
}
= titleForm +
OpenDialog1->FileName;>Items->LoadFromFile(OpenDialog1->FileName);="'назначение экспертной
системы'(G)";
LSEngine1->ExecPStr(t, S);= true;
}
}
//---------------------------------------------------------------------------
__fastcall TForm1::AskBaseClick(TObject *Sender)
//опроситьбазузнаний(!isLoadBase)
{ShowMessage("Загрузитебазузнаний");
return;}S="'решить'";t;(LSEngine1->ExecPStr(t, S))
{>Clear();
} else {ShowMessage("Ошибка: "+S);}
}
//---------------------------------------------------------------------------
__fastcall TForm1::SolutionStepClick(TObject *Sender)
{
//ходрешений(!isLoadBase)
{ShowMessage("Загрузитебазузнаний"); return;}t;->ExecPStr(t,
"gethow");
}
//---------------------------------------------------------------------------
__fastcall TForm1::FormClose(TObject *Sender,
TCloseAction&Action)
{>Items->SaveToFile("DB.pro");
}
//---------------------------------------------------------------------------
__fastcall TForm1::FormCreate(TObject *Sender)
{->InitLS("XS7");->AddPred("opros",
2, P_Opros);->AddPred("resultwrite", 1,
P_Resultwrite);->AddPred("showrule", 2, P_Showrule);->AddPred("showfact",
2, P_Showfacts);->AddPred("showrule1", 2,
P_Showrule1);->LoadXPL("XS7");
}
//---------------------------------------------------------------------------
ФайлUnit2.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"*Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
__fastcall TForm2::Button1Click(TObject *Sender)
{->LastModalRes=mresYes;->Close();
}
//---------------------------------------------------------------------------
__fastcall TForm2::Button2Click(TObject *Sender)
{->LastModalRes=mresNo;->Close();
}
//---------------------------------------------------------------------------__fastcall
TForm2::Button3Click(TObject *Sender)
{->LastModalRes=mresWhy;
}
//---------------------------------------------------------------------------