всегда ли x= x истинно?
От: MadHuman Россия  
Дата: 11.06.19 17:07
Оценка:
Всем привет!

Есть закон тождества, гласящий, что x=x. Что очевидно и интуитивно и по другому быть не может.
И выражение x=x and y=1 можно смело сократить до y=1
Это вроде всё очевидно и интуитивно понятно.
Однако если это критерий для выборки из таблицы БД, то нет.
Так как если x=null, то по правилам операций в БД всё выражение становится null, что уже как-то очень странно.
Как же тогда тождество? И если null по сути — значение не известно, то сравнения с тем же самым "не известным" логично бы чтоб было true (в этом случае закон тождества не нарушается).
Если мы точно знаем что источник неизвестности один и тот же, то вполне ок считать что эти значения равны.
Вот если мы этого не знаем, тогда да, логично что результат выражения будет null.

Что за хня? почему так? какая за этим логика мотивирующая такое поведение (что нарушается закон тождества и нельзя делать такие упрощения выражений фильтров)?
Re: всегда ли x= x истинно?
От: Kaifa Россия  
Дата: 11.06.19 17:30
Оценка:
MH>Что за хня? почему так? какая за этим логика мотивирующая такое поведение (что нарушается закон тождества и нельзя делать такие упрощения выражений фильтров)?

select 
    case a
        when 1 then '111'
        when 2 then '222'
        when 3 then null    -- 3
        else null        -- 4
    end
from t


случаи 3 и 4 по твоему имеют сходную природу?
Re: всегда ли x= x истинно?
От: Джеффри  
Дата: 11.06.19 17:39
Оценка:
Здравствуйте, MadHuman, Вы писали:

MH>Что за хня? почему так? какая за этим логика мотивирующая такое поведение (что нарушается закон тождества и нельзя делать такие упрощения выражений фильтров)?


Потому что с появлением NULL — это уже трехзначная логика.

Можно заменить NULL на Неизвестное Значение и спросить каким должен быть результат операции "Неизвестное значение равно неизвестному значению?". Логично было бы ответить — неизвестно

Ну, или представить, что в обычной двухзначной логике выражение X = Y можно представить как !(X < Y) && !(X > Y). И если X и Н — это NULL (неизвестные значения), задать вопрос неизвестное значение меньше неизвестного значения? Очевидно, что неизвестно. Тоже и для оператора больше. Поэтому второе выражение должно иметь результат — неизвестно. И первое получается — тоже.

Даже, если представить, что NULL — это некое специальное значение, которое эквивалентно себе, но никогда неравно другим значениям (этого можно добиться, например, с помощью SET ANSI_NULLS OFF), то все равно комбинации операции сравнение не будут давать тот же результат, что и операция равно. Т.е. будут противоречия.
Re: всегда ли x= x истинно?
От: L.K. Марс  
Дата: 11.06.19 17:43
Оценка: +1
MH>И если null по сути — значение не известно

null — это абстрактное значение, введённое для того, чтобы его не путали с числами, строками, булевыми значениями и т.п. В ряде случаев null означает, что "значение не определено". Но далеко не во всех случаях.
Re[2]: всегда ли x= x истинно?
От: MadHuman Россия  
Дата: 11.06.19 18:29
Оценка: +1
Здравствуйте, Джеффри, Вы писали:


Д>Можно заменить NULL на Неизвестное Значение и спросить каким должен быть результат операции "Неизвестное значение равно неизвестному значению?". Логично было бы ответить — неизвестно

это зависит. если за x взять возрост конкретного человека, и он неизвестен (то есть представлен null-ом), то очевидно что в этом случае x=x истинно. как возрост человека не может быть равен его же возросту (даже если мы его не знаем)?

