Пример 15.19. Использование функции bind в обработчиках сообщений
(defclass A (is-a USER) (role concrete) (slot x) (slot y)) (defmessage- handler A init after () (bind?self: x 3) (bind?self: y 4)) (make-instance a of A) (send [a] print)
Рис. 15.18. Использование функции bind в обработчиках сообщений Замечание Для наглядности при демонстрации работы данных примеров были включены режимы просмотра изменений глобальных переменных и слотов объектов. Функция if реализует стандартный оператор ветвления "если...то...иначе", применяемый практически во всех языках программирования. Эта функция позволяет задавать некоторое условие, в зависимости от выполнения (или невыполнения) которого будут выбраны те или иные действия. Определение 15.54. Функция if (if <выражение> then <действие>* [else <действие>*]) Если условие, заданное с помощью выражения, выполняется (т. е. не является ложным), выполняются действия, определенные в блоке then. В противном случае производятся действия из блока else. В каждом из таких блоков может быть задано любое количество действий. Любой блок может содержать вложенную конструкцию if...then...else. Блок else является необязательным. Значение, возвращаемое функцией if, равно значению последнего вычисленного выражения или выполненного действия. Ниже приведен пример использования функции if. Пример 15.20. Использование функции if (defrule closed-valves (temp high) (valve?v closed) (if (=?v 6) then (printout t "The special valve "?v " is closed!" crlf) (assert (perform special operation)) else (printout t "Valve "?v " is normally closed" crlf))) Замечание Обычно в подобных случаях предпочтительней использование двух правил, как показано в примере 15.21. Пример 15.21. Альтернатива использованию функции if в правилах
(defrule closed-valves-number-6 (temp high) (valve 6 closed) => (printout t "The special valve 6 is closed!" crlf) (assert (perform special operation))) (defrule closed-valves-other-than-6 (temp high) (valve?v&~6 closed) => (printout t "Valve "?v " is normally closed" crlf)) Функция while позволяет выполнять простой цикл с предусловием. Определение 15.55. Функция while (while <выражение> [do] <действие>*) Для задания условия в выражении цикла while могут быть использованы любые предикатные функции. В теле цикла может содержаться произвольное количество действий, включая вложенные циклы или функцию if. Проверка условия выполняется перед выполнением тела цикла. Цикл выполняется до тех пор, пока условие остается истинным. Определение цикла while может содержать необязательный символ do между условием и первым действием тела цикла. Для прерывания работы цикла могут быть использованы функции break и return, описанные ниже. Если для прерывания работы цикла не использовалась функция return, функция while возвращает значение false. Помимо функции while CLIPS предоставляет также функцию loop-for-count, которая реализует концепцию простого итеративного цикла, выполняющего определенные действия заданное число раз.
|