<ограничение>::=? │
$? │
<связанное-ограничение>
<связанное-ограничение>::= <простое-ограничение> │
<простое-ограничение>&<связанное-ограничение>|
<простое-ограничение>|<связанное-ограничение>|
<простое-ограничение>::= <элемент>| ~ <элемент>
<элемент>::= <константа>│
<простая-переменная>|
<составная-переменная>
Ограничение & обычно служит только для объединения с другими ограничениями или связывания переменных. Заметьте, что связывающие ограничения могут использовать связанные переменные и в то же время сами производить связывание переменной со значением некоторого поля. Если имя переменной встретилось в первый раз, то для ограничения будут использоваться остальные члены условного элемента, а переменная будет связана с соответствующим значением поля. Если переменная уже была связана, то ее значение работает как дополнительное ограничение для данного поля.
В качестве примера приведем улучшенный вариант правила Find-2-coevai-Person из предыдущего раздела.
Пример 6.19. Улучшенное правило Find-2-Coeval-Person
(defrule Find-2-Coeval-Person
(person (name?x) (age?z))
(person (name?y&~?x) (age &z))
=>
(printout t "name="?x " name="?y " age="?z crlf))
Ограничение?y&~?x запрещает выводить бессмысленные пары одинаковых имен (Bob-Bob). Однако данное правило все еще выводит эквивалентные по смыслу пары имен (например, Bob-Sue и Sue-Bob). Дальнейшее совершенствование правила продолжится в разд. 6.5.5.