Як «прикрутити» CLIPS до додатка під Linux

Продукт CLIPS (C-language Integrated Priduction 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();

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



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

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

Література

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

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.