Выходные данные программы "построить-псписки"

Посмотрим, что процедура "построить-псписки" сделает с выходными данными предыдущего запроса к процедуре "зобъект":

| ?— построить_псписки (

[т(служащий, имя, _613),

т (отдел, менеджер, -642),

т (служащий, код, _6б8),

т (отдел, код, _668)),

[ ], Псписки).

Псписки =[[ служащий, п (имя, _613), n(код, _668)],

[отдел, п (менеджер, _642), n(код, _669]]

Процедура "построить_псписки" сгруппировала список структур "т" в два списка « Plist».

Процедура "построить-зсписки"

Следующая задача состоит в том, чтобы по базе данных "схема" опре­делить количество аргументов каждого предиката, для которого сущест­вует список « Plist » . Необходимо построить список аргументов для каждого предиката. Этот список должен содержать взятые из «Plist» пере­менные, несущие значения аргумента, которые должны располагаться в списке в правильных позициях. В остальные позиции списка следует по-местить новые переменные. Пусть, к примеру, требуется преобразовать список «Plist» вида:

[служащий, п (оклад,_25) ]

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

(служащий, _, _, _, _25]

Обратите внимание на то, что переменная, несущая значение аргумента гад", располагается в правильной (четвертой) позиции запроса к базе данных "служащий". Преобразованный список «Plist» получает название «Qlist». Далее этот список будет трансформирован в запрос языка Пролог.

Процедура "построить_зсписки" берет в качестве входного элемента список « Plist », выработанный процедурой "построить_псписки", и воз­вращает список « Qlists » . Процедура "построить_зсписки" анализирует схему" каждого предиката из списков «Plist» и возвращает «Argnames» — список имен аргументов, связанных с предикатом. Затем она вызывает процедуру "построить_список_значений", которая вырабатывает « Valuelist» - список, состоящий точно из такого количества переменных, сколько насчитывается переменных в списке «Argnames» . Список « Qlist » строится путем добавления имени предиката в начало списка « Valuelist».

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

% имена переменных:

% Argnames= список имен аргументов

% V, VI, V2 = значения аргументов

% Valuelist = список значений аргументов

% AVpairs = [n(A,V),...]

%Plist = [P,n(A,V),n(A,V),...]

% Plists = список, каждым элементом которого является список

% Plist

% Qlist = [P,V1.V2,...VN]

% Qlists = список, каждым элементом которого является список

% Qlist

% построить_зсписки: построить список, состоящий из списков Qlist

% + _

построить_зсписки ([ ], [ ]).

построить_зсписки ([ [Р ! AVpairs] ! R],

[ [Р ; Valuelist] / Qlists]) :-

схема (Р, Argnames),

построить_список_значений (Argnames, AVpairs, Valuelist),

!, построить_зсписки (R. Qlists).

% построить_списки_значений:

% искать каждое А из списка Argnames в списке

% AVpairs; возвратить список значений.

% + + _

построить_список_значений ([],_, [ ]).

построить_список_значений ([А | Argnames], AVpairs, [V | Valuelist]) :-

найти_пару_для_арг (А, V, AVpairs),

!, построить_список_значений (Argnames, AVpairs, Valuelist).

% найти_пару_для_арг:

% если А (первый аргумент) обнаружен в списке AVpairs, то через вто-

% рой аргумент вернуть переменнуюV; в противном случае вернуть пе-

% ременную _.

Найти_пару_для_арг (_, _, [ ]).

% + _ +

найти_пару_для_арг (A,V, [n(A,V) ; AVpairs]) :- !.

найти_пару_для_арг (A,V, [п (НеА,_); AVpairs]) :-

!, найти_пару_для_арг (А, V, AVpairs).

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие