Як «прикрутити» 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-файлах. Наприклад, функція CreceEnvironment записана як __ CreceEnvironment.

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();

Після виконання стандартних для середовища дій щодо завантаження експертної системи, кінцева програма повноцінно використовує механізм експертних систем. Наприклад, як показано на малюнку:

Таким чином, ми запустили середовище створення експертних систем (як і саму експертну систему) в додатку, написаному під Linux.

P.S. У програмі можна повністю передати контроль середовищу, використовуючи при цьому команду CommandLoop і реалізуючи командний рядок системи.

Література

1. CLIPS Reference Manual. Volume II. Advanced Programming Guide.

COM_SPPAGEBUILDER_NO_ITEMS_FOUND