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


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




[130]

непустого списка, представляющего собой cons двух частей:

•Для любого списка y, append пустого списка и y дает y.

•Для любых u, v, y и z, append от (cons u v) и y дает (cons u z), если append от v и y дает z.59

С помощью процедуры append мы можем решать задачи типа

Найти append от (a b) и (c d) .

Однако тех же двух правил достаточно для решения следующих типов вопросов, на которые процедура ответить не может:

Найти список y, такой, что append (a b) и y дает (a b c d) .

Найти все такие x и y, что append от них дает (a b c d) .

В языке логического программирования, когда программист пишет «процедуру» append, он формулирует два правила, приведенные выше. Знание «как сделать» автоматически обеспечивается интерпретатором, что позволяет использовать одну эту пару правил для ответа на все три типа вопросов об append.60

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

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

59Соответствие между правилами и процедурой такое: пусть x из процедуры (когда x непустой) соответствует (cons u v) из правила. Тогда z из правила соответствует append от (cdr x) и У.

60Это ни в коем случае не освобождает программиста полностью от решения задачи, как вычислить ответ. Существует множество математически эквивалентных наборов правил для отношения append, и только некоторые из них можно превратить в эффективное средство для вычисления в каком-либо направлении. Вдобавок, иногда информация «что такое» ничего не говорит о том, как вычислить ответ, - возьмем, например, задачу найти такое у, что y2 = x.

61 Пик интереса к логическому программированию пришелся на начало 80-х, когда японское правительство инициировало амбициозный проект, целью которого было построение сверхбыстрых компьютеров, оптимизированных для логических языков программирования. Скорость таких компьютеров предполагалось измерять в LIPS (Logical Inferences Per Second - число логических выводов в секунду), а не в обычных FLOPS (FLoating-point Operations Per Second - число операций с плавающей точкой в секунду). Несмотря на то, что в рамках проекта удалось создать аппаратное и программное обеспечение, которое изначально планировалось, интересы международной компьютерной промышленности сместились в другом направлении. Обзор и оценку японского проекта можно найти в Feigenbaum and Shrobe 1993. К тому же и в сообществе логических программистов возник интерес к реляционному программированию на основе других методов, помимо простого сопоставления с образцом, например, к работе с численными ограничениями - вроде тех, которые присутствуют в системе распространения ограничений из раздела 3.3.5.


до сих пор: как набор элементарных составляющих, дополненных средствами комбинирования, которые позволяют нам сочетать простые составляющие и получать при этом сложные, и средствами абстракции, которые позволяют нам рассматривать сложные составляющие как единые концептуальные единицы. Интерпретатор языка логического программирования существенно сложнее, чем интерпретатор языка типа Лиспа. Тем не менее, нам предстоит убедиться, что наш интерпретатор языка запросов содержит многие из тех же элементов, которые были в интерпретаторе из раздела 4.1. В частности, у нас будет часть «eval», которая классифицирует выражения в соответствии с типом, и часть «apply», которая реализует механизм абстракции языка (процедуры в случае Лиспа и правила (rules) в случае логического программирования). Кроме того, в реализации центральную роль будет играть структура данных, построенная из кадров и определяющая соотношение между символами и связанными с ними значениями. Еще одна интересная сторона нашей реализации языка запросов - то, что мы существенным образом используем потоки, введенные в главе 3.

4.4.1 Дедуктивный поиск информации

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

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

База данных

База данных персонала «Микрошафт» содержит утверждения (assertions) о сотрудниках компании. Вот информация о Бене Битоборе, местном компьютерном гуру:

(адрес (Битобор Бен) (Сламервилл (Ридж Роуд) 10)) (должность (Битобор Бен) (компьютеры гуру)) (зарплата (Битобор Бен) 60000)

Каждое утверждение представляет собой список (в данном случае тройку). элементы которого сами могут быть списками.

В качестве местного гуру Бен отвечает за компьютерный отдел компании и руководит двумя программистами и одним техником. Вот информация о них:

(адрес (Хакер Лиза П) (Кембридж (Массачусетс Авеню) 78)) (должность (Хакер Лиза П) (компьютеры программист)) (зарплата (Хакер Лиза П) 40000) (начальник (Хакер Лиза П) (Битобор Бен))

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


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

(адрес (Поправич Дайко) (Бостон (Бэй Стейт Роуд) 22)) (должность (Поправич Дайко) (компьютеры техник)) (зарплата (Поправич Дайко) 25000) (начальник (Поправич Дайко) (Битобор Бен))

Имеется также программист-стажер, над которым начальствует Лиза:

(адрес (Дум Хьюго) (Сламервилл (Пайн Три Роуд) 80)) (должность (Дум Хьюго) (компьютеры программист стажер)) (зарплата (Дум Хьюго) 30000) (начальник (Дум Хьюго) (Хакер Лиза П))

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

Бен - служащий высокого ранга. Его начальник - сам глава компании:

(начальник (Битобор Бен) (Уорбак Оливер))

(адрес (Уорбак Оливер) (Суэлсли (Топ Хип Роуд))) (должность (Уорбак Оливер) (администрация большая шишка)) (зарплата (Уорбак Оливер) 150000)

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

(адрес (Скрудж Эбин) (Уэстон (Шейди Лейн) 10)) (должность (Скрудж Эбин) (бухгалтерия главный бухгалтер)) (зарплата (Скрудж Эбин) 75000) (начальник (Скрудж Эбин) (Уорбак Оливер))

(адрес (Крэтчит Роберт) (Олстон (Норт Гарвард Стрит) 16)) (должность (Крэтчит Роберт) (бухгалтерия писец)) (зарплата (Крэтчит Роберт) 18000) (начальник (Крэтчит Роберт) (Скрудж Эбин))

Есть еще секретарь главы компании:

(адрес (Фиден Кон) (Сламервилл (Онион Сквер) 5)) (должность (Фиден Кон) (администрация секретарь)) (зарплата (Фиден Кон) 25000) (начальник (Фиден Кон) (Уорбак Оливер))

Данные содержат также утверждения о том, какой род работы могут выполнять сотрудники, имеющие другую должность. Например, компьютерный гуру способен выполнять работу как компьютерного программиста, так и компьютерного техника:

(может-замещать (компьютеры гуру) (компьютеры программист)) (может-замещать (компьютеры гуру) (компьютеры техник))

Программист может выполнять работу стажера:

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

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



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