Функция сравнения также использует знак =. Разница между ними может быть определена по контексту.
Возвращаемое значение должно быть одним из простых типов данных CLIPS. Это значение, возвращенное функцией, объединяется с образцом так, как если бы оно было символьным ограничением. Заметьте, что функция вычисляется при каждом сопоставлении образцов, а не один раз при определении правила.
Ограничения, возвращающие значения, имеют следующий синтаксис:
Определение 6.13. Синтаксис ограничения, возвращающего значение
=<вызов-функции>
Определения понятия "элемент", приведенные в предыдущем разделе, примут такой вид:
Определение 6.14. Синтаксис понятия "элемент"
<элемент>::= <константа>│
<простая-переменная>|
<составная-переменная>|
:<вызов-функции>
=<вызов-функции>
Правило из примера 6.21 выводит на экран такие факты data, в которых значение второго поля в два раза больше, чем значение первого. В нашем случае это факты (data 1 2) И (data 2 4).
|
|
Пример 6.21. Использование ограничения, возвращающего значение
(assert (data I 2)
(data 2 3)
(data 24))
(defrule Find-data
(data?x?y&=(* 2?x))
=>
(printout t "x="?x " y="?y crlf))
Сопоставление образцов с объектами
Во всех приведенных выше примерах образцы сопоставлялись с фактами из списка фактов. Кроме этого, образцы можно сопоставлять с экземплярами объектов — экземпляров, определенных пользователем классов на языке COOL (см. гл. 11). Такие образцы называются образцами объектов. Образцы могут сопоставляться с объектами, спецификация которых определена до создания образца и которые находятся в границах видимости текущего модуля. Любой класс, который имеет объекты, соответствующие образцу, не может быть удален или изменен, пока не будет удален образец. Даже если правило удалено с помощью действий, выполняемых в собственной правой части, класс, связанный с образцом, не может быть изменен до тех пор, пока правая часть правила не закончит работу.
При создании или удалении объекта все образцы, подходящие этому объекту, обновляются. Однако в случае изменения слота объекта обновляются только те образцы, которые явно сопоставляются по этому слоту. Таким образцом можно использовать логические зависимости для обработки изменений некоторых слотов.
Изменение неактивных слотов или объектов неактивных классов не оказывает никакого воздействия на правила.