Иллюстрированный самоучитель по введению в экспертные системы

Объектно-ориентированные средства в CLIPS

Использование объектно-ориентированных средств в CLIPS позволяет значительно упростить программирование правил, поскольку для обновления данных можно применять механизм передачи и обработки сообщений методами классов. В этом разделе мы продемонстрируем, как это делается на примере, который моделирует правила обращения с полуавтоматическим пистолетом.

Первым делом определим класс pistol, в котором будут перечислены свойства, необходимые для моделирования.

(defclass pistol
(is-a USER)
(role concrete)
(pattern-match reactive)
(slot safety (type SYMBOL) (create-accessor read-write))
(slot slide (type SYMBOL) (create-accessor read-write))
(slot hammer (type SYMBOL) (create-accessor read-write))
(slot chamber (type INTEGER) (create-accessor read-write))
(slot magazine (type SYMBOL) (create-accessor read-write))
(slot rounds (type INTEGER) (create-accessor read-write)))

Первые три слота – системные. Они нужны объектно-ориентированной надстройке CLIPS (COOLCLIPS object-oriented language). Эти слоты COOL извещают о том, что:

  • pistol – это пользовательский класс;
  • pistol является конкретным классом, т.е. возможно создание экземпляров этого класса (альтернативный тип – абстрактный класс, который играет ту же роль, что и виртуальный класс в C++);
  • экземпляры класса pistol могут быть использованы в качестве объектов данных, которые можно сопоставлять с условиями в правилах и использовать в действиях, определенных правилами.

Следующие пять слотов представляют свойства и члены данных класса:

  • слот safety (предохранитель) может содержать символ on или off;
  • слот slide (затвор) может содержать значение forward или back, т.е. хранит информацию о положении затвора;
  • слот hammer (курок) содержит информацию о состоянии курка, back или down;
  • слот chamber (патронник) содержит значение 1 или 0, в зависимости от того, есть ли патрон в патроннике;
  • слот magazine (обойма) может содержать значение in или out, в зависимости от того, вставлена ли обойма;
  • слот rounds (патроны) содержит текущее количество патронов в обойме.

Для того чтобы иметь возможность записывать в слот новое значение или считывать текущее, нужно разрешить формирование соответствующих функций доступа через фацет create-accessor. Теперь сформируем экземпляр класса pistol с помощью следующего выражения:

(definstances pistols (РРК of pistol (safety on)
(slide forward) (hammer down) (chamber 0) (magazine out) (rounds 6)

Этот экземпляр, РРК, правильно уложен – обойма вынута из рукоятки, пистолет установлен на предохранитель, затвор в переднем положении, курок опущен, а патронник пуст. В обойме имеется 6 патронов.

Теперь, имея в программе определение класса и сформировав экземпляр класса, разработаем правила и обработчики сообщений, с помощью которых можно описать отдельные операции обращения с пистолетом и стрельбы из него. Для этого сначала разработаем шаблон задачи. Желательно отслеживать две вещи:

  • есть ли патрон в патроннике;
  • произведен ли выстрел.

Для этого можно использовать следующий шаблон:

(deftemplate range-test
(field check (type SYMBOL) (default no))
(field fired (type SYMBOL) (default no)))

Первое правило будет устанавливать в рабочую память программы задачу range-test.

(defrule start
(initial-fact) ›
(assert (range-test)))

При активизации этого правила в рабочую память будет добавлено:

(range-test (check no) (fired no))
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.