Классика баз данных - статьи

       

Возражения Критика B


После обсуждавшегося выше обмена сообщениями между Критиком A и Хью к переписке подключился Критик B (по сути дела, принявший дела у Критика A, который в переписке больше не участвовал). В своем первом сообщении, помимо прочего, Критик B сказал следующее:

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

Да, действительно в Третьем Манифесте предписываются, а в Tutorial D (подобно любому известному мне императивному языку) поддерживаются «как операция присваивания, так и операция эквивалентности». На самом деле, в Манифесте предписываются, а в Tutorial D поддерживаются три следующие операции:

• Логическая эквивалентность: Если p и q – предикаты, то эквивалентность (p) EQUIV (q) – используется не реальный синтаксис Tutorial D – это также предикат, при вычислении которого получается TRUE в том и только в том случае, когда при вычислении p и q получается одно и то же истинностное значение.

•       Равенство значений «=»: Значения v1 и v2 являются равными в том и только в том случае, когда они являются одним и тем же значением.

•       Присваивание «:=» (реляционное или иное): Присваивание приводит к тому, что заданное значение v присваивается заданной переменной V (требуется, чтобы после этого результатом сравнения V = v было TRUE).

Я хотел бы особенно тщательно разъяснить сравнение значений, потому что некоторые дальнейшие замечания Критика B наводят на мысль о наличии некоторого разрыва в коммуникации в этой области. Как я уже говорил, значения v1 и v2 являются равными в том и только в том случае, когда они являются одним и тем же значением (и я замечу мимоходом, что для этого понятия вместо термина равенство можно было бы разумным образом использовать слово тождество (identity)).
Наша позиция, отраженная в Манифесте, состоит в том, что любое значение – например, целое число 3 – существует (a) всегда и (b) в точности одно во вселенной (и всегда существовало), но одновременно может существовать много различных местонахождений (occurrence), или проявлений (appearance) этого значения, во многих разных местах. И если в двух таких «местах» в одно и то же время содержатся проявления одного и того же значения, то сравнение этих двух «мест» в этот момент времени на равенство выдаст TRUE (они «уподобятся равным»). Вот некоторый текст из [10], проясняющий общую ситуацию:

<цитата>

Заметим, что имеется логическое различие между значением как таковым и проявлением этого значения – например, проявлением в качестве текущего значения некоторой переменной или значения некоторого атрибута внутри текущего значения некоторой relvar. Каждое такое проявление внутренне состоит из некоторого физического представления данного значения (и у различных проявлений одного и того же значения могут иметься разные физические представления). Таким образом, также имеется логическое различие между проявлением значения, с одной стороны, и физическим представлением этого проявления, с другой стороны; может иметься даже логическое различие между физическими представлениями, используемыми для различных проявлений одного и того же значения. Однако при всем этом обычно вместо оборота физическое представление проявления значения используется сокращенная форма проявление значения, или (чаще) просто значение, если это не приводит к двусмысленности. Заметим, что проявление значения является модельным понятием, а физическое представление проявления является понятием реализационным – например, пользователям, конечно, могло бы понадобиться знать, содержат ли две переменные проявления одного и того же значения, но им не нужно знать, используется ли в этих проявлениях одно и то же физическое представление.

Пример: Пусть N1 и N2 – это переменные типа INTEGER. Тогда после следующих присваиваний и N1, и N2 будут содержать проявление целого значения 3.




Соответствующие физические представления могут быть, а могут и не быть одинаковыми (например, для N1 могло бы использоваться двоичное представление, а для N2 – упакованное десятичное представление), но это никак не затрагивает пользователя.

N1 := 3 ;

N2 := 3 ;

</цитата>

Есть ли что-нибудь неправильное в представленной выше ситуации? Замечание: Если (как это говорится в следующем утверждении Критика B) ответ на этот вопрос состоит в том, что такой подход приводит к неразрешимости, то я уже занимался этой проблемой в двух сопутствующих статьях [11-12] и не хотел бы больше ее здесь обсуждать. Но на основе приведенной выдержки из сообщений Критика B я не могу точно заключить, что имелась в виду именно эта проблема.

