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


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




[131]

Кроме того, как всем известно,

(может-замещать (администрация секретарь)

(администрация большая шишка))

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

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

;;; Ввод запроса:

(должность ?x (компьютеры программист)) Система выведет следующие результаты: ;;; Результаты запроса:

(должность (Хакер Лиза П) (компьютеры программист)) (должность (Фект Пабло Э) (компьютеры программист))

Входной запрос указывает, что мы ищем в базе данных записи, соответствующие некоторому образцу (pattern). В этом примере образец указывает, что запись должна состоять из трех элементов, из которых первый является символом должность, второй может быть чем угодно, а третий представляет собой список (компьютеры программист). «Что угодно», которое может стоять на второй позиции в искомом списке, изображается переменной образца (pattern variable) ?x. В общем случае переменная образца - это символ, который мы считаем именем переменной, предваряемый знаком вопроса. Несколько позже мы увидим, почему имеет смысл давать переменным образца имена, а не просто ставить в образцы ?, означающее «что угодно». Система отвечает на простой запрос, выводя все записи в базе данных, соответствующие введенному образцу.

В образце может содержаться более одной переменной. Например, (адрес ?x ?y)

выводит адреса всех служащих.

В образце может совсем не быть переменных. В этом случае запрос просто проверяет, содержится ли запись в базе. Если да, будет одна подходящая под образец запись; если нет, ни одной.

Одна и та же переменная может встречаться в образце в нескольких местах, и это означает, что одинаковое «что угодно» должно встретиться в каждом из этих мест. Ради этого переменным и даются имена. Например,

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

находит всех сотрудников, которые сами себе начальники (впрочем, в нашей пробной базе таковых не имеется). Запросу

(должность ?x (компьютеры ?type))

соответствуют все записи о должностях, в которых третий элемент является двухэлементным списком, а первый элемент в нем компьютеры:


(должность (Битобор Бен) (компьютеры гуру)) (должность (Хакер Лиза П) (компьютеры программист)) (должность (Фект Пабло Э) (компьютеры программист)) (должность (Поправич Дайко) (компьютеры техник))

Этому образцу не соответствует запись

(должность (Дум Хьюго) (компьютеры программист стажер))

поскольку третий элемент здесь является списком из трех элементов, а третий элемент образца указывает, что элементов должно быть два. Если бы нам захотелось изменить образец так, чтобы третий элемент мог быть любым списком, который начинается с компьютеры, мы могли бы написать62

(должность ?x (компьютеры . ?type))

Например,

(компьютеры . ?type)

соответствуют данные

(компьютеры программист стажер)

причем ?type равняется списку (программист стажер). Тому же образцу соответствуют данные

(компьютеры программист)

где ?type равняется списку (программист) , и данные (компьютеры)

где ?type равняется пустому списку () .

Можно следующим образом описать обработку простых запросов в нашем языке:

•Система находит все присваивания переменным в образце запроса, которые удовлетворяют (satisfy) запросу - то есть, все наборы значений переменных, такие, что если переменные образца конкретизуются (are instantiated), то есть замещаются, своими значениями, то результат находится в базе данных.

•Система отвечает на запрос, перечисляя все конкретизации образца с удовлетворяющими ему присваиваниями переменным.

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

Упражнение 4.55.

Постройте простые запросы, которые извлекают из базы данных следующую информацию:

a.Все сотрудники, начальником которых является Бен Битобор.

b.Имена и должности всех работников бухгалтерии.

c.Имена и адреса всех сотрудников, живущих в Сламервилле.

62Здесь используется точечная запись, введенная в упражнении 2.20.


Составные запросы

Простые запросы являются элементарными операциями языка запросов. Чтобы порождать составные операции, язык предоставляет средства комбинирования. Один из элементов, превращающих язык запросов в язык логического программирования - то, что средства комбинирования запросов отражают средства комбинирования, используемые при построении логических выражений: and (и), or (или) и not (не). (Здесь and, or и not - это не элементарные выражения Лиспа, а операции, встроенные в язык запросов.)

Мы можем найти адреса всех программистов с помощью and так:

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

Получаем на выводе

(and (должность (Хакер Лиза П) (компьютеры программист))

(адрес (Хакер Лиза П) (Кембридж (Массачусетс Авеню) 78)))

(and (должность (Фект Пабло Э) (компьютеры программист)) (адрес (Фект Пабло Э) (Кембридж (Эймс Стрит) 3)))

В общем случае, запросу

(and (запросу) ••• (запроси))

удовлетворяют все наборы значений переменных образца, которые одновременно удовлетворяют (запросу) ... (запросу!).

Как и в случае с простыми запросами, система при обработке составного запроса находит все присваивания переменным образца, удовлетворяющие запросу, и затем печатает все конкретизации запроса этими значениями.

Другой метод построения составных запросов - через or. Например,

(or (начальник ?x (Битобор Бен)) (начальник ?x (Хакер Лиза П)))

найдет всех сотрудников, над которыми начальствует Бен Битобор или Лиза П. Хакер:

(or (начальник (Хакер Лиза П) (Битобор Бен)) (начальник (Хакер Лиза П) (Хакер Лиза П)))

(or (начальник (Фект Пабло Э) (Битобор Бен)) (начальник (Фект Пабло Э) (Хакер Лиза П)))

(or (начальник (Поправич Дайко) (Битобор Бен)) (начальник (Поправич Дайко) (Хакер Лиза П)))

(or (начальник (Дум Хьюго) (Битобор Бен)) (начальник (Дум Хьюго) (Хакер Лиза П)))

В общем случае, запросу

(or (запрос) ••• (запросп))



[стр.Начало] [стр.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]