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

Процедура "отобразить"

Аргументом процедуры "отобразить" является имя состояния. Данная процедура выводит на печать все позиции ведомости сведений о бумаге, связанные с этим состоянием.

отобразить(Состояние) :

% ввести критерии выбора

послать (Состояние,за(тип, Т)),

послать(Состояние,за(марка, М)),

послать (Состояние, за (вес, В)),

послать (Состояние,за(поверхность, П)),

послать (Состояние,за(цвет, Ц)), !,

% взять целостный информационный элемент, удовлетворяющий

% критериям выбора:

вед_бум (бумага. Т, М, В, П, Ц),

% вывести на печать целостный информационный элемент

write (Т), write (' '),

write (M), write (' '),

write (В), write (' ' ).

write (П), write (' '),

write (Ц), nl,

% вернуться следующим целостным информационным эле-

% ментом:

fail.

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

Процедура "з"

Программа "з" создает новое состояние, располагаемое под существующим состоянием, а затем выдает сообщения-подсказки, в соответствии с которыми пользователь может задать критерии выбора для этого нового состояния.

%создать состояние-потомок под существующим состоянием

з(СущСостояние, Потомок) :--

assert (порождение (Потомок, СущСостояние) ),

послать (СущСостояние, за(тип, Т)),

заполнить (Потомок, тип, Т) ,

послать (СущСостояние, за (марка, М)),

заполнить (Потомок, марка, М),

послать (СущСостояние, за (вес, В) ),

заполнить (Потомок, вес. В),

послать (СущСостояние, за (поверхность, П) ),

заполнить (Потомок, поверхность,. П),

послать (СущСостояние, за (цвет. Ц)),

заполнить (Потомок, цвет, Ц), !.

заполнить (Состояние, Имяатрибута, Значатрибута) :- % (1)

write (Имяатрибута), write (' ? '),

write (' '),

% если переменная Значатрибута не конкретизирована, то получить

% ее значение у пользователя:

var (Значатрибута),

вводполя (Значатрибута),

( var (Значатрибута)

;

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

nonvar (Значатрибута),

assert (за (Состояние, Имяатрибута, Значатрибута))

),!.

заполнить (_, Имяатрибута, Значатрибута) :- % (2)

% если переменная Значатрибута конкретизирована, то вывести на

% печать ее значение.

nonvar (Значатрибута),

write (Значатрибута),nl,!.

Обратите внимание на поведение процедуры "заполнить". Первые подцели правила (1) этой процедуры выводят имя атрибута, знак вопроса и пробелы для табуляции. Если переменная Значатрибута конкретизирована, то правило (1) потерпит неудачу, и правило (2) выведет на печать значение атрибута. Если переменная Значатрибута не конкретизирована, то при обращении к процедуре "вводполя" (см. разд. 3.9) она либо станет конкретизированной значением, введенным пользователем, либо останется неконкретизированной, если пользователь не будет вводить значение и нажмет на клавишу возврата каретки. Если пользователь введет значение атрибута, то в программу будет добавлен факт "за", содержащий это значение.

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