Мне также хотелось бы знать, в чем состоит «путаность» семантики Tutorial D. Хью задавал тот же вопрос:

Пожалуйста, покажите на конкретных примерах на Tutorial D, где наша семантика является «путаной». Пожалуйста, объясните также, что, по Вашему мнению, делает семантику путаной. Я понимаю под этим недетерминированность (обнаруживаемую, например, в SQL), но я полагаю, что у нас ее нет.

Насколько мне известно, Критик B так и не дал явного ответа на эти вопросы, если не считать следующего:

Ваша просьба, чтобы разъяснил ошибки Tutorial D на основе примеров, представленных на Tutorial D, является абсурдной! Ни на каком языке вы не можете привести примеры того, что этот язык НЕ позволяет делать!

Я вернусь к этим замечаниям Критика B немного позже.

Так или иначе, Хью написал пространный ответ на протест Критика B. Вот выдержка из этого ответа:

<цитата>

Если в языке баз данных отсутствуют именованные relvar, то как в нем выражаются обновления и ограничения? И как выражаются запросы? … Ответы должны сопровождаться примерами, представленными в некотором конкретном синтаксисе. Это требование является обязательным, и я мог бы не реагировать на ответ, в котором не предпринимается попытка выполнить это требование. Синтаксис должен основываться (там, где это уместно) на реляционной алгебре …



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

</цитата>

Критик B снова вступил в перепалку:

<цитата>

Для ясности: я НЕ предлагал избавиться от понятия переменных отношений как таковых …

Ваш вопрос затрагивает суть огромного различия в семантике теоретико-множественных и вычислительных языков … Теоретико-множественным аналогом семантики «обновления» являются два множества (например, {A} и {B}), соединенные правилом «преобразования множеств», или «перехода». С семантической точки зрения, это ОЧЕНЬ отличается от того, что {A} становится {B} путем выполнения некоторой операции обновления, поскольку – в теоретико-множественных языках – {B} не заменяет {A}, и поэтому нет никакого присваивания значений некоторой переменной. Вместо этого оба множества всегда существуют и связываются некоторым известным образом.

Проблема, порождаемая объединением семантики теоретико-множественного и вычислительного языков некоторым полностью неопределенным образом, делает Третий Манифест настолько же дефектным, насколько дефектен SQL по причине наличия проблемы неопределенных значений!

Ваша просьба, чтобы я разъяснил ошибки Tutorial D на основе примеров, представленных на Tutorial D, является абсурдной! Ни на каком языке вы не можете привести примеры того, что этот язык НЕ позволяет делать!

Я не знаю, как в Tutorial D интерпретировать «эквивалентность» – иногда, как кажется, вам требуется теоретико-множественное понятие (т.е. установление тождественности), а иногда – вычислительное понятие (установление эквивалентности значений). Если отказаться от первого понятия, то как в Tutorial D будет поддерживаться вывод? А если не отказываться, то как согласовать это с присваиванием, являющимся чуждым для теоретико-множественной семантики, в которой отсутствует понятие переменной?



</цитата>

