(defrule system-fault-1
(error-status unknown)
(pump off)
=>
(printout t "The system has a fault." crlf))
(defrule system-fault-2
(error-status unknown) (valve broken)
=>
(printout t "The system has a fault." crlf))
(defrule system-fault-3
(error-status unknown) (temp high)
=>
(printout t "The system has a fault." crlf))
6.5.4. Условный элемент and
Все условные элементы в левой части правил CLIPS объединены неявным условным элементом and. Это означает, что все условные элементы, заданные в левой части, должны удовлетвориться, для того чтобы правило было активировано. С помощью явного применения условного элемента and можно смешивать различные условия and и or и группировать элементы так, как этого требует логика правил. Условие and удовлетворяется, только если все условия внутри явного and удовлетворены. В случае, если остальные условия в левой части правила также истинны, правило будет активировано. Элемент and может объединять любое число условных элементов.
Определение 6.19. Синтаксис условного элемента and
<ycлoвный-элeмeнт-and>::= (and <условный-элемент>+)
Пример 6.27. Применение условного элемента and
|
|
(defrule system-flow
(error-status confirmed)
(or (and (temp high)
(valve closed))
(and (temp low)
(valve open)))
=>
(printout t "The system is having a flow problem. " crlf))
Если условный элемент and содержит условные элементы test или not в качестве первого элемента, то перед ними автоматически добавляется образец initial-fact или initial-object. Помните, что левая часть любого правила содержит неявный элемент and, поэтому приведенное в примере 6.28 правило будет автоматически преобразовано (см. пример 6.29).
Пример 6.28. Правило nothing-to-schedule
(defrule nothing-to-schedule
(not (schedule?))
=>
(printout t "Nothing to schedule." crlf))
Пример 6.29. Преобразованное правило nothing-to-schedule
(defrule nothing-to-schedule
(and (initial-fact)
(not (schedule?)))
=>
(printout t "Nothing to schedule." crlf))
6.5.5. Условный элемент not
Иногда важнее отсутствие информации, а не ее присутствие, т. е. возникают ситуации, когда необходимо запустить правило, если образец или другой условный элемент не удовлетворяется (например, факт не существует). Условный элемент not предоставляет эту возможность. Элемент not удовлетворяется, только если условный элемент, который он содержит, не удовлетворяется.