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