Если правило не содержит условных элементов в своей левой части, то к предпосылкам правила автоматически добавляется образец initial-fact (конфигурацию CLIPS можно настроить таким образом, чтобы вместо образца факта добавлялся образец объекта initial-object). Например, следующее правило из примера 6.46 будет преобразовано так, как показано в примере 6.47:
Пример 6.46. Правило без условий
(defrule example
=>)
Пример 6.47. Преобразованное правило без условий
(defrule example
(initial-fact)
=>)
Использование элементов test» not перед and
Условные элементы test и not, стоящие перед and, добавляют образец initial-fact или initial-object непосредственно перед собой. Образец initial-fact добавляется, если в первом условном элементе используется образец факта. Образец initial-object добавляется, если в первом условном элементе используется образец объекта. Если в первом условном элементе нет образцов, то тип добавляемого образца определяется по следующему условному элементу таким же методом. Если во всем текущем условном выражении нет образцов, то система использует предопределенный факт initial-fact (хотя конфигурацию CLIPS можно настроить таким образом, чтобы вместо образца initial-fact добавлялся образец initial-object). Например, следующие правила из примера 6.48 будут изменены так, как в примере 6.49.
|
|
Пример 6.48. Правила с условиями test и not перед and
(defrule example1
(test (> 80 (startup-value)))
=>
(defrule example2
(test (> 80 (startup-value)))
(object (is-a MACHINE))
=>)
(defrule example3
(machine?x)
(not (and (not (part?x?y))
(inventoried?x)))
=>
Пример 6.49. Преобразованные правила с условиями test и not перед and
(defrule example1
(initial-fact)
(test (> 80 (startup-value)))
=>)
(defrule example2
(object (is-a INITIAL-OBJECT) (name [initial-object]))
(test (> 80 (startup-value)))
(object (is-a MACHINE))
=>)
(defrule example3
(machine?x)
(not (and (initial-fact)
(not (part?x?y))
(inventoried?x)))
=>)
Использование элемента not перед test
Если сразу перед условным элементом test использовался условный элемент not, то CLIPS автоматически перемещает условный элемент not на место первого условия непосредственно следующего за test. Например, правило из примера 6.50 изменится на эквивалентное (пример 6.51):
Пример 6.50. Правило с условиями not перед элементом test
(defrule example
(а?х)
(not (b?x))
(test (>?х 5)}
=>)