Пример 11.24. Правила, использующие объекты
(defrule Create
?ins<-(object (is-a A | В))
=>
(printout t "Create " (instance-name ?ins) crlf) )
(defrule Foo-Access
?ins<-(object (is-a A │ B) (foo ?))
=>
(printout t "Foo-Access " (instance-name ?ins) crlf))
С помощью первого правила фактически будет получен список всех объектов классов а или B. Второе правило будет выводить имена объектов классов а или в, имеющих хоть какое-то значение слота foo (если этот слот может принимать участие в процессе сопоставления образцов). Создайте по одному экземпляру каждого класса и запустите программу. После этого измените значения слотов и попробуйте запустить программу еще раз. Вы должны получить результат, приведенный на рис. 11.9.
Обратите внимание, что только второе сообщение send вызовет изменение плана решения задачи (это хорошо видно с помощью окна Agenda Window).Это происходит потому, что слот foo класса а не является активным в процессе сопоставления образцов.
Рис. 11.9.Работа правил, использующих объекты
Грань видимости
Обработчики сообщений, присоединенные к некоторому классу, могут непосредственно оперировать со слотами, определенными в этом классе. Однако существует способ напрямую организовать манипуляцию со слотами для обработчиков, присоединенных к суперклассу или подклассу. Для этого предусмотрена грань visibility. Значение private указывает, что только обработчики сообщений определяемого класса могут иметь прямой доступ к слоту. Это значение задается по умолчанию. Объявление данной грани со значением public определяет, что обработчики сообщений подклассов, которые наследуют слот, а также суперклассы, тоже могут непосредственно обращаться к слоту.
Грань акцессоров
Акцессор слота — это особый обработчик сообщений, присоединенный к классу. Такой обработчик позволяет читать или изменять значение некоторого слота класса. Грань акцессора дает возможность управлять процессом автоматического создания подобных обработчиков. Эта грань уже использовалась в предыдущих примерах. Теперь рассмотрим ее более подробно.
В CLIPS 5.1 акцессор неявно создавался для всех слотов класса. Начиная с версии 6.0 ситуация иная. Пользователь должен самостоятельно определить необходимые ему акцессоры для чтения или записи некоторых слотов. Это удобно, потому что в большинстве случаев акцессоры не используются, т. к. все обработчики могут напрямую манипулировать со значениями слотов класса. Грань create-accessor сообщает CLIPS, что он должен автоматически создать явные обработчики сообщений для чтения и/или записи слота. По умолчанию акцессоры не создаются.
Созданные CLIPS акцессоры являются обычными обработчиками сообщений, ими можно манипулировать обычном образом. Однако, в отличие от обработчиков, созданных пользователем, они не имеют печатной формы (т. е. пользователь не может посмотреть код их реализации), и их нельзя удалить или изменить.
Если грань create-accessor получает значение read, то CLIPS автоматически создаст следующий обработчик:
Дата добавления: 2021-12-14; просмотров: 285;