Предикатные ограничения

Иногда необходимо ограничить поле, основываясь на истинности некоторо­го логического выражения. 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").

Ограничения, возвращающие значения

В ограничениях возможно использование значений, возвращенных некото­рыми функциями (в том числе и внешними). Вызов функции записывается с помощью знака = и указанной за ним функцией.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: