Пример 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;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.