Процедура "печатать_тсписок"

Осталось только напечатать требуемые имена предикатов, имена аргументов и значения переменных. Процедура грамматического разбора вы давала через переменную "Printlist" список структур "т", который следовало напечатать. Текст процедуры "печатать_тсписок" будет следующим

печатать_тсписок ([ ] ) :— п1,! .

печатать_тсписок ([т (Р, А, V) ] Printlist] ) :—

write (P), write (' '),

write (A), write (' '),

write (V), write (' '),

!, печатать_тсписок (Printlist).

Нижеследующий запрос иллюстрирует работу процедуры "печатать_тсписок":

| ?- печатать_тсписок ([т (служащий, должность, начальник),

т (отдел, имя, продажа) ]).

служащий должность начальник отдел имя продажа

да

Объединение составных частей в единую программу

Правило "запрос", приводимое ниже, объединяет все составные части программы, работающей с языком запросов, в единое целое.

запрос :-

читатьпреддож(5),

зобъект (S, [ ], предложение, Tlist,

Printlist),

!, построить_псписки (Tlist, [ ], Plists),

построить_зсписки (Plists, Qlists),

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

Запрос,

печатать_тсписки (Printlist).

заметьте, что на вход каждой подцели, располагающейся после подцели "читатьпредлож", поступает список, который затем определенным образом трансформируется, а потом передается следующей подцели. Процедура "зобъект" вырабатывает сразу и список «Tlist», который служит входным аргументом процедуры "построить_псписки", и список "Printlist», который является входным аргументом процедуры "печатать_тсписки". Предикат "сократить", стоящий после подцели "зобъект", гарантирует, что запрос, пересылаемый через переменную S, будет подвергаться грамматическому разбору только один раз.

Интерпретатор

Правило "язык_запросов" основывается на правиле "запрос", которое может выдавать ответы на неограниченное количество запросов пользова­теля. Каждый раз пользователю посылается сообщение-подсказка "?". После того, как процедура "язык_запросов" будет запущена, она станет действовать как интерпретатор языка запросов. Пример сеанса работы с процедурой "язык—запросов":

% интерпретатор языка запросов:

язык_запросов :—

repeat, write ('?'), запрос, fail.

| ?— язык—запросов.

? выдать служащий имя.

служащий имя брайен

служащий имя нэнси

служащий имя ральф

? выдать служащий имя и служащий оклад

где служащий имя является отдел менеджер

(В переводе с языка запросов на русский это будет звучать так: "Выдать имя и оклад служащего, являющегося менеджером отдела".)

служащий имя ральф служащий оклад 71500

(имя служащего - Ральф, а его оклад - 71500 долларов.)

?

...

Библиографические заметки

Стратегии грамматического разбора рассматриваются в книге [I]. Аналогия между грамматическим разбором и дедуктивным процессом отмечается в работе [85 ]. В работе [65] представлена гибкая система восходящего грамматического разбора, реализованная на Прологе. Реали­зация на Прологе общепринятых языков запросов к базам данных подроб­но обсуждается в книге [61].

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