Скачиваний:
24
Добавлен:
01.05.2014
Размер:
356.35 Кб
Скачать

Создание дерева состояний

Отношение двух состояний описывается в базе данных "порождение".

Для того чтобы реализовать приведенный выше пример в виде программы, нужно, чтобы один факт "порождение" свидетельствовал о том, что состояние «служащие, получающие оклад» порождено состоянием «служащие», а другой факт говорил о том, что и состояние «служащие, работающие по контракту» является порождением состояния «служащие». Связь фразы Пролог - программы с определенным состоянием устанавливается благодаря введению дополнительного аргумента, содержащего имя состояния.

Приведем версию программы для примера со служащими.

% дерево состояний:

порождение (на_окладе, служащие).

порождение (по_контракту, служащие).

% фразы, связанные с состоянием "служащие":

% Состояние Отд Расположение

расположение_отдела(служащие, 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' ; % по состоянию "служащие"

нет

Соседние файлы в папке Гл.6,7,Прилож.,Допол