ISSN 0236-235X (P)
ISSN 2311-2735 (E)

Journal influence

Higher Attestation Commission (VAK) - К1 quartile
Russian Science Citation Index (RSCI)

Bookmark

Next issue

2
Publication date:
16 June 2024

Integrating CLIPS with rule-based expert system

The article was published in issue no. № 3, 2011
Abstract:Embedding CLIPS kernel within C++-written program arises a problem of interaction between program and kernel. Method of organizing program interface between C++ program and embedded CLIPS is suggested. CLIPS and C++ functions and data constructs, developed for information exchange between program and embedded CLIPS, are described.
Аннотация:При интеграции ядра CLIPS в написанную на C++ программу возникает проблема налаживания их взаимодействия. Предлагается способ организации программного интерфейса между написанной на C++ программой и встроенным в нее ядром CLIPS. Описываются процедуры и объекты данных CLIPS и C++, используемые для обмена данными между программой и CLIPS-средой.
Author: (savva_dorovsky@front.ru) -
Keywords: C++, CLIPS, program interface, expert system, expert system
Page views: 18824
Print version
Full issue in PDF (5.05Mb)
Download the cover in PDF (1.39Мб)

Font size:       Font:

Экспертные системы – важная прикладная область искусственного интеллекта. Наиболее распространенными являются экспертные системы продукционного типа, к которым относятся большинство диагностических, планировочных и консультационных экспертных систем. Широкое распространение экспертных систем продукционного типа обусловило применение многообразных специализированных инструментальных средств их разработки, главное из которых – среда CLIPS. К основным достоинствам этого языка относятся встроенный объектно-ориентированный язык COOL, свободное распространение, мультиплатформенность, полная открытая документация. Разработчиками предоставляется возможность использовать CLIPS в качестве внедренного приложения, то есть программа на CLIPS может быть скомпилирована и скомпонована с программой на языке C++, которая будет вызывать CLIPS-фраг­менты как подпрограммы.

Учитывая отсутствие у CLIPS собственного графического интерфейса пользователя, интегрирование в программу – единственный способ соединить его возможности с богатым пользовательским интерфейсом, доступным программам на C++. Однако в таком случае перед разработчиком встает проблема организации программного интерфейса между внедренной в программу CLIPS-средой и собственно программой, написанной на C++. Проблема заключается в необходимости связать пользовательский интерфейс программы со встроенным ядром CLIPS таким образом, чтобы в ходе исполнения продукционных правил, требующих ввода информации, пользователь мог использовать кнопки, текстовые поля и другие элементы графического интерфейса для ответа на вопросы CLIPS. Сам ответ должен адекватно передаваться CLIPS, а информация из CLIPS-среды (например, текст заданного в ходе исполнения правила вопроса) поступать пользователю, отображаясь на экране в виде диалоговых окон, текстовых полей, кнопок и т.д. Например, при исполнении продукционного правила, требующего от пользователя выбрать один из двух вариантов ответа, на экране должны появиться текст вопроса и две кнопки с вариантами ответа. Ведущая роль CLIPS как средства разработки экспертных систем делает проблему организации интерфейса актуальной для всех, кто занимается разработкой. В настоящей статье на примере конкретной экспертной системы предлагается подход к организации программного интерфейса, отвечающего вышеописанным требованиям.

Рассмотрим проблемы организации интерфейса, возникающие при разработке системы интеллектуальной поддержки конструирования математических моделей гидродинамических систем. Экспертная система строит модели, описывающие движение сплошной среды для гидродинамических систем с различным характером упорядочения на основе онтологии предметной области и требований пользователя. Целевыми результатами работы системы являются математические модели гидродинамических систем в виде систем дифференциальных уравнений в дивергентной форме.

Разработанная система является экспертной системой продукционного типа и состоит из пользовательского интерфейса, рабочей памяти, базы знаний и машины логического вывода. Для представления знаний в системе используется онтология гидродинамических моделей, содержащая понятия (термины) и отношения, в которых выражены знания из рассматриваемой экспертной области. Рабочая память хранит связанные отношениями экземпляры классов онтологии, описывающие качественную и математическую модели. База знаний содержит оперативные знания из предметной области, выраженные в терминах онтологии и организованные в виде продукционных правил. Правила анализируют содержащуюся в рабочей памяти модель на полноту и непротиворечивость, управляют диалогом с пользователем и строят математическую модель (систему дифференциальных уравнений) по качественной модели.

То, что разработанная система является экспертной системой продукционного типа, определило выбор CLIPS как языка реализации онтологии гидродинамических моделей и продукционных правил, ведущих диалог с пользователем и конструирующих модели.

