Uploaded by ilmir322

ЭКСПЕРТНАЯ СИСТЕМА ПОЛОМКИ КОМПЬЮТЕРА Курсовой проект

advertisement
ЭКСПЕРТНАЯ СИСТЕМА
"ПОЛОМКИ КОМПЬЮТЕРА"
Курсовой проект
2011
Содержание
Задание ..................................................................................................................... 3
Введение................................................................................................................... 3
1. Постановка задачи............................................................................................... 4
2. Вычислительная система.................................................................................... 5
2.1. Выбор программного средства разработки .................................................. 5
2.2. Обоснование выбора операционной системы............................................. 10
2.3. Требования к программному и аппаратному обеспечению ...................... 10
3. Проектирование приложения........................................................................... 10
3.1. Проектирование алгоритма реализации ...................................................... 10
3.2. Разработка графического интерфейса программы ..................................... 16
4. Программирование приложения...................................................................... 19
5. Описание применения программы .................................................................. 22
5.1. Инсталляция программы и системные требования .................................... 22
5.2. Руководство пользователя............................................................................. 22
Заключение ............................................................................................................ 26
Список используемых источников...................................................................... 27
Приложение. Исходный текст программы ......................................................... 28
2
Задание
Реализовать продукционную базу знаний по поломкам компьютера с
использованием прямого либо обратного метода логического вывода. База
знаний должна включать несколько уровней рассуждений и демонстрировать
некоторую интеллектуальность в принятии решений.
Введение
Целью выполнения данной работы является практическое освоение
применения систем и языков логического программирования. В рамках работы
требуется создать приложение с графическим пользовательским интерфейсом
работающее с базой знаний по поломкам компьютера.
Представленный отчет состоит из разделов, каждый из которых посвящен
конкретному аспекту разработки приложения.
В разделе «Постановка задачи» описывается предметная область
разрабатываемой базы знаний, область ее применения, задаются входные и
выходные данные, формулируются требования к исходным данным и
конечному результату.
В разделе «Вычислительная система» описывается выбор и обоснование
инструментов разработки.
В разделе «Проектирование приложения» производится анализ задачи,
описываются примененные принципы логического вывода и представления
продукционных
правил,
формулируются
алгоритмы
решения
задачи,
описывается примененный подход к извлечению знаний а также производится
описание построения интерфейса пользователя.
Раздел «Программирование приложения» содержит описание моментов
реализации приложения, требующих дополнительного разъяснения.
Раздел «Описание применения программы» содержит сведения о
назначении программы, области применения, информацию о возможностях
программы и руководство по работе с ней.
3
1. Постановка задачи
Целью разработки программы является создание продукционной базы
знаний по поломкам компьютера и обрамляющего ее приложения с
графическим пользовательским интерфейсом.
Компьютер представляет собой сложную систему, состоящую из
большого числа взаимодействующих между собой разнородных составных
частей. В связи с этим отказы в работе компьютера зачастую могут быть
обусловлены
не только
компонента,
а
физической
несовместимостью
неисправностью того
или
или
настройкой
неправильной
иного
комплектующих. Ввиду сложности системы определение причины отказа
является непростой задачей даже для специалистов, не говоря уже о рядовых
пользователях.
Именно рядовым пользователям может быть полезна автоматизированная
система поиска неисправностей, позволяющая устранить некоторые из них без
привлечения специалиста службы поддержки. Такое программное обеспечение
может быть реализовано в виде экспертной системы.
Экспертная система представляет собой компьютерную программу,
моделирующую ход рассуждений специалиста при решении задач какой либо
предметной области на основе накопленных знаний, собранных в базу знаний.
Знания в системе представляются на некотором специальном языке и хранятся
отдельно от программного кода, который формирует выводы [6].
Итак,
необходимо
реализовать
экспертную
систему
диагностики
компьютера, то есть выявления по результатам наблюдения причин его
неправильного функционирования.
Проектируемое
приложение
должно
быть
способно
показать
последовательность вывода, чтобы доказать его обоснованность.
Объем базы знаний прототипа экспертной системы обычно составляет не
более нескольких десятков записей. Этого вполне достаточно, чтобы
смоделировать процесс принятия специалистом отдельных решений по одному
или нескольким вопросам [1].
4
Входными данными программы является информация о техническом
состоянии
компьютера,
вводимая
пользователем
путем
выбора
из
предлагаемых вариантов.
Выходными данными являются выдаваемые программой рекомендации.
2. Вычислительная система
2.1. Выбор программного средства разработки
Декларативная
парадигма
программирования
подразумевает,
что
программа должна задавать связи и отношения между объектами и величинами
и не должна определять последовательность выполнения действий [10]. При
использовании декларативного языка в программе в явном виде указывается,
какими свойствами должен обладать результат, но не говорится, каким
способом он будет получен; подходит любой способ получения результата,
обладающего требуемыми свойствами [11].
В идеальном случае программа на декларативном языке будет состоять
только из неупорядоченной системы фактов и правил, на основании которых
может быть выведен необходимый результат. При этом программист
избавляется от необходимости определения точной последовательности шагов
для выполнения вычислений.
На практике такую идеальную модель выдержать невозможно, поэтому в
декларативные
языки
допускаются
специальные
средства
управления
процессом вычислений. В частности, для приложений, которые активно
взаимодействуют с пользователями, декларативных средств оказывается явно
недостаточно и приходится применять довольно специфические методы,
характерные более для объектно-ориентированной парадигмы.
Так как по заданию на проектирование в программе должен быть
реализован графический интерфейс пользователя, в качестве средства
разработки
необходимо
поддерживающую
такие
использовать
систему
возможности.
Из
программирования,
рассмотреных
систем
программирования на языке Prolog (Arity/Prolog [2], PDC Prolog [4], Turbo
5
Prolog [8], Visual Prolog [3], Amzi! Prolog [13]) такую поддержку обеспечивают
Visual Prolog с библиотекой Prolog Foundation Classes [3] и Amzi! Prolog [13].
Система Visual Prolog, по видимому, из-за стремления объединить
декларативную и объектно-ориентированную парадигмы, оказалась сложна в
программировании и неустойчива в работе, причем неустойчиво работает даже
визуальная середа разработки.
Существенно интереснее выглядит система Amzi! Prolog. Она позволяет
встраивать Prolog-машину в приложения, разработнные в других системах
программирования, например, Visual C++. Это позволяет строить графический
пользовательский интерфейс стандартными средствами, например, с помощью
библиотеки MFC, а логический вывод осуществлять с помощью Prologмашины, которая реализуется библиотечным объектом Logical server engine.
Prolog-машина имеет возможность загружать скомпилированную Amzi!
Prolog программу, которая обменивается данными с графической оболочкой
посредством
так
называемых
внешних
предикатов.
Эти
предикаты
организованы в виде методов на C++ и специальным образом регистрируются в
Prolog-машине:
// инициализация Prolog-машины
// загрузка скомпилированной программы
// регистрация внешних предикатов
ls.AddPred("resultwrite", 1, &::resultwrite,this);
ls.AddPred("showrule", 2, &::showrule,this);
ls.AddPred("showfact", 2, &::showfacts,this);
string com="reconsult('Xbase.pro')";
// подготовка команды загрузки базы знаний
try {
ls.ExecStr(com);
// выполнение команды загрузки
} catch(...) {
MessageBox("Ошибка загрузки базы знаний");
}
ls.Init("");
ls.Load("comput");
.
.
.
TF CCompExpertDlg::resultwrite() {
MessageBox(ls.GetStrParm(1).c_str());
return TRUE;
}
// предикат resultwrite/1
TF CCompExpertDlg::showrule() {
// предикат showrule/2
string rule="Если "+ls.TermToStr(ls.GetParm(2))+
" то "+ls.TermToStr(ls.GetParm(1));
MessageBox(rule.c_str());
return TRUE;
}
TF CCompExpertDlg::showfacts() {
string par1, par2;
TERM t;
t=ls.GetParm(1);
par1 = ls.TermToStrQ(t);
if (ls.GetIntParm(2) == 1) {
6
// предикат showfacts/2
par1 = " содержится в базе знаний";
} else {
par2 = " доказывается:";
}
par1 += par2;
MessageBox(par1.c_str());
return TRUE;
}
TF EXPFUNC resultwrite(VOIDptr p){
//
return((CCompExpertDlg *)p)->resultwrite();//
}
//
TF EXPFUNC showrule(VOIDptr p){
//
return((CCompExpertDlg *)p)->showrule();
}
TF EXPFUNC showfacts(VOIDptr p){
return((CCompExpertDlg *)p)->showfacts();
}
статические функции, которые служат для
обрамления методов объекта
чтобы их можно было передавать через
указатели
Система была опробована на следующей Prolog программе [7]:
:::::-
op(790,
op(780,
op(775,
op(770,
op(765,
fx, 'если').
xfx, 'то').
xfy, 'или').
xfy, 'и').
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),
7
'ответить'(Answer,A,Rules).
'можно спросить'('не' A) :!,
'вопрос'(A).
'можно спросить'(A) :'вопрос'(A).
'спросить'('не' A,Answer) :!,
survey(A,Ans),
string_term(Ans,Answer).
'спросить'(A,Answer) :survey(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) :-
8
Proof \= true,
'извлечь тело'(Proof,Body).
'извлечь тело'((Proof1,Proof2),(Body1,Body2)) :!,
'извлечь тело'(Proof1,Body1),
'извлечь тело'(Proof2,Body2).
'извлечь тело'((Goal:-Proof),Goal).
В качестве базы знаний использовался следующий набор фактов и правил
(фрагмент):
'главная цель'(X) :- 'вопрос'-X.
'назначение экспертной системы'($Определение неполадок компьютера$).
'вопрос'('Работает ПК?').
'вопрос'('ПК включается?').
'вопрос'('Свет есть?').
'вопрос'('Изображение есть на мониторе?').
'вопрос'('Писк есть при загрузке?').
'вопрос'('Монитор подключен к сети?').
'вопрос'('Лампочка на мониторе горит?').
'вопрос'('Загружается ОС?').
'вопрос'('При входе в систему есть звук?').
'вопрос'('Есть сообщения об ошибке ОС?').
'вопрос'('У вас есть звуковая карта?').
'вопрос'('Система загрузилась без ошибок?').
'если' 'Работает ПК?' 'то' 'вопрос'-'Вы не нуждаетесь в услугах экспертной системы'.
'если' 'не' 'Работает ПК?' 'то' 'вопрос1'-'пк включается'.
'если' 'вопрос1'-'пк включается' 'и' 'ПК включается?' 'то' 'вопрос2'-'изображение'.
'если' 'вопрос1'-'пк включается' 'и' 'не' 'ПК включается?' 'то' 'вопрос1'-'свет есть'.
'если' 'вопрос1'-'свет есть' 'и' 'Свет есть?' 'то' 'вопрос'-'Поломался блок питания'.
'если' 'вопрос1'-'свет есть' 'и' 'не' 'Свет есть?' 'то' 'вопрос'-'Включите свет'.
'если' 'вопрос2'-'изображение' 'и' 'Изображение есть на мониторе?' 'то' 'вопрос3'-'писк'.
'если' 'вопрос2'-'изображение' 'и' 'не' 'Изображение есть на мониторе?'
'то' 'вопрос3'-'мониторсеть'.
'если' 'вопрос3'-'писк' 'и' 'Писк есть при загрузке?'
'то' 'вопрос'-'2кортких - Ошибка четности ОЗУ\n
3кортких – Ошибка в первых 64 кБ ОЗУ\n
4кортких - Неисправность системного таймера\n
5кортких - Неисправен CPU'.
'если' 'вопрос3'-'писк' 'и' 'не' 'Писк есть при загрузке?' 'то' 'вопрос4'-'загрзука'.
'если' 'вопрос4'-'загрзука' 'и' 'Загружается ОС?' 'то' 'вопрос5'-'звук'.
'если' 'вопрос4'-'загрзука' 'и' 'не' 'Загружается ОС?' 'то' 'вопрос5'-'сообщенияОС'.
'если' 'вопрос3'-'мониторсеть' 'и' 'Монитор подключен к сети?'
'то' 'вопрос4'-'лампочка монитора'.
.
.
.
К сожалению, Amzi! Prolog является платной системой, годичная
индивидуальная лицензия стоит $298. Предлагается пробная тридцатидневная
лицензия, однако, практика показала, что она заканчивается на третий день.
В рамках учебного проекта можно было бы использовать более простую
и хорошо документированную систему Arity/Prolog, но эта система является
устаревшей. Как результат разработки получается 16-разрядное приложение с
интерфейсом в текстовом режиме.
9
В результате в качестве средства разработки приложения, практически
под давлением обстоятельств, была выбрана система программировании Visual
C++ 6.0 и библиотека MFC(Microsoft Foundation Classes).
2.2. Обоснование выбора операционной системы
Исторически сложилось, что немалая доля используемого парка
персональных компьютеров работает под управлением операционных систем
семейства Windows. В нашей стране использование операционных систем этого
семейства на уровне конечных пользователей стало стандартом де-факто.
Так как разрабатываемая программа ориентирована именно на конечного
пользователя, в качестве операционной системы рабочего места для разработки
приложения выбираем операционную систему Windows.
2.3. Требования к программному и аппаратному обеспечению
Разработка и тестирование программы осуществлялись на компьютере со
следующими техническими характеристиками:
− процессор Intel Celeron 430 1.8 ГГц;
− 1 Гб оперативной памяти;
− жесткий диск объемом 360 Гб;
− операционная система Windows XP Professional 2002 SP3.
3. Проектирование приложения
3.1. Проектирование алгоритма реализации
Целью функционирования экспертной диагностической системы является
определение имеющихся в компьютере неисправностей по описанию его
технического состояния.
Разные неисправности компьютера проявляются вовне различными
информационными параметрами. Совокупность значений информационных
параметров определяет "информационный образ" неисправности компьютера.
Основой для построения диагностической системы являются знания
специалиста, записанные в виде информационных образов для постановки
диагноза. Для описания своих знаний эксперт должен выделить множество всех
10
неисправностей компьютера, которые будет различать диагностическая
система, и выделить совокупность информационных параметров, значения
которых позволяют поставить диагноз.
База знаний диагностической системы продукционного типа состоит из
продукций. Продукцией называется логический оператор «если … то …».
Продукции используются при создании деревьев решений и формировании
базы правил [1]. Вопросы диагностической системы, задаваемые пользователю,
используются для инициализации переменных, входящих в часть «если».
Для систем диагностики применяют продукционные системы с прямой
цепочкой рассуждений. Обобщённый алгоритм прямой цепочки рассуждений
выглядит следующим образом [5]:
1) определяется переменная, описывающая исходное состояние ситуации;
2) переменная заносится в очередь переменных для обработки;
3) в массиве правил осуществляется поиск правила, содержащего первую
в очереди переменную; если такое правило не найдено, задача решена быть не
может;
4) непроинициализированным переменным условной части найденного
правила присваиваются значения путём запросов к пользователю;
5) проверяются на истинность все условия правила, в случае истинности
выполняется часть «то»;
6) переменная части «то» получает некоторое значение и помещается в
конец очереди;
7) переменная, стоящая в начале очереди, удаляется, если она больше не
встречается в условной части других правил;
8) рассуждения заканчиваются, как только опустеет очередь переменных.
Факты и продукционные правила могут быть представлены в виде
ориентированного графа [1]. Каждый узел такого графа представляет собой
некоторый вопрос, переходы графа представляют собой ответы на этот вопрос,
причем граф не обязан представлять собой бинарное дерево. То есть ответов на
вопрос может быть произвольное количество, и они могут обусловливать
переходы к любым другим произвольным вопросам на усмотрение эксперта.
11
В этом случае на ответственность эксперта относится отсутствие петель в
получившемся графе. С другой стороны, проход по графу с уточнением
информационных параметров представляет собой процесс, в котором переходы
выполняются по выбору пользователя, то есть управляемый процесс [12].
Поэтому если эксперт допустит ошибку в описании знаний, эта ошибка будет
замечена пользователем и не приведет к зацикливанию.
Таким образом, в качестве модели знаний выбираем ориентированный
граф, проход по которому дает в части «если» продукции логическое
выражение произвольной сложности в зависимости от пути прохода.
На
рис.1
показан
граф,
определяющий
общую
диагностику
неисправности компьютера.
По этому графу могут быть составлены следующие продукционные
правила.
Правило 1. Если есть изображение на экране, загружается операционная
система, работают устройства ввода-вывода и периферийные устройства, то
компьютер исправен.
Правило 2. Если есть изображение на экране, загружается операционная
система, работают устройства ввода-вывода, но не работает периферийное
устройство, то требуется замена неисправного периферийного устройства.
Правило 3. Если есть изображение на экране, загружается операционная
система, но не работает устройство ввода-вывода, то необходимо заменить
неисправное устройство ввода-вывода.
Правило 4. Если есть изображение на экране, но не загружается
операционная система, при этом в настройке BIOS жесткий диск отображается,
то требуется переустановка операционной системы.
Правило 5. Если есть изображение на экране, но не загружается
операционная система, при этом в настройке BIOS жесткий диск не
отображается, хотя он подключен к материнской плате, то необходимо
заменить жесткий диск.
12
Ес ть ли
изображение
на экране
да
Загружается
ли
операционная
с истема
да
да
да
Работают ли
переферийные
ус тройства
Работают ли
устройства
ввода-вывода
нет
Требуетс я
замена
устройс тва
ввода-вывода
нет
да
Подключен ли
жесткий дис к к
материнс кой
плате
Ес ть ли
возможность
войти в настройку
BIOS
нет
Компьютер
исправен
да
Т ребуется
переустановка
операционной
системы
Отображается ли
жесткий дис к в
BIOS
нет
Необходимо
заменить
жесткий дис к
да
нет
Требуется
подключить жесткий
диск к материнской
плате
да
Требуется замена
переферийного
ус тройства
Подключены ли к
с ети монитор и
с истемный блок
Подключен ли
монитор к
системному
блоку
да
Исправен ли
монитор
нет
Требуетс я
очистить
CMOS
Исправна ли
видеокарта
Работает ли
системный
блок
нет
да
Требуется
подключить к сети
монитор и
системный блок
Исправен ли
блок питания
да
нет
Требуетс я
подключить
монитор к
сис темному блоку
Подключен ли
блок питания к
материнской
плате
Требуетс я замена
монитора
нет
Требуется замена
материнс кой
платы
Рис.1. Граф общей диагностики неисправности компьютера
нет
Требуется замена
блока питания
нет
Требуется
подключить блок
питания
Требуетс я замена
видеокарты
13
нет
нет
да
да
нет
да
Правило 6. Если есть изображение на экране, но не загружается
операционная система, при этом в настройке BIOS жесткий диск не
отображается вследствие того, что он не подключен к материнской плате, то
требуется подключить жесткий диск к материнской плате.
Правило 7. Если есть изображение на экране, но не загружается
операционная система, и нет возможности войти в настройку BIOS, то
необходимо очистить CMOS.
Правило 8. Если нет изображения на экране, при этом системный блок и
монитор подключены к электросети, системный блок работает, монитор
подключен к системному блоку, и монитор и видеокарта проверены, то
требуется замена материнской платы.
Правило 9. Если нет изображения на экране, при этом системный блок и
монитор подключены к электросети, системный блок работает, монитор
подключен к системному блоку и проверен, а видеокарта неисправна, то
требуется замена видеокарты.
Правило 10. Если нет изображения на экране, при этом системный блок и
монитор подключены к электросети, системный блок работает, монитор
подключен к системному блоку, но неисправен, то требуется замена монитора.
Правило 11. Если нет изображения на экране, при этом системный блок и
монитор подключены к электросети, системный блок работает, но монитор к
нему не подключен, то необходимо подключить монитор к системному блоку.
Правило 12. Если нет изображения на экране, при этом системный блок и
монитор подключены к электросети, а системный блок не работает, хотя блок
питания проверен и подключен к материнской плате, то требуется замена
материнской платы.
Правило 13. Если нет изображения на экране, при этом системный блок и
монитор подключены к электросети, а системный блок не работает, блок
питания проверен, но не подключен к материнской плате, то необходимо
подключить блок питания к материнской плате.
14
Правило 14. Если нет изображения на экране, при этом системный блок и
монитор подключены к электросети, а системный блок не работает и блок
питания неисправен, то требуется замена блока питания.
Правило 15. Если нет изображения на экране и монитор или системный
блок не подключены к электросети, то необходимо, чтобы системный блок и
монитор были подключены к электросети.
Структура приложения должна включать в себя все блоки, присущие
экспертным системам [1] и показанные на рис.2.
Рис.2. Общая структура экспертной системы
База знаний содержит знания экспертов о неисправностях компьютера.
Машина
вывода,
используя
исходные
данные,
полученные
от
пользователя, и знания из базы знаний формирует последовательность правил,
которые приводят к решению задачи.
Интерфейс пользователя предъявляет пользователю вопросы машины
вывода, принимает ответы на них и формирует объяснения пользователю как
экспертная система пришла к тому или иному выводу.
Редактор базы знаний предназначен для добавления в базу знаний новых
фактов и правил, а также модификации имеющихся.
15
Проектируемая система достаточно проста, поэтому приложение будет
иметь жесткий интерфейс, генератор интерфейсов реализовывать не имеет
смысла.
3.2. Разработка графического интерфейса программы
Пользовательский интерфейс программы планируется организовать в
виде ряда диалогов на основе элементов управления вводом из библиотеки
MFC.
Интерфейс приложения (рис.3) организован в виде двух закладок, на
одной из них размещается интерфейс пользователя системы, а на второй
редактор базы знаний, предназначенный для эксперта.
Рис.3. Основное окно приложения
Интерфейс пользователя (рис.4) состоит из поля вопроса, поля вариантов
ответа, поля для размещения протокола вывода и двух кнопок – «Сброс» и
«Назад».
16
Рис.4. Интерфейс пользователя
Нажатие на кнопку «Назад» приводит к откату логического вывода на
один шаг, нажатие на кнопку «Сброс» переводит систему в исходное
состояние.
Интерфейс редактора базы знаний (рис.5) состоит из поля ввода
узлов/вопросов, поля для ввода переходов/ответов, а также связанных с этими
полями наборов кнопок «Добавить», «Удалить», «Редактировать», назначение
которых понятно из названий.
Кроме этого в системе используются еще два диалога, предназначенных
соответственно
для
добавления/редактирования
узлов
и
удаления/
редактирования переходов. Эти диалоги показаны соответственно на рис.6 и 7.
17
Рис.5. Редактор базы знаний
Рис.6. Диалог добавления/редактирования узла
Диалог ввода/редактирования узла содержит поле для ввода описания
узла, чекбокс для установки узла корневым, а также кнопки «Сохранить» и
«Отмена».
18
Диалог ввода/редактирования перехода содержит поле для ввода
описания перехода, поле для выбора целевого узла перехода, а также кнопки
«Сохранить» и «Отмена».
Рис.7. Диалог добавления/редактирования перехода
4. Программирование приложения
Узлы и переходы продукционного графа описываются следующими
структурами:
typedef struct str_knot{
int num;
// номер узла
string descr;
// описание ситуации/вопрос
boolean root;
// признак стартового узла
} knot;
typedef struct str_link{
int num;
string descr;
int from;
int to;
//
//
//
//
номер связи
описание связи/ответ
исходный узел
целевой узел
} link;
Основная логика программы сосредоточена в функциях выбора ответа на
вопрос, перевода в исходное состояние и возврата на шаг назад.
Функция выбора ответа на вопрос реализована как обработчик события
двойного щелчка мышью на элементе управления CListCtrl. При возникновении
19
такого события определяется номер строки элемента управления и считывается
хранимое вместе со строкой число. Если это число меньше нуля, это означает,
что элемент управления заполнен описаниями корневых узлов продукционного
графа. Если это число не меньше нуля, это означает, что элемент управления
заполнен описаниями очередного поколения переходов.
На основании этого числа определяется номер узла, который должен
стать текущим в результате выполнения перехода. Узел записывается в
историю вывода, его описание помещается в поле текущего вопроса, элемент
управления CListCtrl заполняется переходами, для которых этот узел является
исходным.
Обновляется протокол истории вывода, система готова к приему
следующего ответа от пользователя.
void User::OnNMDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem != -1){
// выбран ответ
int inf=m_Ansv.GetItemData(pNMListView->iItem); // признак ответа
if(inf < 0)
// это исходный узел
inf=-inf-1;
// вычисляем номер узла
else{
// это переход
m_Ansv.GetItemText(pNMListView->iItem,0,buf,1024);
string lnk=buf;
lhistory.push_back(lnk);
// помещаем название в историю переходов
for(int i=0; i < knots.size(); i++)
// определяем номер целевого узла
if(knots[i].num == inf){
inf=i;
break;
}
}
khistory.push_back(knots[inf]);
// записываем узел в историю узлов
m_Quest.SetWindowText(knots[inf].descr.c_str()); // устанавливаем новое стстояние
m_Ansv.DeleteAllItems();
// очищаем список переходов
for(int i=0; i < links.size(); i++){
// формируем список ответов,
link cur=links[i];
// исходным узлом для которых
if(cur.from == knots[inf].num){
// является данный узел
LV_ITEM item;
item.iItem=m_Ansv.GetItemCount();
item.mask=LVIF_TEXT|LVIF_PARAM;
item.lParam=cur.to;
item.iSubItem=0;
item.pszText=(char *)cur.descr.c_str();
m_Ansv.InsertItem(&item);
}
}
m_Ansv.SetSelectionMark(0);
// устанавливаем выделение
m_Ansv.EnsureVisible(0,FALSE);
// на первый переход
m_Ansv.SetItemState(0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
}
setHistory();
// обновляем протокол
}
Функция перевода в исходное состояние выводит приглашение в поле
текущего вопроса, заполняет элемент управления CListCtrl описаниями
20
корневых элементов продукционного графа, очищает историю вывода и
протокол.
void User::OnClear()
// Перевод в исходное состояние
{
// TODO: Add your control notification handler code here
m_Quest.SetWindowText("Что случилось?");
// выводим начальный вопрос
m_Ansv.DeleteAllItems();
// очищаем список переходов
for(int i=0; i < knots.size(); i++){
// заполняем список переходов
knot cur=knots[i];
// названиями узлов, у которых
if(cur.root){
// выставлен признак начального
LV_ITEM item;
item.iItem=m_Ansv.GetItemCount();
item.mask=LVIF_TEXT|LVIF_PARAM;
item.lParam=-(i+1);
item.iSubItem=0;
item.pszText=(char *)cur.descr.c_str();
m_Ansv.InsertItem(&item);
}
m_Ansv.SetSelectionMark(0);
// устанавливаем выделение на
m_Ansv.EnsureVisible(0,FALSE);
// первый из них
m_Ansv.SetItemState(0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
}
khistory.clear();
// очищаем историю вывода
lhistory.clear();
setHistory();
// обновляем протокол
}
Функция возврата на шаг назад удаляет последний элемент из списка
истории вывода и делает текущим узлом предпоследний элемент. Остальная
логика соответствует логике функции выбора ответа на вопрос.
void User::OnBack()
// Шаг назад
{
// TODO: Add your control notification handler code here
if(khistory.size() != 0){
// состояние требуется не исходное?
khistory.pop_back();
// удаляем последний узел
if(khistory.size() != 0){
// состояние по-прежнему не исходное
lhistory.pop_back();
// удаляем последний переход
knot kcur=khistory[khistory.size()-1];
// берем последний узел
m_Quest.SetWindowText(kcur.descr.c_str());
// выводим его описание
m_Ansv.DeleteAllItems();
// удаляем все переходы из списка
for(int i=0; i < links.size(); i++){
// заполняем список переходами,
link cur=links[i];
// у которых исходным узлом является
if(cur.from == kcur.num){
// новый текущий
LV_ITEM item;
item.iItem=m_Ansv.GetItemCount();
item.mask=LVIF_TEXT|LVIF_PARAM;
item.lParam=cur.to;
item.iSubItem=0;
item.pszText=(char *)cur.descr.c_str();
m_Ansv.InsertItem(&item);
}
}
m_Ansv.SetSelectionMark(0);
// устанавливаем выделение
m_Ansv.EnsureVisible(0,FALSE);
// на первый переход
m_Ansv.SetItemState(0, LVIS_FOCUSED | LVIS_SELECTED,
LVIS_FOCUSED | LVIS_SELECTED);
setHistory();
// обновляем протокол
}
else
// требуется исходное состояние
OnClear();
// приводим систему в исходное состояние
}
}
void User::setHistory()
// Обновление протокола
21
{
string log="";
for(int i=0; i < khistory.size(); i++){
if(i != 0){
log += "Если ";
log += lhistory[i-1];
log +="\r\n\tто ";
}
log += khistory[i].descr;
log +="\r\n";
}
m_History.SetWindowText(log.c_str());
// выводим в протокол
// переходы
// и соответствующие узлы
}
Полный текст программы приведен в Приложении.
5. Описание применения программы
5.1. Инсталляция программы и системные требования
Программа может выполняться под управлением любой 32-разрядной
версии операционной системы Windows. Наличие каких бы то ни было
установленных программных средств не требуется.
Установка программы сводится к копированию в выбранную папку
приложения в виде .exe файла.
Программа
не
предъявляет
особых
требований
к
аппаратному
обеспечению, для ее нормальной работы может быть использован любой
компьютер, удовлетворяющий требованиям для установки какой-либо из 32разрядных версий операционной системы Windows.
Эксплуатация программы не требует особых навыков за пределами
знакомства со стандартным интерфейсом используемой операционной системы.
5.2. Руководство пользователя
Рассмотрим основные диалоги программы и ее функции.
Интерфейс программы организован в виде ряда элементов управления,
расположенных в главном окне программы, а также дочерних диалогов,
соответствующих выполняемым функциям. Основные функции программы
осуществляются путем нажатия на кнопки, содержащиеся в главном окне
программы и дочерних диалогах; меню не используется.
Работа с программой начинается с выбора закладки «Пользователь» или
«Эксперт».
22
Рис.8. Интерфейс пользователя
Интерфейс пользователя показан на рис.8. В правой части интерфейса
отображен протокол вывода для одного из случаев диагностики.
Пользователь выбирает ответы на предъявляемые ему вопросы; отменить
вывод можно нажав клавишу «Сброс», вернуться на один шаг вывода можно
нажав кнопку «Назад».
Интерфейс эксперта изображен на рис.9. В левой части окна вводятся
узлы продукционного графа. Узлы, помеченные как корневые, выделяются в
списке желтым цветом фона. В правой части окна вводятся переходы
продукционного графа.
Кнопки в обеих частях окна называются соответственно производимым
ими действиям и в дополнительных комментариях не нуждаются.
На рис.10 и 11 изображены диалоги ввода/редактирования узла и
перехода продукционного графа соответственно.
В целом интерфейс приложения соответствует требованиям Хаммертехнологии.
Основная
идея
этой
технологии
состоит
в
том,
что
пользовательский интерфейс программного средства должен быть прост,
интуитивно понятен и не должен допускать двояких толкований. Образно
23
выражаясь, программа должна быть похожа на молоток (hammer) – инструмент,
пользоваться которым без дополнительного обучения может каждый.
Рис.9. Интерфейс эксперта (редактор базы знаний)
Рис.10. Диалог ввода/редактирования узла графа
Рис.11. Диалог ввода/редактирования перехода
24
Рис.12. Интерфейс пользователя с протоколом вывода
Рис.13. Интерфейс пользователя с протоколом вывода
25
Заключение
Программа реализована в соответствии с поставленной задачей и может
быть применена на практике.
Возможно дальнейшее расширение программы путем пополнения базы
дополнительными знаниями.
Что касается декларативной парадигмы программирования вообще и
языка Prolog в частности, то, судя по всему, они не до конца оправдали
возлагавшиеся на них тридцать лет назад надежды [9]. Обзор имеющихся на
сегодняшний день средств программирования на языке Prolog показывает, что
большинство из них разработаны в восьмидесятых годах прошлого века.
Имеющиеся современные среды програмирования (по крайней мере те, до
которых удалось добраться) либо разрабатываются сообществами энтузиастов,
либо жестко коммерциализированы и толком не доступны даже для учебных
целей.
26
Список используемых источников
1. Д.И. Муромцев. Введение в технологию экспертных систем. – СПб:
СПб ГУ ИТМО, 2005. – 93 с.
2. Описание языка Arity/Prolog – prolog.cab, prolog2.cab
3.
Wiki-система
по
системе
программирования
Visual
Prolog
http://wikiru.visual-prolog.com
4. Петухов О.А. PDC Prolog – язык систем искусственного интеллекта:
Учеб. пособие. – 4-е изд., исправленное. – СПб: СЗТУ, 2004. – 172 с.
Оболочка
5.
экспертных
систем
«Rulebook»
http://www.aboutkit.ru/kit/obolochka-ekspertnyx-sistem-rulebook.html
6.
Методология
построения
экспертных
систем
http://www.intuit.ru/department/hardware/sapr/6/2.html
7. Простая экспертная система на языке Пролог http://juravskiy.ru/?p=128
8. В.В.Терехин TURBO PROLOG: Учебное пособие – Новокузнецк:
Кемеровский государственный университет, 2005. – 119 с.
9.
М.В.Бураков
Язык
логического
программирования
Пролог:
Методические указания к выполнению лабораторных работ – СПб: СанктПетербургский
государственный
университет
аэрокосмического
приборостроения, 2003. – 37 с.
10. Першиков В.И., Савинков В.М. Толковый словарь по информатике. М.: Финансы и статистика, 1991. - 543 с.
11. Информатика и программирование шаг за шагом. Шаг 48.
Деларативная (логическая) парадигма. – Кафедра информационных технологий
Курганского государственного университета: http://it.kgsu.ru/Lisp/lisp0048.html
12. T.П. Тюрина, В.И. Емельянов Дискретная математика (часть 3):
Учебное пособие – Новомосковск: Издательский центр Российского химикотехнологического университета им. Д.И. Менделеева, 2004. – 56 с.
13. Amzi! inc http://amzi.com/
27
Приложение. Исходный текст программы
CXS.h
CXS.cpp
CXSDlg.h
CXSDlg.cpp
EditKnot.h
EditKnot.cpp
EditLink.h
EditLink.cpp
Expert.h
Expert.cpp
User.h
User.cpp
28
Download