Глобальные переменные
Конструктор defglobal предназначен для определения глобальных переменных. Доступ к такой переменной можно получить из любого места среды CLIPS, а значения, которые они содержат, не зависят ни от каких других конструкций языка. В отличие от этого, некоторые конструкторы (например, defruie или deffunction) позволяют создавать локальные переменные. Эти локальные переменные доступны только внутри тела соответствующего правила или функции. Глобальные переменные CLIPS подобны глобальным переменным, встречающимся в таких традиционных процедурных языках, как С или Ada. Однако, в отличие от них, глобальные переменные CLIPS являются слабо типизированными. Они способны хранить значение любого типа.
Правила
Одним из основных методов представления знаний в CLIPS являются правила. Правила используются для представления эвристик, определяющих ряд действий, которые необходимо выполнить в определенной ситуации. Разработчик экспертной системы определяет совокупность правил, которые используются совместно для решения проблемы. Правило состоит из двух частей: антицедента (условия), который является аналогом условия в if-then операторе и записывается слева, и консеквента (действия), который является аналогом then части этого оператора и записывается справа.
Левая часть правила представляет собой ряд условий (условных элементов), которые должны выполняться, чтобы правило было применимо. В CLIPS принято считать, что условие выполняется, если соответствующий ему факт присутствует в списке фактов. Одним из типов условных элементов может быть образец. Образцы состоят из набора ограничений, которые используются для описания того, какие факты удовлетворяют условию, определяемому образцом. Процесс сопоставления фактов и образцов выполняется блоком вывода CLIPS, который автоматически сопоставляет образцы, исходя из текущего состояния списка фактов, и определяет, какие из правил являются применимыми. Если все условия правила выполняются, то оно активируется и помещается в список активированных правил.
Если левая часть правила пуста, то для его активации необходимо наличие в списке фактов исходного факта (initial-fact). Такие безусловные правила часто используются для того, чтобы инициировать работу программы. Поэтому перед запуском таких программ необходимо произвести сброс состояния среды CLIPS.
Правая часть правила представляет собой совокупность действий, которые должны быть выполнены, если правило применимо. Действия, описанные в применимых правилах, выполняются тогда, когда блок вывода CLIPS получает команду начать выполнение применимых правил. Если существует множество применимых правил, то для того, чтобы выбрать правило, действия которого должны быть выполнены, блок вывода использует стратегию разрешения конфликтов. Действия, описанные в выбранном правиле, выполняются (при этом список применимых правил может измениться), а затем блок вывода выбирает другое правило и т.д. Этот процесс продолжается до тех пор, пока не остается ни одного применимого правила, т.е. пока список активированных правил не окажется пуст.
Во многом правила похожи на операторы типа if-then процедурных языков программирования. Однако условие if-then оператора в процедурном языке проверяется только тогда, когда программа передает ему управление. С правилами ситуация иная. Блок вывода постоянно отслеживает все правила, условия которых выполняются, и, таким образом, правило может быть выполнено в любой момент, как только оно становится применимым.
Для задания правил используется конструкция defrule со следующим синтаксисом:
(defrule <имя_правила> ["<комментарий>"] [<определение-свойства правила>]
< условие>
=>
<действие>)
где:
<имя_правила> – идентификатор символьного типа, уникальный для данной группы правил;
<комментарий> – необязательное поле комментария;
<определение-свойства правила > – может содержать объявление свойств правила, которое следует непосредственно после имени правила и комментариев;
< условие > – левая часть правила (антецедент) задается набором условных элементов, который обычно состоит из условий, примененных к некоторым образцам. Заданный набор образцов используется системой для сопоставления с имеющимися фактами и объектами. Все условия в левой части правила объединяются с помощью неявного логического оператора and;
<действие> – правая часть правила (консеквент) содержит список действий, выполняемых при активизации правила механизмом логического вывода.
Для разделения правой и левой части правил используется символ =>. Правило не имеет ограничений на количество условных элементов или действий. Если в левой части правила не указан ни один условный элемент, CLIPS автоматически подставляет условие-образец initial-fact или initial-object. Таким образом, правило активизируется всякий раз при появлении в базе знаний факта initial-fact или объекта initial-object. Если в правой части правила не определено ни одно действие, правило может быть активировано и выполнено, но при этом ничего не произойдет.
Пример задания правила:
(defrule R1
(days 2)
(works 100)
=>
(printout t crlf "Свободного времени нет" crlf)
(assert (freetime "no"))).
Данное правило содержит в левой части два условных элемента (упорядоченных факта), а в правой – команду printout вывода сообщения и команду assert добавления нового факта. В команде printout: t – параметр определяющий стандартный режим вывода на экран, crlf –символ возврата курсора и перевода его на новую строку.
При реализации прямого вывода в продукционных базах знаний машина логических выводов сопоставляет левые части (антецеденты) правил с базой данных и помещает правила, антецеденты которых удовлетворяются, в агенду (конфликтное множество). Агенда представляет собой список всех правил, условия которых удовлетворяются, но которые еще не были выполнены.
