Реферат: Программирование на языке CLIPS
=>
(send [PPK] safety off)
)
Правило fire выполняет стрельбу.
(defrule fire
(object (name [PPK]) (safety off);
?T <- (range-test (fired no))
=>
(if (eq (send [PPK] fire) TRUE)
then (modify ?T (fired yes)))
)
Обратите внимание, что в данном правиле используется обработчик сообщения, которое возвращает значение. Анализируя его, можно выяснить, произведен ли выстрел, т.е. выполнена ли в действительности та операция, которая «закреплена» за этим сообщением. Если в патроннике был патрон и пистолет был снят с предохранителя, то обработчик сообщения вернет значение TRUE (после того, как выведет на экран BANG!). В противном случае он вернет FALSE (после того, как выведет на экран click).
(defmessage-handler pistol fire ()
(if (and
(eq (dynamic-get chamber) 1)
(eq (dynamic-get safety) off)
)
then (printout t crlf “BANG!” t crlf)
TRUE
else (printout t crlf “click” t crlf)
FALSE
)
)
Пусть вас не смущает, что в обработчике сообщения анализируется условие, которое уже было проанализировано правилом, отославшим сообщение (в данном случае речь идет об условии safety off). Дело в том, что одно и тоже сообщение может отсылаться разными правилами и нет никакой гарантии, что в каждом из них будет проверяться это условие.
После завершения стрельбы пистолет нужно вновь вернуть в положение «по-походному». Начинается это с того, что пистолет устанавливается на предохранитель, для чего используется ранее разработанный обработчик сообщения safety.
(defrule unready
(object (name [PPK]) (safety off))
(range-test (fired yes))
=>