На все это у меня имеются собственные подробные ответы:


  1. Для ясности: я НЕ предлагал избавиться от понятия переменных отношений как таковых.

    Это утверждение кажется родственным замечанию Критика A о том, что (по-видимому) явные relvar являются плохими, а с неявными relvar все в порядке. Я по-прежнему не могу понять, о чем здесь говорится.

  2. Ваш вопрос затрагивает суть огромного различия в семантике теоретико-множественных и вычислительных языков.

    Я полагаю, что имеется в виду вопрос, в котором Хью спрашивал, как выполнять обновления без поддержки relvar; в противном случае я не понимаю это предложение.

  3. Теоретико-множественным аналогом семантики «обновления» являются два множества (например, {A} и {B}), соединенные правилом «преобразования множеств», или «перехода».

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

  4. С семантической точки зрения, это ОЧЕНЬ отличается от того, что {A} становится {B} путем выполнения некоторой операции обновления, поскольку – в теоретико-множественных языках – {B} не заменяет {A}, и поэтому нет никакого присваивания значений некоторой переменной. Вместо этого оба множества всегда существуют и связываются некоторым известным образом.

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


    Меня искренне расстраивает такое полное непонимание. В целом, в этих двух предложениях Критик B пытается смутно сформулировать то, что формулируется в Манифесте предельно четко.

  5. Проблема, порождаемая объединением семантики теоретико-множественного и вычислительного языков некоторым полностью неопределенным образом, делает Третий Манифест настолько же дефектным, насколько дефектен SQL по причине наличия проблемы неопределенных значений!

    Что это в Третьем Манифесте является «полностью неопределенным»? Вот в приведенном замечании неопределенным является смысл «семантики вычислительных языков» – не говоря уже про «теоретико-множественную семантику», понятие, которое я уже комментировал. Кроме того, что означает фраза «настолько же дефектным, насколько дефектен SQL по причине наличия проблемы неопределенных значений»? Неопределенные значения ведут к появлению многозначной логики, которая в большинстве авторитетных источников признается ужасной проблемой; но мне неизвестно, каким образом настойчивое требование Манифеста наличия «семантики вычислительных языков» порождает потребность отхода от традиционной двухзначной логики. Так что ссылка на неопределенные значения – это всего лишь отвлекающий маневр, а утверждение о том, что Манифест «настолько же дефектен, насколько дефектен SQL по причине наличия проблемы неопределенных значений» похоже на сравнение яблок с апельсинами.

    Замечание, добавленное позже: Мне пришло на ум, что фраза «проблема, порождаемая объединением семантики теоретико-множественного и вычислительного языков» может относиться к тому, что мы категорически запрещаем: к возможности присваивания некоторой переменной нового значения в процессе вычисления некоторого выражения, включающего эту переменную. Мы согласны, что допущение такой возможности может привести к вредным последствиям (хотя в некоторых языках она допускается). По этой причине от любого языка, соответствующего Третьему Манифесту, требуется, помимо прочего, удовлетворение следующим предписаниям (и, конечно, Tutorial D удовлетворяет этим предписаниям):
    • С синтаксической точки зрения, никакое присваивание не является выражением; в более общем смысле, никакой вызов операции обновления не является выражением.
    • Следовательно, с синтаксической точки зрения, никакое выражение (в частности, никакое реляционное выражение) не может включать присваивание или, в более общем смысле, вызовов операции обновления любого вида.
    • В отличие от этого, выражение (в частности, реляционное выражение) может включать вызов операции только чтения.


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

      Из всего этого следует, что если заданное реляционное выражение exp включает какие-либо ссылки на некоторую relvar R, то в ходе вычисления exp все эти ссылки обозначают одно и то же: отношение r, являющееся значением R перед началом вычисления exp.

    • Ваша просьба, чтобы разъяснил ошибки Tutorial D на основе примеров, представленных на Tutorial D, является абсурдной! Ни на каком языке вы не можете привести примеры того, что этот язык НЕ позволяет делать!

      Я думаю, что речь идет о том (см. [11-12]), что в Tutorial D допускаются выражения, которые невозможно вычислить. Если это так, то должна иметься возможность привести пример такого выражения. Я согласен, что это может быть трудно сделать – в том смысле, что может получиться очень сложное выражение, – но Критик B говорит, что это невозможно. Так что, по-видимому, имеется в виду что-то другое, являющееся «неправильным» в Tutorial D. Скорее всего, это именно так, поскольку далее Критик B упоминает нечто такое, что язык «НЕ позволяет делать», а как раз формулировать выражения, которые невозможно вычислить, он позволяет (по крайней мере, по мнению Критика B).

      Теперь, после всего сказанного, мне хотелось бы знать, почему аналогичные критические замечания не предъявлялись к оригинальным статьям Кодда [3-4] или его языку ALPHA [5]? И если я прав в том, что подобные замечания применимы к работами Кодда, то мне хотелось бы увидеть язык, к которому они не применимы.

    • Я не знаю, как в Tutorial D интерпретировать «эквивалентность» – иногда, как кажется, вам требуется теоретико-множественное понятие (т.е. установление тождественности), а иногда – вычислительное понятие (установление эквивалентности значений). Если отказаться от первого понятия, то как в Tutorial D будет поддерживаться вывод? А если не отказываться, то как согласовать это с присваиванием, являющимся чуждым для теоретико-множественной семантики, в которой отсутствует понятие переменной?



      Боюсь, что я далек от полного понимания этих замечаний. Я думаю, что Критик B называет здесь «установлением тождественности» то, что мы называем равенством. Я думаю, что Критик B называет здесь «установлением эквивалентности значений» то, что я ранее упоминал (в сноске) под условным названием «равенства проявлений». Я уже пытался пояснить эти конструкции (а именно, равенство и «равенство проявлений») и полагаю, что в Манифесте совершенно явно написано, когда и где они используются, и в чем состоит их семантика. Что касается «поддержки вывода [в Манифесте]», то я думаю, что Критик B имеет здесь в виду процесс определения значения реляционного выражения (в частности, процесс формирования ответа на запрос). Если это действительно так, в Манифесте то этот процесс описан совершенно явным образом.

      Более того, я не вижу, в каком качестве на этой картине фигурируют присваивание и «понятие переменной», поскольку – как я постараюсь пояснить немного позже – ни то, ни другое не играет никакой роли в этом процессе.


