418
Глава 4. Метаязыковая абстракция
?z, равных (a b) и значении ?y, равном b. Однако он не соответствует образцу (?x
a ?y), поскольку этот образец требует, чтобы вторым элементом списка был символ a.
Сопоставитель, который используется в запросной системе, принимает на входе об-
разец, структуру данных и кадр (frame), в котором указываются связывания для раз-
личных переменных образца. Он проверяет, соответствует ли структура данных образцу
без противоречия со связываниями переменных, уже находящимися в кадре. Если да, то
сопоставитель возвращает кадр, дополнив его связываниями, определенными во время
сопоставления. Если нет, он указывает, что сопоставлен ие неудачно.
Напри мер, сопоставление образца (?x ?y ?x) со списком (a b a) при пустом на-
чальном кадре вернет кадр, в котором переменная ?x связана со значением a, а ?y со
значением b. Попытка сопоставления того же списка с тем же образцом при начальном
кадре, в котором указывается, что ?y связывается с a, окажется неудачной. Попытка
сопоставления с теми же данными и образцом, при начальном кадре, в котором ?y свя-
зана со значением b, а ?x несвязана, вернет исходный кадр, дополненный связыванием
a для ?x.
Сопоставитель — единственный механизм, необходимый для обработки простых об-
разцов, не содержащих правил . Например, чтобы обработать запрос:
(должность ?x (компьютеры программист))
— мы просматриваем все утверждения в базе данных и выбираем те, которые соответ-
ствуют образцу при пустом начальном кадре. Для каждого найденного у тверждения мы
подставляем в образец значение ?x из кадра, полученного при сопоставлении.
По токи кадров
Проверка образцов по отношени ю к кадрам организована посредством потоков. Пол у -
чив кадр, процесс сопоставления просматривает элементы базы данных один за другим.
Для каждого входа базы данных сопоставитель порождает либо специальный символ,
указывающий, что сопоставление оказалось неудачным, либо расширение кадра. Из ре-
зультатов сопос тавления всей базы данных собирается поток, и этот поток пропускается
через фильтр, отбрасывающий неудачи. Получается поток всех кадров, которые расши-
ряют данный кадр за счет сопоставления с каким-либо у тверждением из базы
67
.
В нашей системе запрос принимает входной поток кадров и для каждого кадра при-
меняет вышеописанную операцию сопоставления, как показано на рис. 4.4. А именно,
для к аждого к адра во входном потоке запрос генерирует новый поток, содержащий все
расширения этого кадра, пор ожденные сопоставлением с утверждениями из базы. Затем
все эти потоки собираются в один громадный поток, который содержит все возможные
расширения всех кадров входного потока. Этот поток и есть результат запроса.
67
Поскольку сопоставление — в общем случае весьма дорогая операция, нам хотелось бы избежать приме-
нения полного сопоставителя к каждому элементу базы данных. Обычное решение этой проблемы — разбить
процесс на грубое (быстрое) сопоставление и окончательное сопоставление. Грубое сопоставление отфиль-
тровывает базу и находит кандидатуры на окончательное сопоставление. Если действовать аккуратно, можно
построить базу данных таким образом, что часть работы грубого сопоставителя проделывается при построении
базы, а не в момент отбора кандидатов. Это называется индексированием (indexing) базы данных. Суще-
ствует множество приемов и схем индексирования баз данных. Наша реализация, которую мы описываем
разделе 4.4.4, содержит простейший вариант такой оптимизации.