вторник, 3 апреля 2012 г.

Среда разработки экспертных систем CLIPS

В этом семестре у нас начался курс экспертных систем. К сожалению, много лекций пропало, а среди выданного материала была только методичка с выполнением лабораторной работы в древней системе GURU, в которой не излагалось ни основных концепций, ни даже самого языка экспертной системы. По этому по старой традиции я решил заняться самообразованием.

Начнем с самого начала. Что такое экспертные системы? Согласно Википедии, это "компьютерная программа, способная частично заменить специалиста-эксперта в разрешении проблемной ситуации". Иными словами, экспертной системой можно назвать любую систему, которой можно задать вопрос, относящийся к какой-либо предметной области. В более широком смысле экспертной можно назвать ИС, созданную на базе любых технологий, но как правило для их создания применяются специализированные среды.

Среда разработки экспертных систем в первую очередь предоставляет язык или библиотеку для описания предметной области, а так же среду для выполнения скриптов на этом языке. Хорошим примером подобной системы как раз является CLIPS.



CLIPS (Language Integrated Production System) – созданная в 1984-м году одной из лабораторий НАСА экспертная система, которая использует LISP-подобный язык для описания предметной области. Язык этой системы прекрасно подходит для описания любых логических связей, он оперирует следующими тремя понятиями:

  • факты (facts)
  • правила (rules)
  • объекты (objects).
Факты в данном случае – это дискретная единица информации, которой может оперировать система. Факты бывают двух видов: упорядоченные и неупорядоченные. Первые, как ясно из названия, представляют собой упорядоченные кортежи значений базовых типов – списков, чисел, строк, атомов и ссылок. Вторые представляют собой именованные пары ключ-значение и во многом похожи на struct из C без методов. Любой факт начинается с атома, который является именем факта:
(fact-without-fields)
(my-ordered-fact 1 2.0 "three" four)
(some-unordered-fact (username "Ha><0r") (description "script kiddie"))
Перед использованием, неупорядоченные факты необходимо определять. Такая же практика рекомендуется и для упорядоченных фактов, но их объявления могут быть "выведены" из использования. Факт определяется путем указания шаблона факта. Шаблон содержит как сами поля, так и различные метаданные на них, такие как тип и значение по умолчанию.
(deftemplate land-maximum-candidate
  (slot name (default ?NONE) (type STRING))
  (slot berry-of-choice (default ?NONE) (type STRING))
  (slot profit (default ?NONE) (type FLOAT))
  (slot checked (default FALSE) (type SYMBOL)))
Если тип или значение по умолчанию не указаны, то слот (slot – так называются поля факта) будет получать автоматическое значение NONE и принимать значение любого типа.

Над фактами можно оперировать с помощью правил. Правило имеет условия срабатывания и действия, так же называемые левой стороной (LHS) и правой стороной (RHS). Работа с условиями срабатывания CLIPS во многом похоже на сопоставление с образцом: LHS задает "шаблон внешних условий", представляющий из себя набор уточненных темплейтов фактов и предикатов. Пример правила:
(defrule bind-berry-land
  (land-coef (name ?name) (coef ?coef))
  (berry (name ?bname)
              (fruit-coef ?fcoef) (leaves-coef ?lcoef))
  => (assert (berry-land
               (name ?bname) (land-name ?name)
               (leaves-pollution (* ?fcoef ?coef))
               (fruit-pollution (* ?lcoef ?coef)))))
Данное правило срабатывает на всех комбинациях известных ягод и земельных участков, создавая новый факт о возможности посадки данного типа ягод на этом поле, содержащий в себе коэфициенты загрязнения листьев и плодов.

Объекты во многом похожи на факты – они так же имеют "имя шаблона" (имя класса) и слоты, и при этом полностью поддерживают парадигмы ООП – наследование, инкапсуляцию и полиморфизм. Объектно-ориентированный язык CLIPS (COOL) находится за рамками данной статьи и я предлагаю ознакомиться с ним отдельно.

Можно дать оценку CLIPS в двух словах: это интересно. С одной стороны, правила и факты образуют dataflow, что поднимает уровень абстракции и позволяет мыслить более декларативно, описывая только преобразования данных. CLIPS берет на себя управление порядком вычисления правил с помощью приоритетов, управляет зависимостями между фактами. С другой стороны, CLIPS очень легко встраивается в другие программы. В частности, можно посмотреть пример программы, интерфейс которой написан на PyQt4, а вся логика представлена в виде CLIPS-скрипта.