Д>Ну, или представить, что в обычной двухзначной логике выражение X = Y можно представить как !(X < Y) && !(X > Y). И если X и Н — это NULL (неизвестные значения), задать вопрос неизвестное значение меньше неизвестного значения? Очевидно, что неизвестно. Тоже и для оператора больше. Поэтому второе выражение должно иметь результат — неизвестно. И первое получается — тоже.

в случае "неизвестное значение меньше неизвестного значения?" результат — неизвестно — да, это очевидно. так как если нет никакой дополнительной информации о происхождении неизвестности мы действительно ничего не можем утверждать (больше значение или меньше), поэтому результат — неизвестно, вполне логичен.

Д>Даже, если представить, что NULL — это некое специальное значение, которое эквивалентно себе, но никогда неравно другим значениям (этого можно добиться, например, с помощью SET ANSI_NULLS OFF), то все равно комбинации операции сравнение не будут давать тот же результат, что и операция равно. Т.е. будут противоречия.

это не то. два разных null-а о происхождении которых мы не знаем, действительно мы не можем утверждать что это равные значения.
но когда это неизвестность из одного источника, то x=x можно и логично считать истинным.
Re[2]: всегда ли x= x истинно?
От: MadHuman Россия  
Дата: 11.06.19 18:32
Оценка:
Здравствуйте, L.K., Вы писали:

MH>>И если null по сути — значение не известно


LK>null — это абстрактное значение, введённое для того, чтобы его не путали с числами, строками, булевыми значениями и т.п. В ряде случаев null означает, что "значение не определено". Но далеко не во всех случаях.

это понятно.
непонятно как может закон тождества нарушаться. даже если вместо X мы подставляем это специальное абстрактное значение. в случае тождества это одно и тоже.
Re[3]: всегда ли x= x истинно?
От: Jack128  
Дата: 11.06.19 18:37
Оценка:
Здравствуйте, MadHuman, Вы писали:

MH>непонятно как может закон тождества нарушаться.


Тождество не может нарушаться по определению. Просто x = x не является тождеством в логике БД.
Re[2]: всегда ли x= x истинно?
От: MadHuman Россия  
Дата: 11.06.19 18:37
Оценка:
Здравствуйте, Kaifa, Вы писали:


K>
K>select 
K>    case a
K>        when 1 then '111'
K>        when 2 then '222'
K>        when 3 then null    -- 3
K>        else null        -- 4
K>    end
K>from t
K>


K>случаи 3 и 4 по твоему имеют сходную природу?

по моему нет. эти null-ы возникают в разных кэйсах и могут выражать разный смысл.
Re[3]: всегда ли x= x истинно?
От: Джеффри  
Дата: 11.06.19 20:03
Оценка:
Здравствуйте, MadHuman, Вы писали:

MH>это зависит. если за x взять возрост конкретного человека, и он неизвестен (то есть представлен null-ом), то очевидно что в этом случае x=x истинно. как возрост человека не может быть равен его же возросту (даже если мы его не знаем)?

MH>но когда это неизвестность из одного источника, то x=x можно и логично считать истинным.

А каким образом описать, что данные из одного источника? Нет, я понимаю, что в программировании можно перезагрузить оператор сравнения и сделать так, чтобы он проверял, например, равенство указателей, а не только значений. Но это уже за пределами математической логики... Можно, конечно, сказать, что если x — NULL, то x = x, тоже должно быть NULL. а вот если x = NULL и y = NULL, то x = y должно быть NULL. Но зачем так усложнять и что, например, делать с выражениями вроде x = x + 0.

Опять же SQL оперирует кортежами сущностей. Т.е. таблица людей и в ней есть атрибут возраст. В общем случае запросы будут выглядеть — выбрать людей с одинаковым возрастом или выбрать людей, у которых возраст равен заданному.
Re[4]: всегда ли x= x истинно?
От: MadHuman Россия  
Дата: 12.06.19 07:03
Оценка:
Здравствуйте, Джеффри, Вы писали:


Д>А каким образом описать, что данные из одного источника?

В случае тождества x=x, это видно.

