7. Программное обеспечение, используемое при разработке систем, основанных на знаниях.
При разработке экспертных систем могут быть использованы следующие программные средства:во-первых, оболочки экспертных систем;
во-вторых, специальные программные среды;
в-третьих, языки логического программирования;
в-четвертых, универсальные алгоритмические языки;
в-пятых, средства поддержки экспертных систем.
Оболочки экспертных систем (ОЭС) содержат больше всего заранее скомпонованных элементов экспертных систем. Обычно оболочки строились в результате анализа уже существующей системы. Например, оболочка типа EMPTY-MYCIN (EMYCIN) создана на основе действующей системы MYCIN. EMYCIN включает ограниченную схему управления посредством обратных цепочек рассуждений, механизмы вычисления коэффициентов уверенности и механизмы автоматического опроса пользователя. Данная оболочка имеет средства поддержки, которые содержат механизмы усовершенствованного интерфейса для объяснений рассуждений системы и для приобретения новых знаний Другим примером оболочки экспертной системы является система KAS (KNOWLEDGE ACQUISITION SYSTEM- система приобретения знаний). Система KAS представляет собой экспертную систему PROSPECTOR, из которой удалены предметные знания. KAS использует для представления знаний правила логического вывода. Правилам вывода приписываются коэффициенты уверенности. Механизм вывода основан на использовании прямых и обратных цепочек рассуждений. Средства поддержки KAS включают механизм объяснения и приобретения знаний, обеспечивают распознавание синонимов, пересмотр и анализ ответов. Кроме рассмотренных можно выделить следующие распространенные оболочки экспертных систем: VP-EXPERT, INSIGHT, G2, LOGIAN, RULEMASTER, KNOWLEDGE GRAFT и другие. Использование оболочек является очень удобным, если они пригодны. Однако, конструктивные подходы ОЭС ориентированы на исходный (эталонный) вариант экспертной системы. Для всех последующих экспертных систем возможности решения возникающих задач ограничены имеющимися конструктивными подходами. Специальные программные среды, такие как POPLOG, дают меньше готовых решений, но предлагают более широкий выбор средств. Например, в системе POPLOG:во-первых, предусмотрен язык логического программирования;
во-вторых, имеется экранный редактор, ориентированный на решаемую задачу;
в-третьих, имеется ряд частично готовых модулей, собранных в библиотеки.
К недостаткам использования специальной программной среды можно отнести, то что она является довольно дорогой. Языки логического программирования дают возможность достаточно просто описать экспертную систему. Данные языки имеют специальные средства, облегчающие логическое моделирование. К языкам данной группы можно отнести следующие языки:Во-первых, язык PROLOG (ПРОЛОГ). Программа на языке Пролог состоит из правил (отношений вывода). Интерпретатор Пролога проверяет истинность заданных отношений через цепочки рассуждений. Существует значительное количество версий языка Пролог.
Во-вторых, язык LISP (ЛИСП). LISP (ЛИСП) представляет собой очень гибкий язык программирования. Язык ЛИСП предлагает набор функций-примитивов. Из функций примитивов программист может создать функции более высокого уровня, которые приспособлены к требованиям конкретной прикладной области. Лисп имеет механизмы для обработки символьных текстов в виде списковых структур. Примечательно, что Лисп обеспечивает автоматическое управление памятью и единый подход к обработке программы и данных. Единый подход позволяет Лисп-программам изменять самих себя. Существует много диалектов языка Лисп.
В-третьих, язык PSL (PORTABLE STANDARD LISP), который представляет собой переносимый диалект языка Лисп. Данный диалект обеспечивает все свойства стандартного Лиспа и дополнен расширениями языка и интерфейса. Операторы языка PSL обеспечивают описание объектов информационно-экономических систем, их характеристик, свойств, признаков, а также отношений и взаимоотношений, существующих между этими объектами.
Недостатком языков логического программирования является низкая эффективность реализации экспертной системы. Универсальные алгоритмические языки, такие как С++, VB, Delphi позволяют обеспечить наиболее эффективные реализации экспертных систем. Однако, при использовании данных языков, разработчик должен предварительно удостовериться в принципиальной пригодности машины логического вывода и систем продукций. Под средствами поддержки понимаются пакеты программ, которые прилагаются к средству построения экспертной системы. Средства поддержки обеспечивают повышение эффективности выбранного средства построения экспертной системы и облегчают его использование. Выделяют четыре типовых компоненты, поддерживающих окружение для экспертных систем: во-первых, средства отладки;во-вторых, средства ввода недостающих знаний;
в-третьих, средства объяснения;
в-четвертых, редакторы базы знаний.
При разработке систем, основанных на знаниях, могут быть использованы следующие средства отладки:во-первых, автоматическое тестирование;
во-вторых, средства трассировки;
в-третьих, управление прерываниями.
Автоматическое тестирование предполагает разработку значительного числа (несколько тысяч) тестовых вариантов с их правильными решениями. При включении новых правил в систему, основанную на знаниях, автоматически проверяется корректность включаемого правила. Средства трассировки являются инструментом, позволяющим проследить последовательность действий экспертной системы. Управление прерываниями позволяет обеспечить остановку работы экспертной системы в заданном месте. Средства ввода недостающих знаний обеспечивают приобретение знаний, в том случае, если при работе экспертной системы имеющейся в базе знаний информации оказалось недостаточно. Если необходимая информация отсутствует в базе знаний, то начинает функционировать механизм приобретения знаний. Данный механизм формирует необходимые запросы. В некоторых системах средства ввода недостающих знаний позволяют вводить в ходе работы экспертной системы произвольную информацию. В других системах запросы оформлены в виде меню. Средства объяснения являются важнейшим способом повышения доверия пользователя к решениям, принимаемым экспертными системами. Механизм объяснения может быть реализован с использованием следующих принципов: Принцип ретроспективного рассуждения предполагает, что система выдает всю цепочку рассуждений, приведших к полученному заключению. Принцип гипотетических рассуждений предполагает, что система объясняет, что получилось бы, если бы фактические знания были бы другими. Принцип контрфактических рассуждений, предполагает, что система объясняет почему ожидаемое заключение не получено. Редакторы базы знаний предназначены для модификации правил, хранящихся в базе знаний. При модификации правил редакторы базы знаний могут осуществлять синтаксический и семантический контроль. При синтаксическом контроле редактор проверяет соответствие задаваемых пользователем правил синтаксису языка экспертной системы. При семантическом контроле редактор проверяет, не противоречат ли вводимые знания существующим знаниям системы.8. Дополнительные алгоритмы обработки базы знаний.
В связи с тем, что экспертная система представляет собой систему, направляемую базой знаний, то данную систему можно представить в виде совокупности алгоритмов, обеспечивающих обработку базы знаний. Дополнительно можно рассмотреть алгоритмы решения следующих задач: Задача 1. Имеется база знаний, основанная на правилах. Требуется разработать процедуру в программной среде DELPHI, обеспечивающую формирования массива терминальных (целевых) фактов. Терминальным называется факт, на котором завершается цепочка логического вывода. Программный код может иметь следующий вид:Procedure Terminal ( BaseKnow : Tbase ;
Nr : Integer ;
Var TermFact : Array_fact;
Var Ntf : Integer );
{ ПРОЦЕДУРА ОПРЕДЕЛЕНИЯ ТЕРМИНАЛЬНЫХ ФАКТОВ }
Var Key , I , J , L , K : Integer ;
Begin
With BaseKnow Do
Begin
Ntf := 0;
For I := 1 To Nr Do
Begin
{ ПРОСМОТР ВСЕХ ПОРОЖДАЕМЫХ ФАКТОВ }
Key := 0 ;
For J := 1 To Ntf Do
{ ПРОВЕРКА НА ПОВТОРНОЕ ЗАНЕСЕНИЕ
ТЕРМИНАЛЬНОГО ФАКТА }
If Rule [I]. FactOut = TermFact [J] Then Key := 1;
If Key = 0 Then
Begin
For L := 1 To Nr Do
For K := 1 To Rule [L].Quant Do
{ ПРОВЕРКА НА ВХОЖДЕНИЕ ФАКТА В ЧИСЛО
ПОРОЖДАЮЩИХ }
If Rule [I]. FactOut = Rule [L]. FactIn [K] Then
Key := 1 ;
End;
If Key = 0 Then
Begin
{ ЗАНЕСЕНИЕ ТЕРМИНАЛЬНОГО ФАКТА
В МАССИВ ТЕРМИНАЛЬНЫХ ФАКТОВ }
Ntf := Ntf + 1 ;
TermFact [Ntf] := Rule [I]. FactOut ;
End;
End; { For I }
End; { With }
End; { Procedure }
Задача 2. Имеется база знаний, основанная на правилах. Требуется разработать процедуру в программной среде DELPHI, обеспечивающую формирование новой базы знаний. В новую базу знаний включаются все правила, которые могут быть порождены на основе заданного множества начальных фактов и фактов, порожденных данным множеством. Программный код может иметь следующий вид:Procedure NewBaseKnow ( BaseKnow:Tbase; {База знаний}
NR:Integer; {Число правил}
NF:Integer ; {Число фактов}
Var NewBase:Tbase; {Новая база знаний}
Var NrN:Integer);{Число правил в новой базе знаний}
{ Процедура формирования новой базы знаний}
Var
KeyF:Boolean;{Ключ возможности порождения нового
факта}
KeyP:Boolean;{Ключ наличия требуемого порождающего
факта}
KeyC: Boolean;{Ключ исключения зацикливания}
I,J,K,L: Integer; { рабочие переменные}
Begin
With BaseKnow Do
Begin
NrN := 0;
KeyC := True;
While KeyC Do
Begin
{ Организация обработки БЗ до тех пор, пока
существует возможность порождения новых фактов}
KeyC :=False; { Если ключ не изменится,
то новый факт невозможно породить}
For I:= 1 To NR Do
Begin
KeyF:= True;
{Проверка: имеется ли проверяемое правило
в новой базе знаний? }
For J := 1 To NrN Do
If (Rule[I].FactOut = NewBase.Rule[J].FactOut) And
(Rule[I].Quant = NewBase.Rule[J].Quant) And
(Rule[I].FactIn[1] = NewBase.Rule[J].FactIn[1]) And
(Rule[I].FactIn[2] = NewBase.Rule[J].FactIn[2]) And
(Rule[I].FactIn[3] = NewBase.Rule[J].FactIn[3]) Then
KeyF := False;
{ Проверка: можно ли породить факт? }
For K := 1 To Rule[I].Quant Do
Begin
KeyP := False;
For J := 1 To Nf Do
{ Проверка наличия требуемого порождающего факта
в базе знаний}
If Rule[I].FactIn[K] = Fact[J] Then KeyP:= True;
If KeyP = False Then KeyF := False;
End; {For K}
If KeyF Then
Begin
{Все факты, необходимые для порождения нового факта,}
{ есть в наличии }
Nf := Nf + 1; { Порождение нового факта }
Fact[Nf] := Rule[I].FactOut;
{Формирование новой базы знаний}
NrN:=NrN +1;
NewBase.Rule[Nrn].FactOut := Rule[I].FactOut;
NewBase.Rule[Nrn].Quant := Rule[I].Quant;
NewBase.Rule[Nrn].FactIn[1] := Rule[I].FactIn[1];
NewBase.Rule[Nrn].FactIn[2] := Rule[I].FactIn[2];
NewBase.Rule[Nrn].FactIn[3] := Rule[I].FactIn[3];
KeyC := True;
End; {If}
End; {For I}
End; { While}
End; {With}
End;{Procedure}
Задача 3. Имеется база знаний, основанная на правилах. Требуется разработать функцию в программной среде DELPHI, обеспечивающую тестирование базы знаний на наличие противоречивых правил. Если в базе знаний имеются два правила, имеющие полностью совпадающие порождающие факты, но различные порождаемые факты, то формируется выходное значение “TRUE”, иначе формируется выходное значение “FALSE”. Программный код может иметь следующий вид:Function TestBaseKnow ( BaseKnow : Tbase ;
Nr : Integer) :Boolean;
{ Функция тестирования базы знаний
на наличие противоречивых правил}
Var I, J: Integer ;
Begin
With BaseKnow Do
Begin
TestBaseKnow:=False;
For I := 1 To Nr-1 Do
For J := I+1 To Nr Do
{ Организация сравнения каждого правила
со всеми остальными правилами }
If (Rule[I].FactOut <> Rule[J].FactOut) And
(Rule[I].Quant = Rule[J].Quant) And
(Rule[I].FactIn[1] = Rule[J].FactIn[1]) And
(Rule[I].FactIn[2] = Rule[J].FactIn[2]) And
(Rule[I].FactIn[3]=Rule[J].FactIn[3]) Then
TestBaseKnow:=True;
End;{With}
End;{Function}
Задача 4. Имеется база знаний, основанная на правилах. Требуется разработать процедуру в программной среде DELPHI, обеспечивающую тестирование базы знаний на наличие дублирующих правил. Если в базе знаний одно и тоже правило встречается несколько раз, то последующие вхождения правил удаляются. Программный код может иметь следующий вид:Procedure TestDuplicate ( Var BaseKnow : Tbase ;
Var Nr : Integer) ;
{ Процедура тестирования на дублирующие правила.
Повторно встречающиеся правила удаляются.}
Var
I, J: Integer;
Nrn :Integer;{Новое количество правил}
Mask: Array [1..20] Of Boolean;{ Массив «Маска»}
Begin
With BaseKnow Do
Begin
For I:=1 To Nr Do
{ Подготовка массива «Маска» }
Mask[I] := True;
For I := 1 To Nr-1 Do
For J := I+1 To Nr Do
{ Создание массива «Маска» }
If (Rule[I].FactOut = Rule[J].FactOut) And
(Rule[I].Quant = Rule[J].Quant) And
(Rule[I].FactIn[1] = Rule[J].FactIn[1]) And
(Rule[I].FactIn[2] = Rule[J].FactIn[2]) And
(Rule[I].FactIn[3] = Rule[J].FactIn[3]) Then
Mask[J]:=False;
Nrn :=0;
For I := 1 To Nr Do
If Mask [I] Then
Begin
{Отбор сохраняемых правил}
Nrn := Nrn + 1;
Rule[Nrn].FactOut := Rule[I].FactOut;
Rule[Nrn].Quant := Rule[I].Quant;
Rule[Nrn].FactIn[1] := Rule[I].FactIn[1];
Rule[Nrn].FactIn[2] := Rule[I].FactIn[2];
Rule[Nrn].FactIn[3] := Rule[I].FactIn[3];
End; {If,For}
{ Присвоение нового количества правил}
Nr:=Nrn;
End; { With }
End; { Procedure }