- •Глава 6 представление знаний
- •6.1. Представление знаний при помощи пролога
- •Исчисление предикатов
- •Вычислительные формализмы
- •Пролог как вычислительный формализм
- •Формальный смысл
- •Внешний смысл
- •Обманчивая природа внешнего смысла
- •Представление знаний при помощи языка Си
- •Расширение языка Пролог
- •Другие вычислительные формализмы
- •6.2. Семантические сети Узлы и дуги
- •Семантическая сеть как Пролог-программа
- •6.3. Фреймы Представление знаний о ситуациях
- •Наследование значений слотов
- •Оценка формализма фреймов
- •Реализация фрейм - программы на Прологе
- •Запрет наследования
- •6.4. Объектно-ориентированное программирование Объекты и сообщения
- •Наследование
- •Объектно-ориентированное программирование в терминах абстрактных типов данных
- •Объектно-ориентированное программирование в терминах формализма фреймов
- •6.5. Механизм наследования в прологе Наследование в других формализмах
- •Наследование в Прологе
- •Состояния знаний
- •Обзор механизма наследования
- •Создание дерева состояний
- •Процедура "послать"
- •Опровержение фразы
- •Концепции механизма наследования
- •Пример с собранием
- •Пример с птицами
- •Реализация процедуры "послать"
- •Алгоритм работы процедуры "послать"
- •6.6. Программа, выполняющая запросы к базе данных
- •Состояния как виртуальные базы данных
- •Использование процедуры "з"
- •Опрос базы данных (добавление нового состояния)
- •Процедура "отобразитьсостояния"
- •Полезные свойства программы, выполняющей запросы к базе данных
- •Реализация программы, выполняющей запросы
- •Процедура "отобразить"
- •Процедура "з"
- •Процедура "характер"
- •6.7. Описание изменений базы данных
- •Мир кубиков
- •Картина состояния
- •Внесение изменений в базу данных при помощи процедуры "поместить"
- •Реализация процедуры "поместить"
- •Оценка механизма наследования
- •Процедура "послать" как предикат метаязыка
- •Библиографические заметки
- •Упражнения
Создание дерева состояний
Отношение двух состояний описывается в базе данных "порождение".
Для того чтобы реализовать приведенный выше пример в виде программы, нужно, чтобы один факт "порождение" свидетельствовал о том, что состояние «служащие, получающие оклад» порождено состоянием «служащие», а другой факт говорил о том, что и состояние «служащие, работающие по контракту» является порождением состояния «служащие». Связь фразы Пролог - программы с определенным состоянием устанавливается благодаря введению дополнительного аргумента, содержащего имя состояния.
Приведем версию программы для примера со служащими.
% дерево состояний:
порождение (на_окладе, служащие).
порождение (по_контракту, служащие).
% фразы, связанные с состоянием "служащие":
% Состояние Отд Расположение
расположение_отдела(служащие, 100, 'Флигель 2-й этаж').
расположение_отдела (служащие, 200. 'Здание 4073').
% Состояние Отд Менеджер
менеджер-отдела (служащие, 100, смит).
менеджер-отдела (служащие, 200, родригес).
% собрание всех служащих отдела 100:
собрание_отдела (служащие, 100, 'Вт 22.01 Комната 235').
% фразы, связанные с состоянием "на_окладе":
% Состояние Имя Отд Оклад
служ (на_окладе, хове, 100, 55000).
служ (на_окладе, листвиски, 100, 40000).
служ (на_окладе, аптон, 200, 35000).
% Состояние Форма
налогов_ведомость (на—окладе, 2).
% собрание только для служащих отдела 100, получающих
% оклад:
собрание_отдела (на „окладе, 100, 'Пн 21.01 Комната 201').
% фразы, связанные только с состоянием "по_контракту":
% Состояние Имя Отд Оклад
служ (по_контракту, льюис, 100, неприменим).
служ (по_контракту, бертоли, 200, неприменим).
% Состояние Форма
налогов_ведомость (по_контракту, 1099).
Процедура "послать"
Наследование фраз от состояния к порожденным им состояниям реализуется процедурой "послать". У этой процедуры два аргумента — имя состояния, к которому обращен запрос, и Пролог-запрос, в котором отсутствует аргумент, обозначающий имя состояния. Нижеследующий вызов процедуры "послать" запрашивает номер формы налоговой ведомости, которую следует выдать служащим, работающим по контракту:
| ?— послать (по_контракту, налогов_ ведомость (Форма)) .
Форма =1099 ;
нет
Обратите внимание на то, что процедура "послать" смогла найти только один ответ на запрос «налогов ведомость (Форма)». В следующем вызове процедуры "послать" задается вопрос о менеджере служащих, работающих в отделе 100 по контракту. Из ответа видно, что состояние «по_контракту» наследует фразы от состояния «служащие».
| ?— послать(по_ контракту, менеджер_ отдела(100, Кто)).
Кто == смит ;
нет
Переадресация запроса
Если процедура "послать" не может решить запрос в соответствии с фразами заданного состояния, она переадресует этот запрос к порождающему состоянию. Если запрос потерпит повторную неудачу в порой дающем состоянии, то процедура "послать" переадресует его к порождающему состоянию еще более высокого уровня. Этот процесс может продолжаться до тех пор, пока не будет достигнуто порождающее состояние самого высокого уровня.
Нижеследующий запрос спрашивает о собраниях, в которых должны принять участие все служащие отдела 100, получающие оклад. Данный пример показывает, что процедура "послать" может вырабатывать ответы на основании информации, получаемой более чем из одного состояния.
| ?— послать (на_окладе, собрание—отдела (100, М)).
М = 'Пн 21.01 Комната 201' ; % по состоянию "на_окладе"
М = 'Вт 22.01 Комната 235' ; % по состоянию "служащие"
нет