Д>Нет, я понимаю, что в программировании можно перезагрузить оператор сравнения и сделать так, чтобы он проверял, например, равенство указателей, а не только значений. Но это уже за пределами математической логики... Можно, конечно, сказать, что если x — NULL, то x = x, тоже должно быть NULL. а вот если x = NULL и y = NULL, то x = y должно быть NULL. Но зачем так усложнять и что, например, делать с выражениями вроде x = x + 0.

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


Д>Опять же SQL оперирует кортежами сущностей. Т.е. таблица людей и в ней есть атрибут возраст. В общем случае запросы будут выглядеть — выбрать людей с одинаковым возрастом или выбрать людей, у которых возраст равен заданному.

Да, и что? в любом случае если сравнивается атрибут возрост конкретного человека со своим же возрастом, то по здравому смыслу очевидно что они равны и тождество соблюдено, даже если этот атрибут у этого конкретного человека null.
И конечно при выборке людей с заданным возрастом, очевидно что мы не можем включать в выборку людей у которых возрост не задан (=null).

Я понимаю что такое null в БД и зачем. Я не понимаю почему в условиях отбора x=x нельзя отбросить и такая добавка реально влияет на выборку (записи где x равен null не выбираются).
Re: всегда ли x= x истинно?
От: _ABC_  
Дата: 12.06.19 10:05
Оценка:
Здравствуйте, MadHuman, Вы писали:

MH>Что за хня? почему так?

Потому что в противном случае... нарушается закон тождества.
Закон тождества гласит, что каждое понятие должно сохранять своё однозначное значение на протяжении всего рассуждения. (А вовсе не что x=x).

Понятие "сравнение null с любым значением даёт результат null" по закону тождества не должно иметь исключения в виде "но если null выражен через переменную, то сравнение переменной самой с собой должно давать результат true".
Re[2]: всегда ли x= x истинно?
От: MadHuman Россия  
Дата: 12.06.19 11:32
Оценка:
Здравствуйте, _ABC_, Вы писали:

_AB>Потому что в противном случае... нарушается закон тождества.

_AB>Закон тождества гласит, что каждое понятие должно сохранять своё однозначное значение на протяжении всего рассуждения. (А вовсе не что x=x).
И в чем тут нарушение? если за Х принять например твой возрост, я его не знаю (придам значение null), и согласно "понятие должно сохранять своё однозначное значение" это понятие должно быть одинаково во всем рассуждении, а следовательно равно самому себе.
Re[5]: всегда ли x= x истинно?
От: wildwind Россия  
Дата: 12.06.19 12:13
Оценка:
Здравствуйте, MadHuman, Вы писали:

MH>Я не понимаю почему в условиях отбора x=x нельзя отбросить и такая добавка реально влияет на выборку (записи где x равен null не выбираются).


Навесь на поле x ограничение not null и можно будет отбросить (и продвинутая СУБД будет отбрасывать). Доволен?
Re[3]: всегда ли x= x истинно?
От: _ABC_  
Дата: 12.06.19 13:11
Оценка:
Здравствуйте, MadHuman, Вы писали:

MH>И в чем тут нарушение?

Ты читать умеешь?

Понятие "сравнение null с любым значением даёт результат null" по закону тождества не должно иметь исключения в виде "но если null выражен через переменную, то сравнение переменной самой с собой должно давать результат true".



MH>если за Х принять например твой возрост,

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

MH>я его не знаю (придам значение null), и согласно "понятие должно сохранять своё однозначное значение" это понятие должно быть одинаково во всем рассуждении, а следовательно равно самому себе.

Ты очень многое путаешь.
1. Возраст — это не понятие. Это признак объекта или его характеристика. А null применительно к возрасту — это параметр, конкретное значение из списка возможных этого признака или характеристики.
2. Понятие — это мысль, которая категоризирует или выделяет какие-либо объекты по каким-либо характеристикам в определенное множество, в класс, так сказать.

