ВУЗ:
Составители:
Рубрика:
Факты – одна из основных форм представления данных в CLIPS (существует также возможность представления данных
в виде объектов и глобальных переменных, но об этом речь пойдет позже). Каждый факт представляет собой определенный
набор данных, сохраняемый в текущем списке фактов – рабочей памяти системы. Список фактов представляет собой уни-
версальное хранилище фактов и является частью базы знаний. Объем списка фактов ограничен только памятью вашего ком-
пьютера. Список фактов хранится в оперативной памяти компьютера, но CLIPS предоставляет возможность сохранять теку-
щий список в файл и загружать список из ранее сохраненного файла.
В системе CLIPS фактом является список неделимых (или атомарных) значений примитивных типов данных. CLIPS
поддерживает два типа фактов – упорядоченные факты (ordered facts) и неупорядоченные факты или шаблоны (non-ordered
facts или template facts). Ссылаться на данные, содержащиеся в факте, можно либо используя строго заданную позицию зна-
чения в списке данных для упорядоченных фактов, либо указывая имя значения для шаблонов. Упорядоченные факты состо-
ят из поля, обязательно являющегося данным типа symbol и следующей за ним, возможно пустой, последовательности по-
лей, разделенных пробелами. Ограничением факта служат круглые скобки:
(поле_типа_symbol [поле]*)
Так как упорядоченный факт для представления информации использует строго заданные позиции данных, то для дос-
тупа к ней пользователь должен знать, не только какие данные сохранены в факте, но и какое поле содержит эти данные.
Неупорядоченные факты (или шаблоны) предоставляют пользователю возможность задавать абстрактную структуру факта
путем назначения имени каждому полю. Для создания шаблонов, которые впоследствии будут применяться для доступа к
полям факта по имени, используется конструктор deftemplate. Конструктор deftemplate аналогичен определениям записей
или структур в таких языках программирования, как Pascal или С.
Конструктор deftemplate задает имя шаблона и определяет последовательность из нуля или более полей неупорядочен-
ного факта, называемых также слотами. Слот состоит из имени, заданного значением типа symbol, и следующего за ним,
возможно пустого, списка полей. Как и факт, слот с обеих сторон ограничивается круглыми скобками. В отличие от упоря-
доченных фактов слот неупорядоченного факта может жестко определять тип своих значений. Кроме того, слоту могут быть
заданы значения по умолчанию. Синтаксис данного конструктора следующий:
(deftemplate <имя-шаблона> [<комментарии>] [<оперделение-слота>*])
Помимо фактов, CLIPS предоставляет еще один способ представления данных – глобальные переменные (globals). В
отличие от переменных, связанных со своим значением в левой части правила, глобальная переменная доступна везде после
своего создания (а не только в правиле, в котором она получила свое значение). Глобальные переменные CLIPS подобны
глобальным переменным в процедурных языках программирования, таких как С или ADA. Однако, в отличие от переменных
большинства процедурных языков программирования, глобальные переменные в CLIPS слабо типизированы. Фактически
переменная может принимать значение любого примитивного типа CLIPS при каждом новом присваивании значения.
С помощью конструктора defglobal в среде CLIPS могут быть объявлены глобальные переменные и присвоены их на-
чальные значения.
(defglobal [<имя-модуля>] <определение-переменной>*)
<определение-переменной> ::= <имя-переменной> = <выражение>
<имя-переменной> ::= ?*<эначение-типа-symbol>*
CLIPS позволяет использовать произвольное количество конструкторов defglobal. Необязательный параметр <имя-
модуля> указывает модуль, в котором должны быть определены конструируемые переменные. Если имя модуля не задано,
то переменные будут помещены в текущий модуль.
Глобальные переменные применяются в любом месте, где могут быть использованы переменные, созданные в левой
части правил с некоторыми исключениями. Во-первых, глобальные переменные не могут использоваться как параметры в
конструкторах deffunction, defmethod или обработчиках сообщений. Во-вторых, глобальные переменные не могут использо-
ваться для получения новых значений в левой части правил.
Неверно: (defrule example (fact ?*x*) =>).
Верно: (defrule example (fact ?y & :(> ?y ?*x*)) =>)
Пример 1.
(defglobal
?*x* = 3
?*y* = ?*x*
?*z* = (+ ?*x* ?*y*)
?*q* = (create$ a b c))
После выполнения данного конструктора в CLIPS появятся 4 глобальные переменные: х, у, z и q. Переменной х при-
сваивается целое значение 3. Переменной у – значение, сохраненное в глобальной переменной х (т.е. 3). Переменной z –
сумма значений х и у (т.е. 6).
Обратите внимание, что переменная у не является указателем на переменную x, просто их значения в данный момент
совпадают. Если изменить значение х, значения переменных у и z, несмотря ни на что, останутся равными 3 и 6 соответст-
венно.
Добавьте еще один конструктор defglobal, объявляющий переменные вещественного и текстового типа, а также пере-
менную со значением типа symbol.
(defglobal
?*d* = 7.8
?*e* = "string"
Страницы
- « первая
- ‹ предыдущая
- …
- 3
- 4
- 5
- 6
- 7
- …
- следующая ›
- последняя »