<образец объекта>::= (object <атрибуты-ограничения>)
<атрибуты-ограничения>::= (is-a <ограничение>)|
(name <ограничение>)|
(slot <ограничение>)
Ограничение is-a (является) используется для определения ограничений класса, таких как "Является ли этот объект экземпляром заданного класса?". Ограничение is-a также определяет, является ли объект экземпляром класса, который является наследником класса, заданного в ограничении, в случае если это не будет явно запрещено образцом.
Ограничение name используется для определения конкретного объекта с заданным именем. Имя, задаваемое в данном ограничении, должно быть значением типа instance-name, а не значением типа symbol, как обычно. Ограничения для составных полей (такие как $?) не могут использоваться с ограничениями is-a и name. Эти ограничения применяются в работе со слотами объектов так же, как и при работе со слотами шаблонов. Как и в случае образцов для шаблонов, имена слотов для образца объекта должны быть значениями типа symbol.
|
|
Приведем несколько примеров использования образцов объектов.
Пример 6.22. Использование образцов объектов
(defrule example-1
(object (is-a MyObjl | MyObj2))
=>)
(defrule example-2
(object (is-a?x))
(object (is-a ~?x) }
=>)
(defrule example-3
(object (width?x&:(>?x 20)))
=>)
(defrule example-4
(object (width?x) (height?x))
=>)
Первое правило удовлетворяет любой объект класса MyObj1 или MyObj2. Второе правило активируется любой парой объектов, принадлежащей разным классам. Третье правило выполняется в случае, если будет найден объект активного класса, содержащий активный слот width, значение которого больше 20. Последний приведенный пример удовлетворяется любым объектом активного класса, содержащим активные слоты width и height, значения которых должны быть равны.
Адрес образца
Некоторые действия в правой части правил, такие как retract и unmake-instance, оперируют с фактами или объектами, участвующими в левой части. Для того чтобы определить, какой факт или объект будет изменяться, необходимо присвоить переменной адрес конкретного факта или объекта. Присваивание адресов происходит в левой части правила и полученное значение называется адресом образца (pattern-address).