В одном из последующих сообщений Критик B говорит следующее:

Мое пожелание состоит не в том, чтобы ввести язык баз данных без имен переменных и т.д., а в том, чтобы в Tutorial D явным образом разделялась теоретико-множественная и вычислительная семантика. Вы стремитесь к единому языку с обоими видами семантики, а я не уверен, что это возможно хотя бы потому, что (например) эквивалентность истинностных значений отличается от эквивалентности кардинальных и ординальных значений.

Как я говорил ранее, в Tutorial D имеется логическая эквивалентность (которая, возможно, является тем же самым, что Критик B называет здесь эквивалентностью истинностных значений), а также равенство значений, а также присваивание (которое ранее Критик B также выдвигал в качестве некоторой разновидности эквивалентности). Теперь он говорит еще и об «эквивалентности кардинальных и ординальных значений». Я не знаю, относится ли эта эквивалентность к одному из трех видов, поддерживаемых в Tutorial D; я не знаю, один или два вида эквивалентности соответствуют «эквивалентности кардинальных и ординальных значений»; я даже не знаю, положительно или отрицательно оценивает поддержку в Tutorial D (если она имеется) этого вида (или этих видов) эквивалентности.


Так или иначе, Хью ответил следующее:

Я объяснил, что мы имеем в виду под «равенством», в ответ на несколько Ваших утверждений, показывающих, что Вас беспокоит наличие к нас двух разных видов. (Я не понимаю оба этих вида, но наша единственная разновидность равенства – это, по-видимому, именно то, наличие чего Вы желаете. См. RM-предписание 8.)

Здесь Хью называет «нашим единственным видом» именно равенство значений, семантика которого точно определена в RM-предписании 8 Третьего Манифеста. На это Критик B ответил следующим образом:

Я осознаю Ваше непонимание того, что имеются два вида «равенства» (на самом деле, много видов) … В лучшем случае, я могу предположить, что в разговорах про Tutorial D у Вас блокируется способность к мышлению в чисто теоретико-множественном духе. Позвольте мне просто сказать, что эквивалентность значений – это не то же самое, что тождественность. Значение имеет отношение к сравнению измерений количественных свойств, в то время как тождественность относится к тому, что математики часто называют сущностями («вещами»).

