(defrule example
(fact?y &:(>?у?*х*)) =>)
Изменение глобальной переменной не приводит к запуску процесса сопоставления образцов. Например, если в базу знаний системы был добавлен факт (fact 3) и переменной?*х* было присвоено значение 4, правило не будет активировано из-за того, что в системе отсутствует набор данных, удовлетворяющих правило. Если после этого переменной?*х* присвоить значение 2, несмотря на то, что текущий набор данных удовлетворяет всем условиям правила, оно все равно не будет активировано, т. к. изменение глобальной переменной не привело к запуску процесса сопоставления образцов.
Рассмотрим пример использования конструктора defglobal.
Пример 7.3. Использование конструктора defglobal
(defglobal
?*x*=3
?*y*=?*x*
?*z*=(+?*x*?*y*)
?*q*=(create$ a b c)
)
После выполнения данного конструктора в CLIPS появятся 4 глобальные переменные: х, у, z и q. Переменной х присваивается целое значение 3. Переменной у — значение, сохраненное в глобальной переменной х (т. е. 3). Переменной z — сумма значений х и у (т. е. 6). Переменной q присваивается значение, равное составному полю, содержащему 3 значения типа symbol (а, b и с), созданному с помощью функции create$. В случае если в конструкторе defglobal не было допущено синтаксических ошибок, то defglobal не возвращает никаких значений. Если ошибки имели место, то пользователь получит соответствующее сообщение. Обратите внимание, что переменная у не является указателем на переменную х, просто их значения в данный момент совпадают. Если изменить значение х, значения переменных у и z, несмотря ни на что, останутся равными 3 и б соответственно.
|
|
Чтобы увидеть результат работы конструктора defglobal, можно воспользоваться командой list- defglobals, для вывода на экран списка всех глобальных переменных. Добавьте еще один конструктор defglobal, объявляющий переменные вещественного и текстового типа, а также переменную со значением типа symbol.