[Из песочницы] Как «прикрутить» CLIPS к приложению под Linux

Продукт CLIPS (C-language Integrated Production System) появился в 1984 году как среда для разработки экспертных систем для проектов NASA. Несмотря на то, что данный проект был приостановлен, разработчики продолжили совершенствования данной среды — последнее обновление было выпущено в 2006 году.CLIPS предусматривает интеграцию в различные приложения, написанные как на языках C и C++, так и на Java. Интересно, что в расширенном руководстве программиста среды показаны варианты интеграции в windows-приложения, но нет ни слова об интеграции в приложения, написанные под Linux.

В процессе написания диссертации я столкнулся со следующей проблемой: мою экспертную систему необходимо было запустить в Linux-подобной ОС, при этом основное приложение, использующее экспертную систему, должно было быть написано на чистом С. Для проверки такой возможности была выбрана Fedora, а весь код был написан в ECLIPSE. Возможно, данный опыт может показаться кому-либо полезным.Начну с того, что CLIPS предлагает следующие варианты интеграции [1]:

1. Интеграция с использованием открытого кода.Наличие открытого кода подразумевает, что нужно перекомпилировать весь проект, «подцепив» к нему все исходные файлы, а дальше уже обращаться ко всем функциям среды напрямую. Вариант был отсеян, т.к. кроме подключения экспертной системы было необходимо еще обрабатывать данные, поступающие в неё, в реальном времени, а тратить время на постоянную долгую компиляцию не хотелось.

2. Интеграция с использованием DLL.Один из основных вариантов, предлагаемых разработчиками, в руководстве имеется полное описание функций и вариантами их подключения. Отличный вариант для Windows-приложений, но абсолютно непригодный для использования в Linux.

3. Интеграция с использованием Shared objects.Разработчиками заботливо собрана библиотека libclips.so, доступная в репозитарии, но полностью забытая в документации. Данный вариант и был принят для реализации, хотя в некоторые моменты я об этом очень пожалел.

На примере основной функции «создать окружение», конечные действия для подключения данной библиотеки к программе можно описать следующим алгоритмом:

1. С помощью команды nm -D /usr/lib/libclips.so.2.0.0 получается список всех функций, которые есть в библиотеке. Подводный камень заключается в том, что некоторые функции данной библиотеки имеют имена, не совпадающие в header-файлах. К примеру, функция CreateEnvironment записана как __CreateEnvironment.

2. В header-файлах ищем описание конкретной функции и определяем её как тип в своей программе: typedef void * (*CreateEnvironmentPtr)(void);

3. Затем определяется переменная данного типа: CreateEnvironmentPtr __CreateEnvironment;

4. После стандартного подключения библиотеки libclips.so с помощью команды dlopen, выполняется загрузка функции из библиотеки:__CreateEnvironment = (CreateEnvironmentPtr) dlsym (dll_handle, «CreateEnvironment»);

5. Определяется указатель: void *theEnv; с помощью которого и создаётся окружение CLIPS: theEnv = __CreateEnvironment ();

После выполнения стандартных для среды действий по загрузке запуску экспертной системы, конечная программа полноценно использует механизм экспертных систем. Например, как показано на рисунке:

7fe5c4b97521438aa8d81b4bec2be1b0.jpg

Таким образом, мы запустили среду создания экспертных систем (как и саму экспертную систему) в приложении, написанном под Linux.

P.S. В программе можно полностью передать контроль среде, используя при этом команду CommandLoop и реализуя командную строку системы.

Литература1. CLIPS Reference Manual. Volume II. Advanced Programming Guide.

© Habrahabr.ru