- •Глава 5
- •Обработка текста
- •Введение
- •Лексический анализ и грамматический разбор
- •Содержание данной главы
- •Стратегии грамматического разбора и стратегии решения задач
- •5. 1. Лексический анализатор
- •Процедура "читатьпредлож"
- •Алгоритм работы лексического анализатора "читатьпредлож"
- •Использование программы "читатьпредлож"
- •5. 2. Система нисходящего грамматического разбора Программа "объект"
- •Использование программы "объект"
- •Использование процедуры "объект" в обратном направлении
- •Расширение грамматики
- •Принцип работы системы нисходящего грамматического разбора
- •5. 3. Система восходящего грамматического разбора Принцип работы системы восходящего грамматического разбора
- •Вид правила "восх_объект"
- •Анализ процесса грамматического разбора
- •Леворекурсивные правила
- •Работа леворекурсивного правила
- •Использование процедур грамматического разбора
- •5. 4. Конвертер программ с dec-10 пролога на микро-пролог Синтаксис микро-Пролога
- •Компоненты микро-Пролога
- •Реализация программы "d_to_m"
- •Использование процедуры "d_to_m"
- •Улучшение интерфейса с пользователем
- •Ограничения процедуры "d_to_m"
- •5.5. Язык запросов
- •Спецификация схемы базы данных
- •Стратегия реализации
- •Грамматика языка запросов
- •Программа "зобъект"
- •Алгоритм работы программы "зобъект
- •Процедура "построить_псписки"
- •Выходные данные программы "построить-псписки"
- •Процедура "построить-зсписки"
- •Выходная информация программы "построить_зсписки"
- •Процедура "список_во_фразу"
- •Выходные данные процедуры "список_во_фразу"
- •Процедура "печатать_тсписок"
- •Объединение составных частей в единую программу
- •Интерпретатор
- •Библиографические заметки
- •Упражнения
Процедура "печатать_тсписок"
Осталось только напечатать требуемые имена предикатов, имена аргументов и значения переменных. Процедура грамматического разбора вы давала через переменную "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].