5.5. Язык запросов

Следующим примером применения системы грамматического разбора служит программа, которая преобразует предложения англоподобного языка запросов к базе данных в Пролог - запросы, а затем выполняет запросы и печатает ответы. Процесс перевода здесь более сложен, чем в программе "d_to_m", поскольку два употребляемых языка не являются структурно сходными.

Спецификация схемы базы данных

Перед тем как станет возможным применение англоподобного языка запросов к базе данных, в программу нужно ввести явные знания о ко­личестве и именах аргументов этой базы данных. Эта информация позволит пользователю обращаться к аргументам предикатов по именам. Предпо­ложим, что мы будем опрашивать следующие базы данных:

служащий (бра йен, 100, оператор, 20000).

служащий (нэнси, 200, начальник, 71000).

служащий (ральф, 100, менеджер, 71500).

отдел(100, обработка данных, ральф).

отдел (200, продажа, жб).

Имя опрашиваемой базы данных и имена ее аргументов специфицируются при помощи фактов "схема":

% интерфейс с базами данных "служащий" и "отдел":

% Имя предиката Имена аргументов

схема (служащий, [имя, код, должность, оклад]).

схема (отдел, [ код, имя, менеджер ]) .

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

После того как в интерпретатор языка запросов будут введены знания о схемах баз данных "служащий" и "отдел", интерпретатор сможет обраба­тывать, к примеру, такие запросы:

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

где служащий код является отдел код.

(выдать имя служащего и менеджера отдела, причем код

служащего равен коду отдела.)

В ответ на данный запрос интерпретатор выдаст следующую информацию( Автор пользуется англоподобным языком запросов. При переводе "англо-подобность" будет проявляться только в том, что сохранится английская структура запроса на псевдоестественном языке, принятая автором. Слова же, входящие в состав запроса, здесь даются в русском переводе. Это приводит к построению неудобочитае­мых "русских" предложений. Если же попытаться русифицировать структуру запроса (с учетом согласования слов по падежам и т.п.), то это потребует коренной переделки программ и существенного их усложнения, что для данной книги неоправданно. При­веденные выше ответы интерпретатора равнозначны следующим ответам:

имя служащего - брайен, менеджер отдела - ральф

имя служащего - нэнси, менеджер отдела - жб

имя служащего - ральф, менеджер отдела - ральф - Примеч. пер.)

служащий имя брайен отдел менеджер ральф

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

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

Стратегия реализации

Действия, выполняемые при помощи описываемого языка запросов, можно разделить на три этапа. На первом этапе система нисходящего разбо­ра преобразует предложение языка запросов в список структур "т" (от слова "триплет"). Каждая структура "т" содержит имя предиката, имя аргу­мента и неконкретизированную переменную, которая должна нести значе­ние аргумента. Если предполагается, тo два значения эквивалентны (как в Приведенном выше примере запроса код служащего и код отдела), то пере­менные из двух структур "т", несущие это значение, унифицируются. На втором этапе список структур "т" преобразуется в составной запрос Проло­га. На третьем этапе запрос выполняется и значения переменных выводятся на печать.

К примеру, на первом этапе приведенный выше запрос подвергается грамматическому разбору и превращается в нижеследующий список струк­тур "т":

[т (служащий, имя, N),

т (отдел, менеджер, М),

т (отдел, код. С),

т (служащий, код. С)]

На втором этапе этот список преобразуется в составной запрос:

служащий (N,C, _, _), отдел (С, _, М)

На третьем этапе осуществляется выполнение составного запроса. Требуемые значения выводятся на печать при помощи процедуры "печатать_тсписок":

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

т (отдел, менеджер, ральф) ]).

служащий имя брайен отдел менеджер ральф

Преимуществом такого подхода является то, что список структур "т" выступает в роли интерфейса между системой грамматического разбора языка запросов и остальной частью программы. Если вторая фаза програм­мы (т.е. часть программы, преобразующая список структур в запрос Пролога) работает надежно, то на этапе предварительной обработки может быть Использована любая процедура, вырабатывающая список структур "т".

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