Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[135]

маем из входного потока. В результате получается поток, состоящий только из тех кадров, в которых связывание для ?x не удовлетворяет (должность ?x (компьютеры программист)). Например, при обработке запроса

(and (начальник ?x ?y)

(not (должность ?x (компьютеры программист))))

первый подзапрос породит кадры со связанными значениями ?x и ?y. Затем выражение not отфильтрует этот поток, удалив все кадры, в которых значение ?x удовлетворяет ограничению, что ?x является программистом.70

Особая форма lisp-value реализуется при помощи подобного же фильтра для потоков кадров. При помощи каждого кадра из потока мы конкретизируем все переменные образца, а затем применяем лисповский предикат. Все кадры, для которых предикат оказывается ложным, мы удаляем из входного потока.

Унификация

Чтобы обрабатывать правила языка запросов, нам нужно уметь находить правила, в которых заключения соответствуют данному входному образцу. Заключения правил подобны утверждениям, но только в них могут содержаться переменные, так что нам требуется обобщенный вариант сопоставления с образцом, - называемый унификация (unification), - в котором как «образец», так и «данные» могут содержать переменные.

Унификатор берет два образца, в каждом из которых могут быть константы и переменные, и определяет, возможно ли присвоить переменным значения, которые сделают два образца одинаковыми. Если да, то он возвращает кадр, содержащий эти значения. Например, при унификации (?x a ?y) и (?y ?z a) получится кадр, в котором все три переменные ?x, ?y и ?z связаны со значением a. С другой стороны, унификация (?x ?y a) и (?x b ?y) потерпит неудачу, поскольку не имеется такого значения для ?y, которое бы сделало два образца одинаковыми. (Чтобы вторые элементы образцов оказались равными, ?y должно равняться b; однако, чтобы совпали третьи элементы, ?y обязан быть a.) Подобно сопоставителю, унификатор, используемый в системе запросов, принимает на входе кадр и проводит унификации, не противоречащие содержимому этого кадра.

Алгоритм унификации - самая технически сложная часть запросной системы. При наличии сложных образцов может показаться, что для унификации требуются дедуктивные способности. Например, чтобы унифицировать (?x ?x) и ((a ?y c) (a b ?z)) , алгоритм обязан вычислить, что ?x должен быть равен (a b c), ?y должен быть ?b, а ?z должен быть равен c. Можно считать, что этот процесс решает систему уравнений, описывающую компоненты образцов. В общем случае это будут взаимозависимые уравнения, для решения которых требуются существенные преобразования.71 К примеру, унификацию (?x ?x) и ((a ?y c) (a b ?z)) можно рассматривать как систему уравнений

?x = (a ?y c) ?x = (a b ?z)

70Существует тонкое различие между реализацией not в виде фильтра и значением отрицания в математической логике. См. раздел 4.4.3.

71В одностороннем сопоставлении с образцом все уравнения, которые содержат переменные, заданы явно и уже решены относительно неизвестного (переменной образца).


Из этих уравнений следует, что

(a ?y c) = (a b ?z)

а отсюда, в свою очередь, что

a = a, ?y = b, c = ?z

и, следовательно,

?x = (a b c)

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

Рассмотрим унификацию (?x a) и ((b ?y) ?z) . Можно вычислить, что ?x = (b ?y), а a = ?z, но ничего больше нельзя сказать о значениях ?x и ?y. Унификация заканчивается успешно, поскольку, естественно, можно сделать образцы одинаковыми, присвоив значения ?x и ?y. Поскольку сопоставление никак не ограничивает значение, которое может принимать переменная ?y, никакого ее значения не оказывается в кадре-результате. Однако результат ограничивает значение ?x. Какое бы значение не имела переменная ?y, ?x должен равняться (b ?y). Таким образом, в кадр помещается связывание ?x со значением (b ?y). Если позже значение ?y оказывается определенным (путем сопоставления с образцом или унификации, которая должна соответствовать этому кадру) и добавляется в кадр, значение, связанное с ?x, будет ссылаться

72

на него.72

Применение правил

Главной операцией в компоненте запросной системы, который производит логический вывод на основе правил, является унификация. Чтобы увидеть, как этот компонент работает, рассмотрим обработку запроса, содержащего обращение к правилу, например:

(живет-около ?x (Хакер Лиза П))

Обрабатывая этот запрос, сначала мы при помощи описанной ранее обыкновенной процедуры сопоставления смотрим, имеются ли в базе данных утверждения, которые сопоставляются с данным образцом. (В данном случае таковых не окажется, поскольку в нашей базе данных нет никаких прямых утверждений о том, кто около кого живет.) На следующем шаге мы пытаемся унифицировать образец-запрос с заключением каждого правила. Мы обнаруживаем, что образец унифицируется с заключением правила

72Можно считать, что унификация находит наиболее общий образец, который является специализацией двух входных образцов. А именно, унификация (?x a) и ((b ?y) ?z) равна ((b ?y) a), а унификация (?x a ?y) и (?y ?z a), описанная выше, равна (a a a). Однако в нашей реализации удобнее считать, что результатом унификации является не образец, а кадр.


(rule (живет-около ?person-1 ?person-2)

(and (адрес ?person-1 (?town . ?rest-1)) (адрес ?person-2 (?town . ?rest-2)) (not (same ?person-1 ?person-2))))

и получается кадр, в котором переменная ?person-2 связана со значением (Хакер Лиза П), а переменная ?x связана с (должна иметь то же значение, что и) ?person-1. Теперь по отношению к этому кадру мы вычисляем составной запрос, содержащийся в теле правила. Успешные сопоставления расширят кадр, сообщив значение переменной ?person-1, а соответственно, и ?x, которую мы можем использовать при конкретизации исходного образца-запроса.

В общем случае обработчик запросов при применении правила, когда он пытается распознать образец-запрос в кадре, который содержит связывания для некоторых переменных образца, использует следующий метод:

•Унифицировать запрос с заключением правила и получить (если унификация успешна) расширение исходного кадра.

•По отношению к расширенному кадру вычислить запрос, который является телом правила.

Обратите внимание, насколько это похоже на метод применения процедуры в интерпретаторе eval/apply для Лиспа:

•Связать параметры процедуры с ее аргументами и получить кадр, расширяющий исходное окружение процедуры.

•По отношению к расширенному окружению вычислить выражение, которое является телом процедуры.

Подобие двух вычислителей неудивительно. Точно так же, как в Лиспе средством абстракции являются определения процедур, в языке запросов средством абстракции являются определения правил. В каждом случае мы развертываем абстракцию, создавая соответствующие связывания и вычисляя тело правила либо процедуры по отношению к расширенной среде.

Простые запросы

В этом разделе мы уже рассматривали, как вычислять простые запросы при отсутствии правил. Теперь, разобравшись, как применяются правила, мы можем описать, как простые запросы вычисляются с помощью как правил, так и утверждений.

Получая запрос-образец и поток кадров, мы порождаем для каждого входного кадра два новых потока:

•поток расширенных кадров, получаемых сопоставлением образца со всеми утверждениями базы данных (при помощи сопоставителя), а также

•поток расширенных кадров, полученных применением всех возможных правил (при помощи унификатора).73

73 Поскольку унификация является обобщением сопоставления, можно было бы упростить систему и порождать оба потока с помощью унификатора. Однако обработка простого случая с помощью обычного сопоставителя показывает, как сопоставление (а не полноразмерная унификация) может само по себе быть полезным.



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196]