Хорошо, я вынужден повторить некоторые вещи, которые уже говорил (и я приношу извинения за многословность) … но эти замечания заставляют меня заподозрить, что Критик B не понял, какой смысл вкладывается в Третьем Манифесте в термин значение. Я также подозреваю, что он называет «эквивалентностью значений» то, что мы имеем в виду, говоря про равенство различных проявлений одного и того же значения (а в этом случае мы сказали бы, что – по определению – имеется только одно значение как таковое). Еще я подозреваю, что это его непонимание (нашего использования терминов) приводит его к необоснованной критике. Я также думаю, в противоположность тому, что говорит здесь Критик B, что наша «эквивалентность значений» (раньше я использовал термин «равенство значений») является «тем же самым, что и тождественность»: два проявления являются равными («равными по значению»?) тогда и только тогда, когда они являются проявлениями тождественных значений.


Теперь насчет того, что имеется много видов равенства: Может быть, действительно можно определить много видов равенства (на самом деле, я не знаю этого), но я думаю, что важным является то, которое мы определяем в RM-предписании 8 – и именно к этому виду сравнения мы обращаемся (явно или неявно), когда говорим о равенстве в контексте Третьего Манифеста.

В этом же сообщении Критик B также сказал следующее:

Я не определяю, как, по моему мнению, должны выражаться обновления базы данных, за исключением того, что мы можем безопасно использовать теоретико-множественное представление, для которого имеются и «канонический» метод, и «каноническая» семантика. Я возражаю против присваивания, поскольку считаю его чуждым теоретико-множественному представлению и заимствованному из «семантики ‘до и после’», являющейся в своей основе процедурной.

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

    Как я говорил раньше (цитируя Хью), в предложении по отказу от переменных отношений должны демонстрироваться две важные вещи: во-первых (и это наиболее важно), альтернативный способ обновления базы данных; во-вторых, преимущества этого альтернативного способа над присваиваниями relvar. Меня просто расстраивает, когда нам говорят снова и снова, что наш подход не работает – в особенности, когда при этом явным образом не говорят, почему он не работает; в особенности, когда, по существу, тот же самый подход поддерживается во всех императивных языках с момента появления языков программирования, – и в то же время не предлагают никакого альтернативного подхода, который бы работал.

  2. Мы можем безопасно использовать теоретико-множественное представление, для которого имеются и «канонический» метод, и «каноническая» семантика.

    Мне неясен смысл этих наблюдений.

  3. Я возражаю против присваивания, поскольку считаю его чуждым теоретико-множественному представлению и заимствованному из «семантики ‘до и после’», являющейся в своей основе процедурной.

    Предположим в целях дискуссии, что (a) в теории множеств действительно нет понятия присваивания, и (b) имеется потребность в обновлениях. (Со своей стороны я не испытываю трудностей в принятии этих предположений.) Тогда очевидным выводом является не врожденная дефектность присваивания; скорее, можно счесть, что сама теория множеств не подходит в качестве теоретической основы языков программирования баз данных.


    Однако Критик B утверждает, что присваивание и теория множеств (или «теоретико-множественное представление») не согласуются друг с другом – т.е. они действительно конфликтуют, и если мы поддерживаем одно из них, то не можем поддерживать другое. Если это утверждение истинно, то тем хуже для теории множеств; но, честно говоря, я не вижу причин, по которым это может быть правдой. Замечание: замените в приведенных выше замечаниях «теорию множеств» на «логику», и я подпишусь и под этой формой своего заключительного довода.

    Более того, понятие «семантики ‘до и после’» на самом деле подразумевается наличием присваивания. Однако более важно то, что она подразумевается тем, как работает время в нашей вселенной – лучше сказать, порождается основными свойствами времени! (Я думаю, что и «врожденная процедурность» порождается свойствами времени в нашей вселенной, если мы согласимся, что «процедурность» означает всего лишь выполнение одного действия за другим, последовательно; однако здесь проблема состоит в том, что ярлык «процедурности» обычно применяется в смысле «низкоуровневой процедурности» и поэтому почти всегда используется с уничижительным оттенком.) Если теория множеств не может справиться с «семантикой ‘до и после’», то тем хуже для теории множеств. Замечание: замените в приведенных выше замечаниях «теорию множеств» на «логику», и я подпишусь и под этой формой своего заключительного довода.



Содержание раздела