Основы программирования в системе CLIPS.
CLIPS (C Language Integrated Production System) начала разрабатываться в космическом центре Джонсона NASA в 1984 году. Сейчас CLIPS и документация на этот инструмент свободно распространяется через интернет (http://www.ghg.net/clips/CLIPS.html). Язык CLIPS свободен от недостатков предыдущих инструментальных средств для создания ЭС, основанных на языке LISP. Язык CLIPS получил большое распространение в государственных организациях и учебных заведениях благодаря низкой стоимости, мощности, эффективности и переносимости с платформы на платформу. Например, даже Web-ориентированный инструментарий JESS (Java Expert System Shell), использующий язык представления знаний CLIPS, приобрел достаточную известность в настоящее время.
Следует отметить, что несмотря на многочисленные преимущества функционального программирования, некоторые задачи лучше решать в терминах объектно-ориентированного программирования (ООП), для которого характерны три основные возможности: ИНКАПСУЛЯЦИЯ (работа с классами), ПОЛИМОРФИЗМ (работа с родовыми функциями, поддерживающими различное поведение функции в зависимости от типа аргументов), НАСЛЕДОВАНИЕ (поддержка абстрактных классов). ООП поддерживает многие языки, в том числе Smalltalk, C++, Java, Common LISP Object System (CLOS). Язык CLIPS, в свою очередь, вобрал в себя основные преимущества С++ и CLOS.
Читатель может познакомиться с языком CLIPS, получив через Интернет полный комплект документации на английском языке, или прочитав изданную на русском языке книгу. В данном разделе лекции дается краткое неформальное введение в CLIPS, необходимое для программирования учебных задач.
Отличительной особенностью CLIPS являются конструкторы для создания баз знаний (БЗ):
defrule | определение правил; |
deffacts | определение фактов; |
deftemplate | определение шаблона факта; |
defglobal | определение глобальных переменных; |
deffunction | определение функций; |
defmodule | определение модулей (совокупности правил); |
defclass | определение классов; |
defintances | определение объектов по шаблону, заданному defclass; |
defmessagehandler | определение сообщений для объектов; |
defgeneric | создание заголовка родовой функции; |
defmethod | определение метода родовой функции. |
Конструкторы не возвращают никаких значений, в отличии от функций, например:
(deftemplate person (slot name) (slot age) (multislot friends)) (deffacts people (person (name Joe) (age 20)) (person (name Bob) (age 20)) (person (name Joe) (age 34)) (person (name Sue) (age 34)) (person (name Sue) (age 20)))
Пример функции:
(deffunction factorial (?a) (if (or (not (integerp ? a)) (< ? a0)) then (printout t "Factorial Error!" crlf) else (if (= ? a0) then 1 else (*? a (factorial ($-$ ? a1))))))
Правила в CLIPS состоят из предпосылок и следствия. Предпосылки также называют ЕСЛИ-частью правила, левой частью правила или LHS правила (left-hand side of rule). Следствие называют ТО-частью правила, правой частью правила или RHS правила (right-hand side of rule).
Пример правила представлен ниже:
(deftemplate data (slot x) (slot y)) (defrule twice (data (x ? x) (y =(*2 ? x))) ) (assert (data (x2) (y4)); f-0 (data (x3) (y9))); f-1
Здесь самая распространенная в CLIPS функция assert добавляет новые факты в список правил. В противоположность assert функция retract удаляет факты из списка фактов, например:
(defrule vis11 ?doors < — (fit ? wdfit) (test (eq ? wdfit no))
(assert (EVIDENCE OF MAJOR ACCIDENT)) (retract ? doors))
В этом правиле проверяется наличие факта doors и в случае его отсутствия факт doors удаляется из списка фактов задачи.
Функция modify является также весьма распространенной. Она позволяет в определенном факте поменять значение слота, например,
(deftemplate age (slot value)) (assert (age (value young))) (modify 0 (value old))
Следующий пример описывает представление данных в виде фактов, объектов и глобальных переменных. Примеры фактов:
(voltage is 220 volt) (meeting (subject "AI") (chief "Kuzin") (Room "3240"))
В первой строке приведен упорядоченный факт, во второй - неупорядоченный, в котором порядок слотов не важен.
CLIPS поддерживает следующие типы данных: integer, float, string, symbol, external-address, fact-address, instance-name, instance-address.
594 | 23 | +51 | ?17 |
594e2 | 23.45 | +51.0 | ?17.5e?5 |
Пример string: "expert", "Phil Blake", "состояние $-0$", "quote=\"
CLIPS поддерживает следующие процедурные функции , реализующие возможности ветвления, организации циклов в программах и т.,п.:
If | оператор ветвления; |
While | цикл с предусловием; |
loop-for-count | итеративный цикл; |
prong | объединение действий в одной логической команде; |
prong$ | выполнение набора действий над каждым элементом поля; |
return | прерывание функции, цикла, правила и т.д.; |
break | то же, что и return, но без возвращения параметров; |
switch | оператор множественного ветвления; |
bind | создание и связывание переменных. |