- •Глава 6 представление знаний
- •6.1. Представление знаний при помощи пролога
- •Исчисление предикатов
- •Вычислительные формализмы
- •Пролог как вычислительный формализм
- •Формальный смысл
- •Внешний смысл
- •Обманчивая природа внешнего смысла
- •Представление знаний при помощи языка Си
- •Расширение языка Пролог
- •Другие вычислительные формализмы
- •6.2. Семантические сети Узлы и дуги
- •Семантическая сеть как Пролог-программа
- •6.3. Фреймы Представление знаний о ситуациях
- •Наследование значений слотов
- •Оценка формализма фреймов
- •Реализация фрейм - программы на Прологе
- •Запрет наследования
- •6.4. Объектно-ориентированное программирование Объекты и сообщения
- •Наследование
- •Объектно-ориентированное программирование в терминах абстрактных типов данных
- •Объектно-ориентированное программирование в терминах формализма фреймов
- •6.5. Механизм наследования в прологе Наследование в других формализмах
- •Наследование в Прологе
- •Состояния знаний
- •Обзор механизма наследования
- •Создание дерева состояний
- •Процедура "послать"
- •Опровержение фразы
- •Концепции механизма наследования
- •Пример с собранием
- •Пример с птицами
- •Реализация процедуры "послать"
- •Алгоритм работы процедуры "послать"
- •6.6. Программа, выполняющая запросы к базе данных
- •Состояния как виртуальные базы данных
- •Использование процедуры "з"
- •Опрос базы данных (добавление нового состояния)
- •Процедура "отобразитьсостояния"
- •Полезные свойства программы, выполняющей запросы к базе данных
- •Реализация программы, выполняющей запросы
- •Процедура "отобразить"
- •Процедура "з"
- •Процедура "характер"
- •6.7. Описание изменений базы данных
- •Мир кубиков
- •Картина состояния
- •Внесение изменений в базу данных при помощи процедуры "поместить"
- •Реализация процедуры "поместить"
- •Оценка механизма наследования
- •Процедура "послать" как предикат метаязыка
- •Библиографические заметки
- •Упражнения
Запрет наследования
Проблема решается при помощи приводимой ниже программы, Предикат "сократить" в первом правиле "собрание_38" гарантирует то, что если у фрейма "собрание_38" будет иметься локальное значение слота, то этот фрейм не сможет унаследовать другое значение того же самого слота oт фрейма "собрание'".
разновидность (собрание, мере приятие).
разновидность (с_38, собрание).
% значения слотов фрейма "собрание":
собрание (время,'Среда 14.00').
собрание (место, 'Зал заседаний').
% локальное правило
собрание_38 (Атрибут, Значение) :
с_38 (Атрибут, Значение),!.
% правило наследования
собрание_38 (Атрибут, Значение) ,-
разновидность (с_38, Фрейм),
Подцель = . . [Фрейм, Атрибут, Значение],
Подцель.
% значения слотов, локальные по отношению к фрейму
% "собрание_38"
с_ 38 (присутствуют, [рональд, синди, фред]) .
с_38 (время. 'Четверг 9.00').
Все атрибуты, являющиеся локальными для фрейма "собрание_38", теперь хранятся в базе данных "с_38". Первое правило "собрание_38" проверяет, имеется ли в базе данных "с_38" фраза с требуемым атрибутом. Если имеется, то возвращается нужное значение, а предикат "сократить" предотвращает дальнейшую выдачу ответов. Если такой фразы нет в базе данных "с_38", то второе правило "собрание_38" ищет требуемый атрибут в базе данных "собрание". Теперь запрос о времени проведения собрания выдает единственный ответ:
| ?- собрание_38 (время, X).
Х = 'Четверг 9.00'; % по "с_38"
нет
| ?- собрание-38 (место, X).
Х = 'Зал заседании' ; % по "собрание_38"
нет
6.4. Объектно-ориентированное программирование Объекты и сообщения
В языке объектно-ориентированного программирования, таком как Смолток-80, фундаментальной вычислительной сущностью является объект. Единственный способ выполнить вычисление заключается в том, чтобы послать объекту сообщение. Объекты организуются в классы,. Объект является конкретным экземпляром, принадлежащим к классу, В определении класса задается структура его объектов. Типичная программа организована в виде иерархии классов. Класс аналогичен структуре данных процедурного языка, а объект — конкретному экземпляру структуры данных (т.е. переменной).
Определение класса
В определение класса могут входить четыре вида компонент:
1) сообщения (команды для вычислений), воспринимаемые всеми конкретными экземплярами, принадлежащими к классу;
2) методы (присоединенные процедуры), общие для всех объектов определяемого класса;
3) переменные классов, значения которых являются общими для всех объектов заданного класса, и
4) переменные конкретных экземпляров (аналоги "слотов" в формализме фреймов), значения которых уникальны для каждого конкретного объекта.
Наследование
Множество сообщений, воспринимаемых объектом, определяет его интерфейс (т.е. вое возможные способы обращения к этому объекту). Для каждого сообщения имеется соответствующий метод (т.е. процедура), выполняющий вычисления, необходимые для ответа на сообщение. Сообщения и методы, используемые для выработки ответов на них, наследуются от класса к классу следующим образом. Если посылается сообщение конкретному экземпляру, принадлежащему к некоторому классу и оно не определено для этого класса, то сообщение передается суперклассу данного класса (т.е. классу, находящемуся в иерархии над данным). Тем самым класс наследует все сообщения, определенные в его суперклассе или выше. Если унаследованное сообщение переопределяется в классе, то локальное определение перекрывает унаследованное для этого класса определение.
На рис. 6.4 показана иерархия классов программы, несущей информацию о видах птиц.
Если объекту "ральф" посылается сообщение, в котором спрашивается о способе передвижения, то это сообщение обрабатывается мето-
дом класса ПИНГВИНЫ и выдается ответ «хождение вразвалочку». Но если послать то же самое сообщение объекту "твити", то мы увидим, что в классе КАНАРЕЙКИ отсутствует обработка этого сообщения. Поэтому данное сообщение пересыпается в класс ПТИЦЫ, являющийся суперклассом класса КАНАРЕЙКИ. Сообщение обрабатывается методом класса ПТИЦЫ и выдается ответ «полет».
Формализм объектно-ориентированного программирования можно одновременно трактовать и как обобщение понятия абстрактных типов данных, и как уточнение формализма фреймов. Стоит подробно рассмотреть обе точки зрения.