Продукт 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.
