ВУЗ:
Составители:
Рубрика:
Факты – одна из основных форм представления данных в 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
 - …
 - следующая ›
 - последняя »
 
