Иногда необходимо ограничить поле, основываясь на истинности некоторого логического выражения. CLIPS позволяет использовать предикатные ограничения. Предикатные ограничения позволяют вызывать предикатные функции (функции, которые возвращают значение false при не соответствии условиям и не-FALSE, если значение удовлетворяет условиям) в течение процесса сопоставления образцов. Если предикатная функция возвращает значение не-false, ограничение удовлетворяется. Если предикатная функция возвращает значение false, то ограничение не удовлетворяется. Предикатные ограничения записываются с помощью двоеточия и следующего за ним вызова соответствующей предикатной функции. Обычно предикатные ограничения используются совместно со связывающими ограничениями и при связывании переменных (т. е. если вы имеете переменную, которую нужно связать с некоторым полем и хотите одновременно ее протестировать, объедините ее с предикатным ограничением).
Предикатные ограничения имеют следующий синтаксис:
|
|
Определение 6.11. Синтаксис предикатного ограничения
:<вызов-функции>
Таким образом, определение понятия "элемент", приведенное в предыдущем разделе, можно расширить следующим образом:
Определение 6.12. Синтаксис понятия "элемент"
<элемент>::= <константа>│
<простая-переменная>|
<составная-переменная>|
:<вызов-функции>
CLIPS предоставляет несколько готовых предикатных функций (см. гл. 15). Кроме этого, пользователь также может создавать свои собственные предикатные функции.
Пример 6.20. Еще один вариант правила Find-data
(defrule Find-data
(data?x&: (floatp?x)&:{>?x 0) $?y?z&:(stringp?z))
=>
(printout t "x="?x " y="?y " z="?z crlf))
Выше приведен еще один вариант правила Find-data. В данном случае ищется факт неявно созданного шаблона data, первое поле которого — вещественное число больше нуля, а последнее — строка. В нашем списке фактов такому правилу удовлетворяет только факт с индексом 1 —
(data 1.0 blue "red").
Ограничения, возвращающие значения
В ограничениях возможно использование значений, возвращенных некоторыми функциями (в том числе и внешними). Вызов функции записывается с помощью знака = и указанной за ним функцией.