<ограничение> ::= ? │
$? │
<связанное-ограничение>
<связанное-ограничение> ::= <простое-ограничение> │
<простое-ограничение>&<связанное-ограничение>|
<простое-ограничение>|<связанное-ограничение>|
<простое-ограничение> ::= <элемент>| ~ <элемент>
<элемент> ::= <константа>│
<простая-переменная>|
<составная-переменная>
Ограничение & обычно служит только для объединения с другими ограничениями или связывания переменных. Заметьте, что связывающие ограничения могут использовать связанные переменные и в то же время сами производить связывание переменной со значением некоторого поля. Если имя переменной встретилось в первый раз, то для ограничения будут использоваться остальные члены условного элемента, а переменная будет связана с соответствующим значением поля. Если переменная уже была связана, то ее значение работает как дополнительное ограничение для данного поля.
В качестве примера приведем улучшенный вариант правила 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.