Онтология и база знаний (набор продукционных правил) экспертной системы реализованы на языке CLIPS 6.3. Пользовательский интерфейс реализован средствами Borland C++ Builder 6.0. Интегрирование CLIPS осуществляется посредством включения в текст программы модулей, содержащих исходный код ядра CLIPS, после чего возможно обращение к CLIPS с помощью функций API. Таким образом, в разработанной экспертной системе машина логического вывода, база знаний и рабочая память содержатся в ядре CLIPS, а графический интерфейс пользователя, написанный разработчиком данной системы, является частью текста программы на C++ и носит внешний по отношению к ядру характер. Все классы, объекты классов, переменные, функции и продукционные правила, реализованные на языке CLIPS, хранятся в ядре CLIPS во внутренней форме представления. Среду, образованную их совокупностью, назовем CLIPS-средой. С точки зрения программы, в которую интегрировано ядро CLIPS, работа с объектами CLIPS-среды возможна только посредством функций API. Функции API пре- дусмотрены для работы с интегрированным в программу ядром CLIPS и дублируют действия команд на языке CLIPS: загрузка и запись в файл содержимого рабочей памяти, запись и загрузка правил из текстового файла в базу знаний, вызов внутренних функций CLIPS, изменение значений слотов у объектов классов, запуск правил из базы знаний и т.д.

Проблема организации интерфейса между программой и ядром CLIPS

CLIPS как самостоятельное приложение работает в текстовом режиме: пользователь вводит в командной строке команды на языке CLIPS, ввод пользователя чередуется с текстовым выводом CLIPS-машины. В CLIPS нет графического интерфейса пользователя с такими стандартными средствами ввода Windows, как диалоговые окна, кнопки, выпадающие списки и поля текстового ввода, а есть только функции ввода с клавиатуры наподобие scanf() в C. Функции вывода в языке CLIPS позволяют выводить текст на экран (если CLIPS является самостоятельным приложением) или в текстовый файл, их аналог в языке C – printf().

Разработанная экспертная система функционирует в режиме диалога с пользователем. При исполнении многих продукционных правил пользователю задается вопрос, ответ на который в зависимости от типа вопроса состоит в выборе одного из нескольких альтернативных вариантов или вводе текста (например, названия какого-нибудь объекта). В зависимости от ответа CLIPS-машина должна совершить те или иные действия с объектами классов в рабочей памяти: создать (удалить) объект или изменить значения его слотов. Графически работа программы должна выглядеть как последовательная смена на экране диалоговых окон с кнопками или выпадающими списками для вариантов ответа пользователя и полями для текстового ввода.

Возможности обмена данными между программой и интегрированной в нее CLIPS-средой, предоставляемые функциями CLIPS API, неадекватны требованиям к программе, накладываемым спроектированным пользовательским интерфейсом. CLIPS не имеет функций, позволяющих узнать, какую кнопку нажал пользователь или какой текст он ввел в поле окна; также нет функций вывода в переменные программы, внешние по отношению к ядру CLIPS.

Все вышесказанное порождает проблему организации программного интерфейса между ядром CLIPS и содержащей его программой.

Предлагаемое решение проблемы

Обмен данными между программой и интегрированным в нее ядром CLIPS осуществляется с помощью глобальных переменных – объектов данных программной среды CLIPS. Их особенность в том, что они сохраняют свои значения вне области определения конструкций CLIPS, таких как defrule и deffunction [1].

В среде CLIPS глобальные переменные определяются с помощью конструкции defglobal [2]:

(defglobal ?*имя_переменной*=выражение)

Значение глобальной переменной можно легко изменить в теле любой функции или правила CLIPS с помощью команды bind [2]:

(bind ?* имя_переменной * выражение)

API CLIPS предоставляет функции, считывающие из программы, содержащей ядро CLIPS, и изменяющие в ней значения глобальных переменных [3]:

GetDefglobalValue("имя_переменной",&указатель)

SetDefglobalValue("имя_переменной",&указатель)

Для передачи из ядра CLIPS в пользовательский интерфейс информации, полностью описывающей сообщение или вопрос, который экспертная система задает пользователю (включая варианты ответа и соответствующие им действия над рабочей памятью), используется пакет глобальных переменных:

?*questiontype* – тип сообщения или вопроса к пользователю (целочисленная);

?*questiontext1* – текст вопроса к пользователю (текстовая);

?*answersnumber* – количество вариантов ответа пользователя (целочисленная);

?*inputtext* – введенный пользователем текст (текстовая);

