- •Глава 5
- •Обработка текста
- •Введение
- •Лексический анализ и грамматический разбор
- •Содержание данной главы
- •Стратегии грамматического разбора и стратегии решения задач
- •5. 1. Лексический анализатор
- •Процедура "читатьпредлож"
- •Алгоритм работы лексического анализатора "читатьпредлож"
- •Использование программы "читатьпредлож"
- •5. 2. Система нисходящего грамматического разбора Программа "объект"
- •Использование программы "объект"
- •Использование процедуры "объект" в обратном направлении
- •Расширение грамматики
- •Принцип работы системы нисходящего грамматического разбора
- •5. 3. Система восходящего грамматического разбора Принцип работы системы восходящего грамматического разбора
- •Вид правила "восх_объект"
- •Анализ процесса грамматического разбора
- •Леворекурсивные правила
- •Работа леворекурсивного правила
- •Использование процедур грамматического разбора
- •5. 4. Конвертер программ с dec-10 пролога на микро-пролог Синтаксис микро-Пролога
- •Компоненты микро-Пролога
- •Реализация программы "d_to_m"
- •Использование процедуры "d_to_m"
- •Улучшение интерфейса с пользователем
- •Ограничения процедуры "d_to_m"
- •5.5. Язык запросов
- •Спецификация схемы базы данных
- •Стратегия реализации
- •Грамматика языка запросов
- •Программа "зобъект"
- •Алгоритм работы программы "зобъект
- •Процедура "построить_псписки"
- •Выходные данные программы "построить-псписки"
- •Процедура "построить-зсписки"
- •Выходная информация программы "построить_зсписки"
- •Процедура "список_во_фразу"
- •Выходные данные процедуры "список_во_фразу"
- •Процедура "печатать_тсписок"
- •Объединение составных частей в единую программу
- •Интерпретатор
- •Библиографические заметки
- •Упражнения
5.5. Язык запросов
Следующим примером применения системы грамматического разбора служит программа, которая преобразует предложения англоподобного языка запросов к базе данных в Пролог - запросы, а затем выполняет запросы и печатает ответы. Процесс перевода здесь более сложен, чем в программе "d_to_m", поскольку два употребляемых языка не являются структурно сходными.
Спецификация схемы базы данных
Перед тем как станет возможным применение англоподобного языка запросов к базе данных, в программу нужно ввести явные знания о количестве и именах аргументов этой базы данных. Эта информация позволит пользователю обращаться к аргументам предикатов по именам. Предположим, что мы будем опрашивать следующие базы данных:
служащий (бра йен, 100, оператор, 20000).
служащий (нэнси, 200, начальник, 71000).
служащий (ральф, 100, менеджер, 71500).
отдел(100, обработка данных, ральф).
отдел (200, продажа, жб).
Имя опрашиваемой базы данных и имена ее аргументов специфицируются при помощи фактов "схема":
% интерфейс с базами данных "служащий" и "отдел":
% Имя предиката Имена аргументов
схема (служащий, [имя, код, должность, оклад]).
схема (отдел, [ код, имя, менеджер ]) .
Программа также полагается на факты "схема" при определении числа аргументов каждой базы данных Пролога. Приведенные выше факты содержат неявную информацию о том, что база данных "служащий" имеет четыре аргумента, а база данных "отдел" — три аргумента.
После того как в интерпретатор языка запросов будут введены знания о схемах баз данных "служащий" и "отдел", интерпретатор сможет обрабатывать, к примеру, такие запросы:
выдать служащий имя и отдел менеджер
где служащий код является отдел код.
(выдать имя служащего и менеджера отдела, причем код
служащего равен коду отдела.)
В ответ на данный запрос интерпретатор выдаст следующую информацию( Автор пользуется англоподобным языком запросов. При переводе "англо-подобность" будет проявляться только в том, что сохранится английская структура запроса на псевдоестественном языке, принятая автором. Слова же, входящие в состав запроса, здесь даются в русском переводе. Это приводит к построению неудобочитаемых "русских" предложений. Если же попытаться русифицировать структуру запроса (с учетом согласования слов по падежам и т.п.), то это потребует коренной переделки программ и существенного их усложнения, что для данной книги неоправданно. Приведенные выше ответы интерпретатора равнозначны следующим ответам:
имя служащего - брайен, менеджер отдела - ральф
имя служащего - нэнси, менеджер отдела - жб
имя служащего - ральф, менеджер отдела - ральф - Примеч. пер.)
служащий имя брайен отдел менеджер ральф
служащий имя нэнси отдел менеджер жб
служащий имя ральф отдел менеджер ральф
Стратегия реализации
Действия, выполняемые при помощи описываемого языка запросов, можно разделить на три этапа. На первом этапе система нисходящего разбора преобразует предложение языка запросов в список структур "т" (от слова "триплет"). Каждая структура "т" содержит имя предиката, имя аргумента и неконкретизированную переменную, которая должна нести значение аргумента. Если предполагается, тo два значения эквивалентны (как в Приведенном выше примере запроса код служащего и код отдела), то переменные из двух структур "т", несущие это значение, унифицируются. На втором этапе список структур "т" преобразуется в составной запрос Пролога. На третьем этапе запрос выполняется и значения переменных выводятся на печать.
К примеру, на первом этапе приведенный выше запрос подвергается грамматическому разбору и превращается в нижеследующий список структур "т":
[т (служащий, имя, N),
т (отдел, менеджер, М),
т (отдел, код. С),
т (служащий, код. С)]
На втором этапе этот список преобразуется в составной запрос:
служащий (N,C, _, _), отдел (С, _, М)
На третьем этапе осуществляется выполнение составного запроса. Требуемые значения выводятся на печать при помощи процедуры "печатать_тсписок":
| ?- печатать _тсписок( [т (служащий, имя, брайен),
т (отдел, менеджер, ральф) ]).
служащий имя брайен отдел менеджер ральф
Преимуществом такого подхода является то, что список структур "т" выступает в роли интерфейса между системой грамматического разбора языка запросов и остальной частью программы. Если вторая фаза программы (т.е. часть программы, преобразующая список структур в запрос Пролога) работает надежно, то на этапе предварительной обработки может быть Использована любая процедура, вырабатывающая список структур "т".