значение в БД показывает, что мы не знаем, с каким городом ассоциирована деталь P1. Сравнение X=NULL нельзя (в духе двузначной логики) заменить дизъюнкцией сравнений X со всеми городами мира; NULL здесь покрывает и те случаи, когда деталь находится на Луне, на дне морском, еще не изготовлена и т. п.

Поэтому исходный запрос Дейта должен формулироваться так: «Выдать пары SNO-PNO, для которых известно, что поставщик и деталь располагаются в разных городах, или город, в котором располагается деталь, не Париж». Теперь результаты SQL-запроса имеют смысл. И хотя детали P1 «в реальном мире в действительности соответствует некоторый город», возвращается пустой результат, поскольку нам неизвестно какой.

Различия между двузначной и трехзначной логикой проясняет и анализ второго примера Дейта: «Выдать номера PNO для деталей, ассоциированных с городами». Дейт выражает этот запрос так:

SELECT P.PNO FROM P

WHERE P.CITY = P.CITY.

Поскольку «в реальном мире» каждая деталь должна находиться в некотором городе, Дейт делает заключение, что этот запрос должен вернуть полное множество номеров деталей, содержащихся в P. Но, так как в SQL используется трехзначная логика, этот оператор SQL выражает другой запрос: «Выдать номера PNO для деталей, про которые известно, в каких городах они находятся». И SQL совершенно законно возвращает пустой результат, поскольку мы не знаем, в каком городе находится деталь P1.

По мнению Рубинсона, «Дейту не удалось продемонстрировать несостоятельность SQL. Для сформулированных Дейтом запросов SQL возвращает корректные ответы, но не те, на которые он рассчитывал. Эта путаница вполне объяснима. Трехзначная логика SQL не является интуитивной... и редко удается прямо отобразить в SQL вопросы, используемые людьми при обычном общении».

Заметим, что «путаница» в SQL объясняется не трехзначной логикой, как таковой, а тем, что введена она в эту СУБД под маской двузначной. Поэтому использование неопределенных значений меняет смысл простых на вид запросов и может приводить к многочисленным ошибкам.

Проблема усугубляется тем, что информация может отсутствовать в БД по разным причинам. В своей ранней заметке Дейт называет семь распространенных причин неполноты данных; в нашей литературе того времени можно найти попытку представить все такие причины в виде иерархического дерева с 22 вершинами, 11 из которых – концевые. Однако, если маркеры неопределенных значений нагружаются разным смыслом, построение запросов быстро становится очень сложной задачей.

В полемике К. Рубинсон интуитивно приближается к тому фундаментальному факту трехзначной логики, согласно которому всякое ее утверждение разлагается на два утверждения двузначной логики (необходимая и возможная части; см. PC Magazine/RE, 11/2006, с. 130): «Полезно также заметить, что любой запрос, опирающийся на трехзначную логику, можно разложить в два связанных запроса, опирающихся на двухзначную логику... Выполнение такого разложения часто оказывается полезным, особенно при построении сложных запросов». Однако приводимый пример (замененный нами многоточием) неудачен, поскольку его запрос, который «предполагает использование трехзначной логики», на самом деле двузначен, хотя и адресован трехзначной БД. Собственно трехзначным является запрос: «Выдать пары SNO-PNO, для которых городом детали не является Париж». Ответом на его необходимую часть служат все присутствующие в БД пары с городами, отличными от Парижа; в ответе на возможную часть к ним добавляются все пары с «городом» NULL.

Трехзначная логика имеет фундаментальные отличия от двузначной (булевой). Прежде всего, если двузначная логика единственна, то трехзначных логик много в том смысле, что для таких логических связок, как отрицание и следование (импликация), можно выбирать различные трехзначные функции. Мы всюду принимаем «стандартный» выбор функций, т. е. тот, который используется в SQL (AND, OR, NOT). Эти функции тождественны булевым, если их аргументы принимают булевы значения TRUE, FALSE. Однако в трехзначной логике набор AND, OR, NOT неполон: существуют функции трехзначной логики, которые нельзя построить с помощью только переменных и этих связок. Простейший пример такой функции – константа TRUE, т. е. тождественная истина (то же относится к FALSE и UNKNOWN). По этой причине в трехзначной логике неверны закон исключенного третьего (X OR NOT X=TRUE) и закон противоречия (X AND NOT X=FALSE).

Если мы добавляем в логические выражения константы (что и делается в SQL), то множество выразимых функций расширяется, но не достигает полноты. Полным оно становится при добавлении модальных функций необходимости и возможности (в SQL они отсутствуют, в булевой логике совпадают с тождественной функцией; см. PC Magazine/RE, 11/2006, с. 130).

В SQL также отсутствует связка следования (импликация), очевидно, из-за неясности выбора функции. Если мы выразим «из X следует Y» так же, как в двузначной логике, т. е. NOT X OR Y, то в трехзначной логике «из X следует X» не будет тождественной истиной.

Учиться у аймара

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

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

Использование в БД неопределенных значений – не самая важная проблема при работе с SQL. Основное противоречие SQL состоит в том, что он дает двузначный ответ на запрос, который интерпретирует как трехзначный. А поскольку присутствие единственного неопределенного значения делает всю БД трехзначным множеством, ответом на запрос SQL должно быть трехзначное же подмножество БД. Это подмножество может быть представлено ответом на необходимую часть запроса, дополненным элементами ответа на возможную часть. Если же нужен двузначный ответ, запрос должен также быть двузначным, что легко достигается с помощью модальных функций. Кроме того, их явное введение расширит набор логических связок SQL до полного.

Другими словами, трехзначной логике, введенной в SQL с «черного входа», необходимо придать легальный статус, что, конечно, изменит синтаксис языка – новые функции позволяют, например, отказаться от таких конструкций, как IS NULL и IS NOT NULL.

Кроме того, известно, что пальма первенства среди языков, способных исполнять роль СУБД, принадлежит Прологу (см. PC Magazine/RE, 8/2007, с. 78). Даже в существующей сегодня форме он позволяет без особых усилий формулировать «правильные» запросы к БД с неопределенными значениями. «Принцип резолюций», лежащий в основе Пролога, сегодня работает в рамках двузначной логики, но уже имеются его обобщения для логики многозначной. Практическая реализация «трехзначного Пролога» придаст трехзначной логике SQL гибкости в работе с БД, свойственную нынешней двузначной версии Пролога. Не исключено, что подобное ПО сможет возродить неудавшийся в свое время японцам проект «пятого поколения», особенно если для него будет выпущена новая элементная база с физической реализацией трех состояний. Такие элементы (триты) тоже могут быть созданы уже сегодня; вопрос массового производства – чисто экономический.

Ноутбук-долгожитель

Рик Бройда

Не спешите отказываться от старого, медленного ноутбука. С помощью описанных здесь приемов можно продлить его «жизнь» до полного износа.

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

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату
×