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

Экранно-ориентированная программа, предназначенная для выполнения запросов к базе данных

% ЗАПРОСБД % Эта программа вызывается при помощи запроса:

% | ?-запросбд(Имя).

% где "Имя" — это имя предиката.

% Для каждой опрашиваемой базы данных должен присутствовать

% факт "схема/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 .

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