Вообще, мне стоило употребить слово "высказывание"/"суждение", а не "понятие", но давно я уже не освежал знания по формальной логике.
3. Суждение или высказывание — мысль, содержащая наличие или отсутствие связи между объектами и признаками.
Поэтому правильнее будет сформулировать так:

Суждение "сравнение null с любым значением даёт результат null" по закону тождества не должно иметь исключения в виде "но если null выражен через переменную, то сравнение переменной самой с собой должно давать результат true".

Re[6]: всегда ли x= x истинно?
От: MadHuman Россия  
Дата: 12.06.19 13:38
Оценка:
Здравствуйте, wildwind, Вы писали:


W>Навесь на поле x ограничение not null и можно будет отбросить (и продвинутая СУБД будет отбрасывать). Доволен?

нет. ты говориш очевидную вещь. вопрос не об этом.
Re: всегда ли x= x истинно?
От: · Великобритания  
Дата: 12.06.19 20:05
Оценка:
Здравствуйте, MadHuman, Вы писали:

MH> Если мы точно знаем что источник неизвестности один и тот же, то вполне ок считать что эти значения равны.

MH> Вот если мы этого не знаем, тогда да, логично что результат выражения будет null.
По-моему более понятно становится если null считать не неизвестностью, а отсутствием значения.
Тогда оно хорошо согласуется с тем, что left/right join даёт null в колонках при отсутствии записи в заджойненной таблице.
Тогда обычные булевы операции типа = <> становятся неприменимы, ибо нечего сравнивать — результат сравнения тоже отсутствует.
И никаких "источников неизвестности" не надо. Просто источник пуст.
Монада Maybe.
avalon/2.0.6
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: всегда ли x= x истинно?
От: Muxa  
Дата: 13.06.19 14:35
Оценка:
Д>>А каким образом описать, что данные из одного источника?
MH>В случае тождества x=x, это видно.
Погоди, а какой смысл сравнивать х и х? Ну, кроме как отбросить null, хотя для этого есть способ и получше.
Re[6]: всегда ли x= x истинно?
От: MadHuman Россия  
Дата: 13.06.19 15:16
Оценка:
Здравствуйте, Muxa, Вы писали:

M>Погоди, а какой смысл сравнивать х и х? Ну, кроме как отбросить null, хотя для этого есть способ и получше.

Есть определённый "упроститель" критериев отбора определяемых юзерами фильтров, он упрощает критерий прежде чем сгенерить sql для запроса в БД.
И возникла дилемма что делать с x=x

Конечно практического смысла руками осмысленно писать такой критерий в sql нет. Но он (x=x) может появиться после ряда упрощений исходного более сложного фильтра, либо в его части.
Re: всегда ли x= x истинно?
От: Ромашка Украина  
Дата: 13.06.19 17:26
Оценка:
Здравствуйте, MadHuman, Вы писали:
MH>Есть закон тождества, гласящий, что x=x. Что очевидно и интуитивно и по другому быть не может.
MH>И выражение x=x and y=1 можно смело сократить до y=1
MH>Это вроде всё очевидно и интуитивно понятно.

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

MH>Что за хня? почему так? какая за этим логика мотивирующая такое поведение (что нарушается закон тождества и нельзя делать такие упрощения выражений фильтров)?


Это нормально. Ничего не нарушается.


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[2]: всегда ли x= x истинно?
От: MadHuman Россия  
Дата: 13.06.19 19:33
Оценка:
Здравствуйте, Ромашка, Вы писали:

MH>>Что за хня? почему так? какая за этим логика мотивирующая такое поведение (что нарушается закон тождества и нельзя делать такие упрощения выражений фильтров)?


Р>Это нормально. Ничего не нарушается.

ну ок, допустим такое поведение ничего не нарушает. тогда допустим, что если поведение интуитивно (когда тождество x=x всегда истинно), то что нарушится?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.