Found data (data? blue red (6.9))
Found data (data? blue RED ())
Found data (data? blue red ()}
Found data (data? blue red ()}
Образцу, заданному в правиле, удовлетворяют четыре факта с индексами 1, 3, 4, 5. В результате активации правило выводит на экран свойства фактов, активировавших правило. Значение переменной, содержащей значение из составного поля, выводится в скобках. Кроме первого случая (факта с индексом 5), переменная содержит пустое значение. Переменную составного поля не обязательно использовать в качестве последнего ограничения. Рассмотрим следующее правило:
Пример 6.16. Модифицированное правило Find-data
(defrule Find-data
(data?x $?y?z) =>
(printout t "x="?x " y="?y " z="?z crlf))
Заданному образцу удовлетворяют все факты data, но обратите внимание, каким образом связываются значения с переменной у в разных случаях:
Пример 6.17. Результат работы модифицированного правила Find-data
х=1.0 y=(blue) z=red
х=1 у=() z=blue
х=1 y=(blue) z=red
х=1 y=(blue) z=RED
х=1 y=(blue red) z=6.9
После того как произошло связывание переменной со значением, все ссылки на эту переменную возвращают значение, с которым переменная была связана. Это действительно как для переменных, связанных с составными полями, так и для переменных, связанных с простыми полями. Кроме того, допустимы ссылки между образцами в одном правиле.
|
|
Пример 6.18. Правило Find-2-Coeval-Person
(defrule Find-2-Coeval-Person
(person (name?x) (age?z))
(person (name?y) (age &z))
=>
(printout t "name="?x " name="?y " age="?z crlf))
Приведенное выше правило Find-2-Coevai-person выведет на экран всевозможные пары имен людей (все перестановки) одинакового возраста. Как научить это правило не выводить эквивалентные по смыслу или бессмысленные пары одинаковых имен (Bob-Bob), мы увидим в следующих разделах.