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