Пример 6.7. Правила с символьными ограничениями
(defrule Find-data (data 1 blue red) => (printout t crlf "Found data (data 1 blue red)" crlf)) (defrule Find-Bob-20 (person (name Bob) (age 20)) => (printout t crlf "Found Bob-20 (person (name Bob) (age 20))" crlf)) (defrule Find-Bob-30 (person (name Bob) (age 30)) => (printout t crlf "Found Bob-30 (person (name Bob) (age 30))" crlf)) Выполните команды reset и run. Вы должны получить результат, приведенный на рис. 6.5. Рис. 6.5. Выполнение правил с символьными ограничениями Как мы видим, были активированы и выполнены два правила: Find-data и Find-Bob-20. Это произошло потому, что образцы, заданные в левой части этих правил, нашли в списке фактов данные, полностью соответствующие заданным символьным ограничениям. Групповые символы для простых и составных полей В CLIPS имеется два различных групповых символа, которые используются для сопоставления полей в образцах. CLIPS интерпретирует эти групповые символы как место для подстановки некоторых частей данных, удовлетворяющих образцам. Групповой символ для простого поля записывается с помощью знака?, который соответствует одному любому значению, сохраненному в заданном поле. Групповой символ составного поля записывается с помощью знака $? и соответствует, возможно, пустой последовательности полей, сохраненной в составном поле. Групповые символы для простых и составных полей могут комбинироваться в любой последовательности. Нельзя использовать групповой символ составного поля для простых полей. По умолчанию не заданный в образце простой слот шаблона или объекта сопоставляется с неявно заданным групповым символом для простого поля. Аналогично не заданный в образце составной слот сопоставляется с неявно заданным групповым символом для составного поля. Условный элемент, представляющий собой образец для неупорядоченного факта, в котором присутствуют только символьные ограничения и групповые символы, будет иметь следующий вид: Определение 6.6. Синтаксис ограничений для неупорядоченного факта
(<ограничение-1>... <ограничение-n>) <ограничение>::= <символьное-ограничение >│?│$? Соответственно для шаблона образец примет вид: Определение 6.7. Синтаксис ограничений для шаблона
(<имя-шаблона > (<имя-слота-1> <ограничение-1>) … (<имя-слота-n> <ограничение-n>)) В качестве примера можно привести следующее правило: Пример 6.8. Правило Find-data
(defrule Find-data (data? blue red $?) =>)
В нашем списке фактов присутствуют два факта, подходящие заданному шаблону и способные активировать данное правило:
Пример 6.9. Факты, активирующие правило Find-data
(data 1 blue red) (data 1 blue red 6.9))
Рассмотрим еще одно правило: Пример 6.10. Правило match-all-persons
(defrule match-all-persons (person) =>) Поскольку person является шаблоном, а в образце данного правила не определен ни один слот шаблона, CLIPS автоматически поставит в соответствие каждому простому слоту групповой символ для простого поля, а составному слоту — символ для составного. Таким образом, правило преобразуется в следующее:
|