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

Картина состояния

Экранно-ориентированная процедура "отобразить—состояние" строит на экране дисплея изображение кубиков для заданного состояния базы данных. Начальное состояние выглядит так:

! ?— отобоазить_состояние (1).

Текст программы "отобразить_состояние" дан в приложении II.

Внесение изменений в базу данных при помощи процедуры "поместить"

Процедура "поместить" вносит изменение в базу данных, генерируя состояние-потомок текущего состояния. Она добавляет новые данные в состояние-потомок, а затем деструктивно изменяет значение факта "текущее_состояние", превращая его в обозначение потомка. Первым аргументом процедуры "поместить" является обозначение кубика, который нужно передвинуть, а вторым аргументом служит место, куда нужно поставить этот кубик.

Например, если текущее состояние — это "1", то запрос

| ?-поместить (г, стол). % запрос (1)

вызовет добавление в программу следующих фраз:

текущее_состояние(2).

на(2,г,стол).

опровергнуть(2,на (_,г,в)).

Кроме того, из программы будет удалена фраза « текущее_состояние (1)».

Выяснение того, где находятся кубики

Нижеследующий запрос покажет, где находятся кубики в состоянии "2" базы данных:

| ?--послать (2, на (_,X,Y)).

Х = г

Y = стол ; % по состоянию "2"

Х=а

Y = стол ; % по состоянию "1"

Х=б

Y = стол ; % по состоянию "1"

Х=в

Y = а ; % по состоянию "1"

нет

Эта информация будет лучше восприниматься, если ее представить в графическом виде:

| ?— отобразить... состояние (2).

Посмотрим, как будет выглядеть база данных после внесения еще нескольких изменений.

| ?-поместить (а, б). % запрос (2)

да

| ?-поместить (в, г). % запрос (3)

да

| ?- текущее_состояние (X).

Х = 4

| ?- отобразить_состояние (4).

Реализация процедуры "поместить"

% запретить использование неизвестного кубика:

поместить (Кубик, Куда _ поставить) : -

% проверить, огсутствуют ли

% Кубик и Куда_ поставить:

( not (на(_ , Кубик, _))

;

Куда_поставить \ = = стол,

not(на( _, Куда поставить, _))

),

write ('неверное обращение к кубику '),nl,!.

% запретить изменение, если переменная Куда_посгавить обозначает

%кубик, на котором уже стоит другой кубик:

поместить(Кубик, Куда_поставить)

Куда_поставить\ = = стол,

текущее_состояние (Состояние),

послать (Состояние, на (Занят, Куда_поставить)),

write (Занят),

write (' уже находится на '),

write (Куда_поставить), nl, !.

% здесь база данных изменяется:

поместить (Кубик. Куда_поставить) :-

текущее_состояние (Состояние), % (1)

НовоеСостояние is Состояние + 1. % (2)

assert (порождение (НовоеСостояние, Состояние)), % (3)

%

послать (Состояние, на (Кубик, Под_кубиком)), % (4)

assert (опровергнуть (НовоеСостояние,

на(_ , Кубик, Под_ кубиком))), % (5)

assert (на (НовоеСостояние, Кубик,

Куда_поставить)), % (6)

retract (текущее_состояние (Состояние)), % (7)

assert (текущее_состояние (НовоеСостояние) ),!. % (8)

Ограничения, обеспечивающие целостность,

которые накладываются во время сбора данных

Первое правило "поместить" отвергает кубики, которые отсутствуют в мире. Второе правило не разрешает пользователю ставить кубик на другой кубик, место над которым уже занято. Если два первых правила потерпят неудачу, то это будет означать, что ограничения, обеспечивающие целостность базы данных, не будут нарушены при предлагаемом ее изменении. Собственно изменение осуществляется третьим правилом "поместить" Подцели (2) и (3) этого правила устанавливают новое состояние базы данных "порождение" Подцель (4) выясняет текущее местоположение кубика "Кубик", а подцель (5) опровергает это местоположение. Подцель (6) добавляет к новому состоянию новое местоположение кубика "Кубик". В заключение подцели (7) и (8) деструктивно изменяют значение факта "текущее_состояние".

Перемещение колонки кубиков

В рассматриваемой версии программы "поместить" разрешается передвигать за один раз целую колонку кубиков. Иными словами, не запрещается перемещать кубик, если на нем стоит еще один кубик. Это именно то, что будет сделано в ответ на приведенный выше запрос (2): « поместий, (а,б)». Все кубики, стоящие над перемещаемым, наследуют новое положение этого кубика. Можно было бы добавить еще одно правило, которое реализовывало бы ограничение, обеспечивающее целостность, гарантируя то, что за один раз будет перемещаться только один кубик.

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