МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ ХАРЬКОВСКИЙ НАЦИОНАЛЬНЫЙ УНИВЕРСИТЕТ РАДИОЭЛЕКТРОНИКИ Кафедра ПО ЭВМ Отчёт По лабораторной работе №1 По курсу «Основы проектирования систем искусственного интеллекта» Тема: ПРОЕКТИРОВАНИЕ ЭЛЕМЕНТОВ ПРОДУКЦИОННЫХ МОДЕЛЕЙ Выполнил: ст. гр. ПОАС-00-3 Авраменко Р.В. Проверил: Ельчанинов А.Б. Харьков 2002 ВВЕДЕНИЕ Сегодня всем, кто работает в области информатики или интересуется этой новой областью науки, известен термин "экспертные системы". Экспертная система (expert system, knowledge based system) - это программная система, знания и умения которой сравнимы с умением и знаниями специалистов в какой-нибудь специальной области знаний. Экспертные системы вместе с системами обработки естественных языков являются наиболее важными в коммерческом плане областями использования искусственного интеллекта. В рамках исследования искусственного интеллекта созданы многочисленные экспертные системы для разных областей знания, таких, например, как медицинская диагностика и обследование пациентов, генные и молекулярные исследования, составление конфигурации вычислительных машин, образование, поиск неисправностей в устройствах и системах и многие другие практические приложения. Диагностические системы используются для установления связи между нарушениями деятельности организма и их возможными причинами. Наиболее известна диагностическая система MYCIN, которая предназначена для диагностики и наблюдения за состоянием больного при менингите и бактериальных инфекциях. Ее первая версия была разработана в Стенфордском университете в середине 70-х годов. В настоящее время эта система ставит диагноз на уровне врачаспециалиста. Она имеет расширенную базу знаний, благодаря чему может применяться и в других областях медицины. В этой работе разрабатывается экспертная система, связанная с диагностикой медицинских заболеваний. 1 Цель работы: Разработать экспертную систему, содержащую модули логического вывода, модули объяснений, ведения БД и БЗ, применительно к предметной области – медицинская диагностика. В качестве модели представления зданий, используется нечеткий вывод. ЭС должна предоставлять средства для ввода новых и изменения существующих правил, возможность изменения функций принадлежности нечетких понятий нечетким множествам. 2 РАЗРАБОТКА МОДЕЛЕЙ ПРЕДСТАВЛЕНИЯ ЗНАНИЙ 2.1. Концептуальное представление предметной области с использованием продукционной модели Экспертная система – это интеллектуальная программа, способная осуществлять логические выводы на основании знаний в конкретной предметной области и обеспечивающая решение специфических для данной области задач. Базовый вариант архитектуры ЭС изображен на рисунке 1. Задание и ведение знаний и фактов ЭКСПЕРТ База знаний (БЗ) Модуль ведения знаний и фактов Диалоговые средства эксперта ДБ фактов Модуль логического вывода Модуль объяснений БД объяснений Диалоговые средства пользователя Заключения, Ввод данных ПОЛЬЗОВАТЕЛЬ объяснение Рисунок 1 – Базовый вариант экспертной системы База знаний (БЗ) реализует механизм представления знаний и управления ими. Модуль логического вывода предназначен для управления процессом вывода на основе знаний, хранящихся в БЗ, и фактов, представленных в БД. Механизм логического вывода тесно взаимосвязан с принципам представления знаний в БЗ. Процесс пополнения и ведения БД и БЗ на основе опроса и работы эксперта реализуется модулем ведения знаний и фактов. Модуль объяснений реализует функцию выдачи заключений ЭС и объяснений ее действий в удобной для пользователя форме и по его требованию. ЭС должна включать в свой состав развитые средства диалогового взаимодействия с ней как для пользователя, так и для эксперта. Принципы разработки и программирования ЭС определяются выбранным способом представления знаний и связанным с ним механизмом логического вывода. Можно выделить пять основных групп моделей представления знаний: логические модели (модели, основанные на исчислении предикатов); модели, основанные на использовании правил (продукционные модели); модели, основанные на использовании фреймов; модели на семантических сетях; модели для представления нечетких знаний. Продукционная модель. Правила продукций. Продукционная модель, или модель, основанная на правилах, позволяет представить знания в виде предложений типа: Если (условие), то (действие), постусловие. ядро Под условием понимается некоторое предложение-образец, по которому осуществляется поиск в базе знаний, а под действием — действия, выполняемые при успешном исходе поиска (они могут быть промежуточными, выступающими далее как условия, и терминальными или целевыми, завершающими работу системы). Постусловие описывает действия и процедуры, которые необходимо выполнить после реализации действия. Например, после покупки некоторой вещи в магазине необходимо в описи товаров уменьшить количество вещей такого типа на 1. Ядра продукций можно классифицировать по различным основаниям. Прежде всего, все ядра делят на 2 больших типа: детерминированные и недетерминированные. В детерминированных ядрах при актуализации ядра и при выполнимости условия, правая часть (действие) выполняется обязательно; в недетерминированных — правая часть может выполняться и не выполняться. Т.о. секвенция в детерминированных ядрах реализуется с необходимостью, а в недетерминированных — с возможностью: Если А то возможно В. Возможность может определятся некоторыми оценками реализации ядра. Если А, то с вероятностью р реализовать В. Такая оценка может быть лингвистической, связанной с понятием лингвистической переменной, например: Если А то с большой долей уверенности В. Возможны другие способы задания оценки реализации ядра. Детерминированные продукции м.б. однозначными и альтернативными. Во втором случае в правой части ядра указываются альтернативные возможности выбора, которые оцениваются специальными весами выбора. В качестве таких весов используются вероятностные оценки, лингвистические оценки, экспертные оценки и т.п.(Если А, то Чаще всего надо делать В 1, РЕЖЕ В2). Особым видом выделяют прогнозирующие продукции, в которых описываются последствия, ожидаемые при актуализации А, например: Если А, то с вероятностью р можно ожидать В. При использовании продукционной модели база знаний состоит из набора правил. Программа, управляющая перебором правил, называется машиной вывода. Чаще всего вывод бывает прямой (от данных к поиску цели) или обратный (от цели для ее подтверждения — к данным). Данные — это исходные факты, на основании которых запускается машина вывода — программа, перебирающая правила из базы.Предметная область (Заболевание гортани) 2.2 Концептуальное представление предметной области с использованием продукционной модели В данном случае, для предметной области – медицинская диагностика, было разработано 11 правил. Правила описаны в таблице 1. Описание правил ЭС В выводе данной экспертной системы, участвует 11 правил, которые можно разделить на четыре категории: - Ларингит острый - Ларингит хронический катаральный - Ларингит хронический гипертрофический - Ларингит хронический атрофический Для вывода каждой болезни, применяется как минимум 3 правила, которые перечислены в таблице 1. Таблица 1. Список правил нечеткой модели Номер Формулировка 1 ЕСЛИ (1 и 2), ТО «Кашель сухой затем с мокротой» 2 ЕСЛИ (1 и 2 и 3 и 4), ТО «Ларингит острый» 3 ЕСЛИ 5, ТО «Головная боль» 4 ЕСЛИ Головная боль, ТО «Повышенная температура тела» 5 ЕСЛИ (5 и 6 и 7 ), ТО «Иногда боль при глотании» 6 ЕСЛИ (2 и 3 и 8 и 9 ), ТО «Ларингит хронический катаральный» 7 ЕСЛИ (1 и 2 и 3), ТО «Ларингит хронический катаральный» 8 ЕСЛИ ( 8 и 9), ТО «Ларингит хронический катаральный» 9 ЕСЛИ ( 2 или 11), ТО «Ларингит хронический атрофический» ЕСЛИ (10 и 12), ТО «Ларингит хронический 10 атрофический» ЕСЛИ (13 и 14 и 15 ), ТО «Ларингит хронический 11 гипертрофический» 3 ПРОГРАММНАЯ РЕАЛИЗАЦИЯ СИСТЕМЫ 3.1 Разработка основных архитектурных компонент системы 3.1.1 Разработка структуры БД и БЗ Все отношения, необходимые для функционирования экспертной системы были созданы при помощи инструментальной оболочки DeskTop DataBase. Она позволяет создавать таблицы стандарта Paradox, определять поля, их типы, а также задавать маски и ограничения на вводимые числовые данные, задавать ключевые поля, родительские и внешние ключи. В процессе логического вывода, экспертная система использует 5 отношений, описание которых приведено в таблице 3. Таблица 3 - Список имеющихся отношений Название Назначение отношения Rule Используется для хранения правил R Справочник, по имеющимся выводам F Справочник, по имеющимся предпосылкам NF Нечеткие понятия, описывающие предметную область Нечеткие NR понятия, описывающие возможные результаты вывода Таблица 4 - Структура полей отношения Rule Название поля Тип Rule Autoincrement R1 Целый Идентификатор Номер правила Номер правила, входящего в предпосылку F1..F5 Целый Номера предпосылок (ссылки на справочник) R Целый Номер правила, образующегося в результате вывода Таблица 5 - Структура полей отношения R Название поля Тип Идентификатор R Autoincrement Номер правила Text Символьный Лингвистическое описание результата вывода Таблица 6 - Структура полей отношения F Название поля F Тип Autoincrement Идентификатор Номер предпосылки Text Символьный Лингвистическое описание предпосылки Таблица 7 - Структура полей отношения NR Название поля Тип Идентификатор NumR Autoincrement Номер правила N1-N5 С плавающей Значение функции запятой принадлежности нечеткого понятия к нечеткому множеству Таблица 8 - Структура полей отношения NF Название поля Тип Идентификатор Nf Autoincrement Поле индекса NumFact Целый Номер факта NumOtvet Целый Номер нечеткого понятия, входящего в нечеткое множество N1-N5 С плавающей запятой Значение функции принадлежности нечеткого понятия к нечеткому множеству 3.1.2 Разработка модуля логического вывода Основной особенностью системы с нечетким выводом, является то, что она практически полностью реализует продукционную систему, однако в отношениях в качестве составных частей правил используются нечеткие значения. К продукционным ЭС относятся системы, использующие для представления знаний правила вида «ЕСЛИ-ТО» (явление – реакция). Эти системы бывают двух типов – с прямыми и обратными выводами. В системах продукций с обратными выводами с помощью правил строится дерево И/ИЛИ, связывающее в единое целое факты и заключения. На основе этого дерева осуществляется логический вывод. Необходимость реализации операции ИЛИ возникает, когда существует множество правил, из которых выводится одно и то же заключение. Логические выводы бывают прямыми, обратными и двунаправленными. При прямим выводе граф И/ИЛИ анализируется снизу вверх, от исходных данных к корню, который представляется пользователю как гипотеза заключения. При таком способе анализируется большое количество данных, не имеющих прямого отношения к заключению. При обратном выводе анализируются только те части дерева, которые имеют отношение к данному заключению, т.е. процесс вывода осуществляется на графе И/ИЛИ сверху вниз, от гипотезы к данным. При двунаправленном выводе сначала используется небольшой объем данных для выбора гипотезы (на основе прямого вывода), а затем запрашивается расширенный объем данных для ее подтверждения. При реализации системы продукций с прямым выводом не требуется построения и анализа графа И/ИЛИ, а этот процесс заменяется циклическим обновлением данных в результате последовательного выполнения правил. Эти системы включают три компоненты: базу правил, состоящую из набора продукций; БД, содержащую множество фактов; интерпретатор для получения логического вывода на основании правил и фактов. На рисунке 2 представлен принцип функционирования систем продукций с прямым выводом. ИНТЕРПРЕТАТОР База База 1.ЕСЛИ правил A1 И B1 ТО C1 П 2. ЕСЛИ C1 И C2 ТО D1 1 A1 A2 A B1 B2 B данных . . . П запись 2 считывани C1 C2 C D1 D е Рисунок 2 - Принцип функционирования систем продукций с прямым выводом. В результате вывода исходная БД в подобных системах преобразуется от первоначального состояния к целевому. С увеличением числа правил и фактов значительно замедляется скорость вывода., поэтому такие системы обычно не используются для решения крупномасштабных задач. Модуль логического вывода, реализован на языке Borland С++, и содержится в заголовочном файле unit1.h. Список функций, реализующих вывод, приведен в таблице 9. Таблица 9 - Описаний функций Название Тип функции Вызываемые Назначение функции countneed() Void Нет Считает количество предпосылок в правиле checkrule() Bool Нет Проверка на выполнение правила nextrule() Void ruleout() countneed() Переход на проверку следующего правила Продолжение таблицы 9 – Описаний функций Название Тип функции Вызываемые Назначение функции findnextrule( Void Countneed() Поиск нового Ruleout() правила в БЗ makeresult() buildrelation1() Void Нет Формирование нечеткого отношения №1 preparebuild() Void buildrelation1() Подготовка к Svertka() построению buildrelation2() нечетких отношений Makeresult() Void Нет Формирования конечного вывода(нечеткого понятия) Svertka() Void Нет Свертка нечетких отношений buildrelation2() Void Нет Формирование нечеткого отношения №2 ruleout() Checkrule() Вывод вопроса к Preparebuild() пользователю на Findnextrule() экран Void nextrule() makeresult() Таблица 10 - Описание переменных и констант Идентификатор Тип Назначение Need int Число предпосылок в правиле I,j Int Переменные для циклов Prav int Число «правильных ответов» пользователя fact[100] int Промежуточный массив для хранения результатов анализа полученных предпосылок Stroka int Текущая строка в таблице minmas Продолжение таблицы 10 - Описание переменных и констант Идентификатор Тип temprelation1[5][5 float Назначение Временный массив для построения нечеткого отношения ] relation1[5][5] float Нечеткое отношение №1 relation2[5][5] float Нечеткое отношение №2 minmas[5][5] double minf[5] float Массив, содержащий нечеткие понятия Значения принадлежности нечеткого понятия к нечеткому множеству minr[5] float Значения принадлежности нечеткого понятия вывода к нечеткому множеству Max float Испоьзуется для поиска максимального числа Strmin int Индекс строки макс числа в массиве Text AnsiString Текст сопровождения, выводимый на экран final[5] float tempmas[5][3] int Окончательное нечеткое отношение Промежуточный массив, для контроля входных команд пользователя Rel int Число полученных нечетких отношеений Флаг конца вывода Endrule bool ii,z,ii1 int Переменные для циклов Firstfact int Индекс первого факта в БД Ourotvet AnsiString Лингвистическая переменная, содержащя текст вывода Firstotvet[5] float Нечеткое понятие, вводимое пользователем r1[50] int Промежуточный массив для хранения результатов анализа полученных предпосылок Укрупненная блок схема алгоритма, представлена на рисунке 3. Начало Инициализация переменных Начало диалога Правило пройдено? Да Нет Checkrule Ответы совпадают ? Nextrule Да Нет Prav++ Есть еще Nextrule правило? Нет Preparebuild Проверка таблиц Да Ruleout Вывод объяснений Findnextrule Конец Нечеткое отношение есть? вывода? Конец Needcount BuildRelation Да Да Svetrka Нет Нет Рисунок 3 - Укрупненная блок-схема алгоритма логического вывода 3.1.3 Разработка модуля объяснений Модуль объяснений предназначен для формирования и отображения поясняющей информации, в ходе логического вывода. Фактически он запоминает «маршрут» следования по дереву вывода, и отображает его на экране. Основным компонентом модуля объяснений является объект Memo, из библиотеки визуальных компонентов языка Bolrand C++ Builder. Информация предоставляется в виде вопросов, которые формирует модуль логического вывода, и ответов пользователя. Каждый ответ, кроме значения логического параметра True или False, содержит также степень уверенности в правильном выборе. Степень уверенности задается с помошью шкалы от 1 до 5. Каждое числовое значение имеет соответствующее лингвистическое описание: 1. Не очень опасно 2. Малая опасность 3. Средняя степень тяжести 4. Опасное положение 5. Очень опасное положение Таким образом, окончательный составляющих: - Название болезни - Степень опасности заболевания вывод, формируется из двух Результат вывода можно записать в текстовый файл. Данная функция может пригодиться при создании баз данных диагнозов. Также модуль обяснений, позволяет вести контроль над процессом поиска правил в базе знаний, и информировать пользователя о переходах между правилами. 3.1.4 Разработка модуля ведения БД и БЗ Модуль ведения баз данных и баз знаний, предназначен для обеспечения возможности ввода новых правил, фактов, нечетких понятий и нечетких фактов, и для их модификации. Запуск модуля ведения БД и БЗ, происходит из меню «База данных»-> «работа с БД и БЗ». Для доступа к данным, использовались компоненты: - Table - DataSource - Dbnavigator - DBGrid Компонент Table связывает какое-либо отношение с функциями Borland Database Engine (BDE). Он обладает методами поиска записей, по заданному полю, фильтрации, блокировки записей. Это ключевой элемент в приложениях баз данных, и любой доступ к записям таблиц, производится только через его функции и методы. Следует отметить, что он принадлежит к так называемой группе «Доступа к данным». Компонент DataSource является связующим звеном между компонентом Table и одним из компонентов группы «Управления данными». Компонент DBNavigator тпринадлежит к группе «Управления данными», и служит для выполнения навигации по таблицам. В его состав входят такие методы, как - Переход на первую запись в отношении - Переход на последнюю запись в отношении - Переход на следующюю запись в отношении - Переход на предыдущую запись в отношении - Вставка новой записи - Удаление записи - Подтвержение операции модификации Все эти методы, являются необходимыми при добавлении новых правил в экспертную систему. Сам алгоритм добавление правила, следующий: 1. Добавить новый вопрос в отношение F.db 2. Добавить результат вывода в отношение R.db 3. Занести правило в таблицу Rule.db 4. Заполнить нечеткие множества фактов в NF.db 5. Заполнить нечеткие множества результатов в NR.db После каждого этапа, требуется сохранять изменения в таблице, иначе драйвер BDE, может выдать ошибку. Если все шаги выпонены правильно, то при следующем логическом выводе, новое правило также будет проверяться на истинность. Компонент DBGrid предназначен для отображения на экране записей из активных отношений. С помощью редактора полей, можно производить настройку компонента таким образом, что на экране будет отображаться не все множество полей , а только разрешенные разработчиком. В модуле объяснений используется пять компонент DBGrid, соответственно для каждого отношения. Однако активным может быть только одно. Доступ к полям активного отношения, осуществляется посредством компонента DBNavigator, а его переключение компонентом ComboBox, который устанавливает связь между отношениями. 3.2 Описание контрольного примера и экспериментальная загрузка БД и БЗ В качестве контрольного примера, проверялась последовательность правил, определяющих болезнь Ларингит, в не очень запущенной форме. Ход диалога пользователя с системой отражен в таблице 11. Таблица 11- Описание диалога пользователя с системой Номер Вопрос Ответ Увереннос вопрос пользовател ть в а я ответе Да 5 Да 1 Да 4 иногда боль Да 4 повышенная Да 3 У вас есть сухость першение, 1 саднение? Есть ли у вас кашель сухой затем 2 с мокротой? Есть ли у вас голос хриплый или 3 безвучный ? Ощущаете ли вы 4 при глотании? Есть 5 ли у вас температура тела? Ответ: Не очень опасно – Ларингит острый Соответствующие правила, приведены в таблице 12. Таблица 12 - Правила, при выводе болезни Ларингит острый Номер Правило вопрос а 1 ЕСЛИ (1 ), ТО «Кашель сухой затем с мокротой» 2 ЕСЛИ (“Кашель сухой затем с мокротой ” и 3), ТО «Иногда боль при глотании» 3 ЕСЛИ (“Иногда боль при глотании ” и 5), ТО «Головная боль » ЕСЛИ (“Головная боль ” и 7), ТО «Ларингит острый» 4 Перечень нечетких отношений, полученных в результате выполнения ручного расчета операций свертки, над нечеткими понятиями, содержится в таблице 13. Таблица 13 – Нечеткие отношения Отношение №1 0,1 0,1 0,1 0,5 0,8 1 0,1 0,1 0,1 0,1 0,1 0,1 2 0,1 0,1 0,1 0,1 0,1 0,1 3 0,1 0,1 0,1 0,1 0,1 0,1 4 0,5 0,5 0,5 0,5 0,5 0,5 5 0,8 0,8 0,8 0,8 0,8 0,8 Отношение №2 0,1 0,1 0,1 0,5 0,8 1 0,8 0,8 0,8 0,8 0,8 0,8 2 0,5 0,5 0,5 0,5 0,5 0,5 3 0,2 0,2 0,2 0,2 0,2 0,2 4 0,1 0,1 0,1 0,1 0,1 0,1 5 0,1 0,1 0,1 0,1 0,1 0,1 Конечное нечеткое понятие 0,1 0,1 0,1 4 Текст программы; Form1 unit1.cpp 0,5 0,8 //--------------------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" #include "Unit3.h" #include "stdlib.h" #include "string.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender) { //Form3->Label6->Visible=false; endrule7=false; showrule=false; //stroka=0; //Memo1->Lines[0]="Ñòàòèñòèêà: "; //Table1->Active=true; StringGrid1->Visible=false; StringGrid2->Visible=false; Panel1->Visible=false; //Label3->Visible=false; Label1->Visible=false; Memo1->Visible=false; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { if((Rule->Fields->Fields[2+i]->AsInteger==0)||(i==7)) { if (checkrule()) { preparebuild(); findnextrule(); } else { nextrule(); prav=0; while(fact[Rule->Fields->Fields[2+i]->AsInteger]!=7) { i++; if ((i==7)||(fact[Rule->Fields->Fields[2+i]->AsInteger]==0)|| (fact[Rule->Fields->Fields[2+i]->AsInteger]==1)) nextrule(); } } ruleout();///////////////////////////////// }//if i if (!endrule7) { if(RadioGroup1->ItemIndex==0) { AnsiString temptext,ttt; ttt=IntToStr(RadioGroup2->ItemIndex+1); temptext=F->Fields->Fields[1]->AsString; Memo1->Lines->Add("Âîïðîñ: "); Memo1->Lines->Append(temptext); Memo1->Lines->Append("Îòâåò: ÄÀ!"); Memo1->Lines->Append("Óâåðåííîñòü: "+ttt); //Memo1->Lines->Add(ttt); Memo1->Lines->Append(""); //stroka++;*/ fact[Rule->Fields->Fields[2+i]->AsInteger]=1; tempmas[stroka][0]=Rule->Fields->Fields[6]->AsInteger; tempmas[stroka][1]=Rule->Fields->Fields[2+i]->AsInteger; tempmas[stroka][2]=RadioGroup2->ItemIndex+1; //if (firstfact==0) firstfact= stroka++; } else { fact[Rule->Fields->Fields[2+i]->AsInteger]=0; nextrule(); prav=0; while(fact[Rule->Fields->Fields[2+i]->AsInteger]!=7) { i++; if ((i==7)||(fact[Rule->Fields->Fields[2+i]->AsInteger]==0)|| (fact[Rule->Fields->Fields[2+i]->AsInteger]==1)) nextrule(); } ruleout();/////////////// } if (!endrule7) { // DBText1->Visible=false; while (fact[Rule->Fields->Fields[2+i]->AsInteger]!=7) { switch(fact[Rule->Fields->Fields[2+i]->AsInteger]) { case 1:prav++;i++;break; case 0:i++;break; }//switch } ruleout(); RadioGroup1->ItemIndex=-1; RadioGroup2->ItemIndex=-1; } } } //--------------------------------------------------------------------------- void __fastcall TForm1::N7Click(TObject *Sender) { Memo1->Clear(); StringGrid1->Visible=true; StringGrid2->Visible=true; for (ii=0;ii<5;ii++) for (z=0;z<5;z++) { StringGrid1->Cells[z+1][ii+1]=""; StringGrid2->Cells[z+1][ii+1]=""; } rel=0; firstfact=0; Label1->Visible=true; Memo1->Visible=true; Rule->Active=true; Rule->First(); R->Active=true; nftable->Active=true; nr->Active=true; F->Active=true; R->First(); F->First(); endrule7=false; Panel1->Visible=true; //Label3->Visible=true; need=0; stroka=0; nftable->First(); nr->First(); i=0; prav=0; for(i=0;i<100;i++) fact[i]=7; for(i=0;i<50;i++) r1[i]=7; countneed(); } //--------------------------------------------------------------------------- void __fastcall TForm1::N13Click(TObject *Sender) { Form1->Close(); } //--------------------------------------------------------------------------void __fastcall TForm1::FormClose(TObject &Action) { Rule->Active=false; R->Active=false; F->Active=false; nftable->Active=false; nr->Active=false; Panel1->Visible=false; Memo1->Visible=false; //Label3->Visible=false; Label1->Visible=false; } *Sender, TCloseAction //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { Rule->Active=false; R->Active=false; F->Active=false; Panel1->Visible=false; //Label3->Visible=false; } //--------------------------------------------------------------------------void __fastcall TForm1::N10Click(TObject *Sender) { Form3->Show(); } //--------------------------------------------------------------------------- void __fastcall TForm1::SpeedButton2Click(TObject *Sender) { TForm1::N7Click(Sender); } //--------------------------------------------------------------------------void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { Form3->Show(); } //--------------------------------------------------------------------------void __fastcall TForm1::SpeedButton4Click(TObject *Sender) { Form1->Close(); } //--------------------------------------------------------------------------void __fastcall TForm1::N9Click(TObject *Sender) { if(SaveDialog1->Execute()) { Memo1->Lines->SaveToFile(SaveDialog1->FileName); } } //--------------------------------------------------------------------------- void __fastcall TForm1::N15Click(TObject *Sender) { Memo1->Visible=true; Memo1->Clear(); if(OpenDialog1->Execute()) { Memo1->Lines->LoadFromFile(OpenDialog1->FileName); } } //--------------------------------------------------------------------------void __fastcall TForm1::N12Click(TObject *Sender) { Form2->Show(); } //--------------------------------------------------------------------------- Form3 //--------------------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit3.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TForm3 *Form3; //--------------------------------------------------------------------------__fastcall TForm3::TForm3(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm3::FormCreate(TObject *Sender) { Label6->Visible=false; Label7->Visible=false; Label8->Visible=false; Label9->Visible=false; Table1->Active=true; Table2->Active=true; Table3->Active=true; Table4->Active=true; Table5->Active=true; } //--------------------------------------------------------------------------- void __fastcall TForm3::Button1Click(TObject *Sender) { DBNavigator1->DataSource=DataSource2; //DBGrid1-> DataSource=DataSource2; } //--------------------------------------------------------------------------void __fastcall TForm3::ComboBox1Change(TObject *Sender) { switch(ComboBox1->ItemIndex) { case 0: Label6->Visible=false; Label7->Visible=false; Label8->Visible=false; Label9->Visible=false; Label6->Visible=true; DBNavigator1->DataSource=DataSource2; //DBGrid1-> DataSource=DataSource2; break; case 1: Label6->Visible=false; Label7->Visible=false; Label8->Visible=false; Label9->Visible=false; Label8->Visible=true; DBNavigator1->DataSource=DataSource1; //DBGrid1-> DataSource=DataSource1; break; case 2: Label6->Visible=false; Label7->Visible=false; Label8->Visible=false; Label9->Visible=false; Label7->Visible=true; DBNavigator1->DataSource=DataSource3; //DBGrid1-> DataSource=DataSource3; break; case 3: Label6->Visible=false; Label7->Visible=false; Label8->Visible=false; Label9->Visible=false; Label9->Visible=true; DBNavigator1->DataSource=DataSource4; //DBGrid1-> DataSource=DataSource4; break; case 4: DBNavigator1->DataSource=DataSource5; //DBGrid1-> DataSource=DataSource5; break; }//switch } //--------------------------------------------------------------------------void __fastcall TForm3::FormClose(TObject *Sender, TCloseAction &Action) { Table1->Active=false; Table2->Active=false; Table3->Active=false; Table4->Active=false; Table5->Active=false; } //--------------------------------------------------------------------------5. Тестовый пример; Выводы: В данной программе была реализована идея создания фрагмента оболочки экспертной системы. В результате была получена интегрированная среда по диагностике заболеваний. К плюсам данной программы можно отнести довольно поверхностные знания пользователя по работе с компьютером, которые требуются для работы с ней. Среди возможных пожеланий можно сказать о разработке системы помощи при работе с программой. Можно также усложнить программу, переписав ее так, чтобы она работала на основе рассуждений с использованием вероятностного подхода. Часто к экспертным системам предъявляют дополнительное требование - способность иметь дело с неопределенностью и неполнотой. Информация о поставленной задаче может быть неполной или ненадежной; отношения между объектами предметной области могут быть приближенными. Например, может не быть полной уверенности в наличии у пользователя некоторого симптома или в том, что данные, полученные при определении, верны. Во всех этих случаях как раз и необходимы рассуждения с использованием вероятностного подхода. Достоинства и недостатки продукционной модели. Продукционная модель чаще всего применяется в промышленных экспертных системах. Она привлекает разработчиков своей наглядностью, высокой модульностью, легкостью внесения дополнений и изменений и простотой механизма логического вывода. Имеется большое число программных средств, реализующих продукционный подход (язык OPS 5 [8]; "оболочки" или "пустые" ЭС — EXSYS [10], ESISP, ЭКСПЕРТ [2]; инструментальные системы ПИЭС [11] и СПЭИС [3] и др.), а также промышленных ЭС на его основе (ФИАКР [8]) и др. Продукционные модели имеют по крайней мере 2 недостатка. При большом числе продукций становится сложной проверка непротиворечивости системы продукций. Это заставляет при добавлении новых продукций тратить много времени на проверку непротиворечивости новой системы. Системе присуща недетерминированность (неоднозначность выбора выполняемой продукции из фронта активизируемых продукций) возникают принципиальные трудности при проверке корректности работы системы. Считается, что если в ИС число продукций достигнет тысячи, то мало шансов, что система продукций во всех случаях будет правильно функционировать ЛИТЕРАТУРА 1. К. Нейлор. Как построить свою экспертную систему. .М. Энергоатомиздат. 1991 г. 2. Элти Д. Экспертные системы. М. Наука. 1987 г. 3. . Ревунков Г.И. и др. Базы и банки данных и знаний. - М.: Высшая шко-ла, 1992 (5 шт.) 4. Осуга С. Обработка знаний/Пер. с яп. В.И. Этова. - М.: Мир, 1989 ( 8 шт.) 5. Тейлор К. Как построить свою экспертную систему/ Пер. с англ. Н.Н. Слепова. - М.: Энергоатомиздат, 1991 (17 шт.) 6. Таусенд К., Фохт Д. Проектирование и программная реализация экспертных систем на персональных ЭВМ /Пер с англ. В.А. Кондратенко. - М.: Финансы и статистика, 1990 (5 шт.) 7. Рот М. Интеллектуальный автомат :компьютер в качестве эксперта/ Пер. с нем. А.П. Свиридова. - М.: Энергоатомиздат, 1991 (5 шт.) 8. Выявление экспертных знаний/ отв. ред. С.В. Емельянов: АН СССР, ВНИИ системн. исследов. - М.: Наука, 1989 (7 шт.) 9. Уотермен Д. Руководство по экспертным системам: пер. с англ./ Под ред. В.Л. Стефанюка. - М.: Мир, 1989 (5 шт.)