?*buttontext1*, ?*buttontext2*, ?*button­text3* – надписи на кнопках диалогового окна, обозначающие варианты ответа (текстовые);

?*command1*, ?*command2*, ?*command3* – текст команд на CLIPS, соответствующих вариантам ответа пользователя (текстовые);

?*commandparams1*, ?*commandparams2*, ?*commandparams3* – аргументы соответствующих команд (текстовые).

Переменная questiontype характеризует тип вопроса с точки зрения содержания предъявляемого пользователю диалогового окна и реакцию интерфейса на действия пользователя. Выделяется пять типов вопросов, каждому из которых соответствует целочисленное значение переменной.

NONE – нет вопросов. CLIPS-машина ничего не передает программе, сигнализирует о конце работы машины логического вывода.

STATEMENT – нет вопроса. В протокол работы системы добавляется текстовое сообщение, диалоговое окно не выводится, сообщается о действиях машины логического вывода.

OK_STATEMENT – выводится диалоговое окно с текстом сообщения и кнопкой OK. Используется для привлечения внимания пользователя к сообщениям, вывода предупреждений, контрольных сообщений во время отладки программы и справочных пояснений.

ENTER_TEXT – выводится диалоговое окно с текстом сообщения, полем для ввода текста и кнопками OK и ПРОПУСТИТЬ. Используется для получения текстового ввода пользователя, как правило, для названия какого-нибудь объекта. Схема окна приведена на рисунке.

QUESTION – вопрос с несколькими вариантами ответа. Выводится диалоговое окно с несколькими подписанными кнопками (количество определяется значением целочисленной переменной answersnumber, но не более трех) и кнопкой ПРОПУСТИТЬ. Надписи на кнопках берутся из значений переменных buttontext1, buttontext2, buttontext3 (см. рис.).

В случаях NONE, STATEMENT, OK_STA­TEMENT и при выборе кнопки ПРОПУСТИТЬ обратно в ядро CLIPS никакая информация не передается. При выборе пользователем одного из вариантов ответа (в случае QUESTION) или введении текста (в случае ENTER_TEXT) в рабочую память CLIPS-машины вносятся изменения, состоящие в создании или удалении объектов классов CLIPS и/или изменении значений полей объектов.

Для реализации действий над рабочей памятью ядра, соответствующих выбранному пользователем варианту ответа, используется функция API CLIPS FunctionCall [3]:

FunctionCall("имя_функции", "список_аргумен­тов", & указатель)

Подпись: Схематический вид диалоговых окон типов QUESTION (вверху) и ENTER_TEXT (внизу). В местах надписей располагаются значения одноименных текстовых переменныхЭта функция является API-аналогом команды CLIPS и заставляет ядро CLIPS выполнить команду (имя_функции список_аргументов), то есть запустить определенную в среде CLIPS функцию с соответствующим именем, передав ей указанные аргументы. Имена и аргументы функций, которые должны быть запущены при выборе пользователем одного из вариантов ответа, передаются из ядра CLIPS через глобальные переменные command1, command2, command3 и commandparams1, commandparams2, commandparams3. Сами функции для всех действий над рабочей памятью, возможных в ходе работы экспертной системы, разработаны и реализованы на языке CLIPS, модули с их определениями загружаются в память ядра при инициализации CLIPS-машины как онтология, база знаний и начальное содержимое рабочей памяти.

В случае, когда пользователя просят ввести текст (questiontype=ENTER_TEXT), этот текст присваивается глобальной переменной inputtext, после чего с помощью FunctionCall() вызывается функция CLIPS без аргумента (ее имя хранится в command1), присваивающая одному из полей какого-нибудь объекта в рабочей памяти значение этой переменной.

Таким образом, передача информации из ядра в содержащую ядро программу осуществляется посредством считывания программой значений глобальных переменных, а передача информации обратно, то есть выполнение действия над рабочей памятью, – в виде записи в одну глобальную переменную и внешнего вызова функций ядра.

Описанный способ обмена информацией требует прерывания работы машины логического вывода, для которого в CLIPS нет функций. Для решения этой проблемы реализована схема работы экспертной системы, основанная на введении шага работы и его циклическом повторении. Шаг состоит из запуска продукционных правил из базы знаний системы по одному. Для этого используется функция CLIPS API Run(runLimit), аналогичная команде CLIPS (run runLimit), где параметр runLimit определяет количество последовательно запускаемых продукционных правил. CLIPS и его функции API намеренно спроектированы так, чтобы программисту невозможно было управлять выбором правила, которое запустит машина логического вывода. Единственный способ повлиять на запуск правил – это изменить состояние рабочей памяти [1].

