Выходная информация программы "построить_зсписки"

Приведем запрос к процедуре "построить_зсписки", входным аргу­ментом в котором служит список Plists, полученный при предыдущем запросе к процедуре "построить_псписки".

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

[[служащий, п (имя, _б13), п(код, _668)],

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

Qlists).

Qlists =[[служащий, _613, _668, _868, _885],

[отдел. _668, _922, _642]]

Обратите внимание на положение каждой переменной в выходном списке Qlists. Внутренняя переменная программы -668 появляется в обоих спис­ках Qlist, входящих в состав списка Qlists. Она выступает в роли разделяе­мой (т.е. общей) переменной в итоговом составном запросе.

Процедура "список_во_фразу"

Для преобразования списка Qlists в подцели составного запроса необ­ходимо воспользоваться встроенным предикатом "=.." (см. разд. 3.9) Процедура "список_во_фразу" выполняет это преобразование для лю­бого количества списков Qlist. Подцели составного запроса объединяются Друг с другом при помощи инфиксной операции ,. Это означает, что если первым аргументом предиката "=.." будет составной запрос, то этот пре­дикат превратит символ , в первое слово выходного списка:

! ?- (отец(Х,Y),отец(Y,2)) =. . Список.

Список =[ ,, отец (X, Y). отец (Y, Z)]

Примечание: первым элементом списка "Список" является запятая; за ней стоит еще одна запятая, которая отделяет первый элемент от следую­щего - «отец(Х, Y)» . Правила (2) и (3) процедуры "список--во_ фра­зу" предназначены для обработки составных запросов.

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

% Tlist, Prmtlist = [r(P,A,V),

% t(p,a,v),...]

% Qlist = [Предикат, Apг1i, Арг2,..., ApгN]

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

% преобразование списка Qlists во фразовую форму записи.

% точно один список Qlist:

% + _

список_во_фразу ([Qlist], Фраза) :- % (1)

Фраза =. . Qlist , ! .

% точно два списка Qlist:

список _во_фразу ([Qlist1, Qlist2], ФразаЗ) :- % (2)

Фраза1 =. . Qlist1,

фраза2 = . Qlist2.

% связать друг с другом фразы Фраза1 и Фраза2 при помощи со-

% единителя ","

Фраза3 =.. [,, Фраза1, Фраза2],!.

% более двух списков Qlist:

список_во_фразу ([Qlist1; Qlists], ФразаЗ) :~ % (3)

Фраза1 =. . Qlisti,

Список_во_фразу (Qlists, Фраза2),

% связать друг с другом фразы Фраза! и Фраза2 при помощи со-

% единителя ","

Фраза3 =. . [,, Фраза1, Фраза2],! .

Выходные данные процедуры "список_во_фразу"

Если на вход процедуры "список_во_фразу" подать выходные дан­ные процедуры "построить_зсписки", то будет выдана следующая ин­формация:

| ?— список_во_фразу (

[[служащий, _613, _668, _868, _885],

[отдел, _б68, _922, _642] ],

Запрос).

Запрос= служащий(_613, _668, _868, _885),

отдел(_668, _922, _642)

Теперь посмотрим, что произойдет при выполнении приведенного выше запроса « Запрос » :

| ?-3апрос= (служащий(_613,_668,_868,_885),

отдел (_б68,_922,_642)),

Запрос.

Запрос = (служащий (брайен, 100, оператор, 20000),

отдел (100, обработка_данных, ральф)) ;

Запрос = (служащий (нэнси, 200, начальник, 71000),

отдел (200, продажа, жб)) ;

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