- •Приложения
- •1. Основная терминология
- •II. Полезные программы Различные процедуры
- •Процедуры сбора множества ответов
- •Процедуры ввода-вывода низкого уровня
- •Программа "отобразить_состояние"
- •Экранно-ориентированная программа, предназначенная для выполнения запросов к базе данных
- •III. Показательный пример программа планирования работы завода Ситуация
- •Прототип программы
- •Примеры сеансов работы с программой
- •Пользование программой
- •Программа Алгоритм планирования
- •Оценка алгоритма планирования
- •Чтение текста программы
Экранно-ориентированная программа, предназначенная для выполнения запросов к базе данных
% ЗАПРОСБД % Эта программа вызывается при помощи запроса:
% | ?-запросбд(Имя).
% где "Имя" — это имя предиката.
% Для каждой опрашиваемой базы данных должен присутствовать
% факт "схема/2", первым аргументом которого является имя
% предиката, а вторым — список сообщений-подсказок (по одному
% на каждое ноле) .
% Примеры фактов "схема":
% Предикат Сообщения-подсказки
схема (служащий, ['Имя', 'Код', 'Должность', 'Оклад']).
схема (отдел, [' Код', 'Название ',' Менеджер' ]).
% Примеры опрашиваемых баз данных:
служащий (брайен, 100, оператор, 20000).
служащий (нэнси, 200, начальник, 71000).
служащий (ральф, 100, менеджер, 71500).
отдел (100, обработка_данных, ральф).
отдел (200, продажа, жб).
% +
запросбд(Пред) :-
схема (Пред, Подсказки),
чистка экрана, % очистить экран
курсор (1, 2),
repeat,
цикл (Пред, Подсказки, Возврат) ,
Возврат = х, ! .
% цикл: печатать все сообщения-подсказки с позиции 25.
% Получить от пользователя параметры запроса, а затем вызвать
% процедуру "попытка _ запроса".
% + + -
цикл (Пред, Подсказки, Возврат) : —
вывод_ подсказок (25, 4, Подсказки),
% пояснить, что появляется на экране:
курсор (25,2), чистка _ строки,
write (' Введите параметры: '),
ввод_параметров (40, 4, Подсказки, Параметры),
% построить запрос:
Запрос = . . [Пред [ Параметры ],
! , попытка _ запроса (Пред, Подсказки, Параметры, Возврат, Запрос).
% попытка _ запроса: выполнить запрос, выдать ответ с позиции 40,
% а затем напечатать сообщение-подсказку для следующего действия.
попытка_запроса (Пред, Подсказки, Параметры, Возврат, Запрос) :—
Запрос, % разрешается возврат назад
% пояснить, что появляется на экране:
курсор(25, 2),чистка_строки, write ('Ответы: '),
вывод_ ответов (40, 4, Параметры),
% подсказка для следующего действия:
курсор(25, 23) , чистка строки,
write ('m (еще ответы) с (изменить параметры) '),
write ( ' х (выход)' ) ,
вводполя(Ответ),
курсор (25, 23), чистка_ строки,
( Ответ = с,
цикл (Пред, Подсказки, Возврат)
;
Ответ = х. Возврат = х
).
% Если получен ответ, не равный с или х, то вернуться назад к
% приведенному выше Запросу.
% Запрос в предыдущей фразе "попытка _ запроса" потерпел неудачу,
% поэтому выполнить следующие действия:
попытка _ запроса (Пред, Подсказки, _, Возврат, ) :—
% подсказка для следующего действия:
курсор (25, 23), чистка_ строки,
write ('Ответов (больше) нет.'),
write ( ' с (изменить параметры) х (выход) ') ,
вводполя (ответ),
курсор(25, 23), чистка_строки,
( Ответ = х. Возврат = х
;
% если Ответ не равен х:
цикл (Пред, Подсказка, Возврат) )-
% + + +
вывод подсказок (_,_, [ ] ).
вывод_подсказок(Х, Y, [Подсказка [ Подсказки ]) :—
курсор(Х, Y), write (Подсказка), чистка _ строки,
NY is Y + 2, % передвинуться вниз на две строки
! , вывод_ подсказок (X, NY, Подсказки).
% + + +
вывод_ответов(_, _, [ ] ).
вывод _ответов (X, Y, [Ответ [ Ответы ]) :-
курсор(Х,Y), чистка_строки,
% ничего не делать, если переменная "Ответ" не конкретизиро-
% вана:
(vаr(Ответ); write (Ответ) ),
NY is Y + 2, % сдвинуться вниз на две строки
! , вывод _ответов (X, NY, Ответы) .
% + + + -
ввод_параметров(_, _, [], [ ] ).
ввод _ параметров (X, Y, [Подсказка [ Подсказки],
[Параметр | Параметры ] ) :— курсор (X,Y),
% если первым символом будет возврат каретки, то переменная
% "Параметр" останется неконкретизированной:
вводполя(Параметр),
NY is Y + 2, % сместиться вниз на две строки
! , ввод_ параметров (X, NY, Подсказки, Параметры).
% позиционирование курсора на терминале, совместимом с
% терминалом vt 100:
курсор (X,Y) :-
put(27), % escape
put(91), % [
write (Y),
put(59), % ;
write (X),
put(72). % H % очистить экран чистка _экрана :—
курсор(1,1),
put(27), % escape
put(91), % [
put(74). % J
% чистка до конца строки чистка _ строки :—
put(27), % escape
put(91), % [
put(75). % К
% Текст процедуры "вводполя/1" см. в разд. 3.9 .