Шаг работы системы лучше всего описывается функцией, которая его реализует:

void MakeCLIPSStep()

{

***

AnswerCLIPS(); // передача информации в ядро, вызов из программы функций CLIPS

Run(1); // запуск следующего продукционного правила

GetCLIPSQuestion(); // считывание информации из ядра

PrepareQuestionPanel(); // вывод диалогового окна, сформированного на основе полученной от ядра информации

}

Здесь функция AnswerCLIPS() модифицирует содержимое рабочей памяти с помощью функции FunctionCall(), запуская написанные на CLIPS функции, имена и аргументы которых считываются из соответствующих глобальных переменных на предыдущем шаге. GetCLIPSQuestion() считывает значения глобальных переменных, описывающих новый вопрос CLIPS: тип вопроса, его текст, имена и аргументы написанных на CLIPS функций, соответствующие вариантам ответа, надписи на кнопках. PrepareQuestionPanel(), опираясь на полученную информацию о вопросе или сообщении, выводит на экран текст вопроса и необходимые графические элементы управления.

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

(defrule название_правила ""

(условия_активации_правила)

=>

*** // все действия, не относящиеся к взаимодействию с пользователем

(bind ?*questiontype* номер_типа_вопроса)

(bind ?*questiontext* "текст_вопроса_или_сообще­ния")

(bind ?*buttontext1* надпись_на_кнопке_1_вари­анта_ответа)

(bind ?*buttontext2* надпись_на_кнопке_2_вари­анта_ответа)

(bind ?*buttontext3* надпись_на_кнопке_3_вари­анта_ответа)

(bind ?*answersnumber* количество_вариантов_ ответа)

(bind ?*command1* "имя_функции,_соответствую­щей_1_варианту_ответа")

(bind ?*command2* "имя_функции,_соответствую­щей_2_варианту_ответа")

(bind ?*command3* "имя_функции,_соответствую­щей_3_варианту_ответа")

(bind ?*commandparams1* "список_аргументов_ функ­ции_для_1_варианта")

(bind ?*commandparams2* "список_аргументов_ функции_для_2_варианта")

(bind ?*commandparams3* "список_аргументов_ функции_для_3_варианта")

)

Подытоживая, заметим, что представленный подход к организации программного интерфейса позволяет надежно связать работу машины логического вывода CLIPS и элементы графического интерфейса пользователя, реализованные средствами C++. Основными чертами подхода являются использование глобальных переменных CLIPS для передачи информации о вопросе/сообщении и соответствующем ему состоянии пользовательского интерфейса; внешний вызов написанных на CLIPS функций для реализации действий над рабочей памятью, соответствующих выбранному пользователем варианту ответа; исполнение продукционных правил по одному для совершения двух предыдущих операций.

Хотя подход проиллюстрирован на конкретном примере системы поддержки конструирования гидродинамических моделей с простым пользовательским интерфейсом, не содержащим много элементов управления, он может быть легко приспособлен для нужд любого другого интерфейса. Достаточно добавить глобальные переменные для новых элементов управления и модифицировать список типов вопросов/сообщений так, чтобы он содержал новые конфигурации элементов интерфейса, которые могут возникнуть в ходе работы программы. Предлагаемый метод достаточен для организации взаимодействия пользователя со встроенной в программу продукционной системой, исполняющей любую программу на CLIPS, то есть универсален, так как все виды ввода, которые продукционные правила могут потребовать от пользователя, сводятся к вводу текста, вводу числа или выбору одного из нескольких вариантов. Работоспособность описанного в статье подхода опробована в реализованной экспертной системе поддержки конструирования гидродинамических моделей.

Литература

1.   Джарратано Дж., Райли Г. Экспертные системы: принципы разработки и программирование. М.: Издат. дом «Вильямс», 2007.

2.   CLIPS Reference Manual, Volume I, Basic Programming Guide // CLIPS: A tool for building expert systems. URL: http://clipsrules.sourceforge.net/documentation/v630/bpg.htm (дата обращения: 12.06.2011).

3.   CLIPS Reference Manual, Volume II, Advanced Programming Guide // CLIPS: A tool for building expert systems. URL: http://clipsrules.sourceforge.net/documentation/v630/apg.htm (дата обращения: 12.06.2011).


Permanent link:
http://swsys.ru/index.php?page=article&id=2813&lang=en
Print version
Full issue in PDF (5.05Mb)
Download the cover in PDF (1.39Мб)
The article was published in issue no. № 3, 2011

Perhaps, you might be interested in the following articles of similar topics: