Идентичность и эквивалентность
От: Аноним  
Дата: 25.12.05 16:39
Оценка:
в чем разница?

10.01.06 14:29: Перенесено модератором из 'Алгоритмы' — Кодт
Re: Идентичность и эквивалентность
От: raskin Россия  
Дата: 25.12.05 18:34
Оценка:
Аноним wrote:
> в чем разница?

Ну, скажем,

char * a = "ab";
char * b = "ab";
char * c = a;

Строки a и c идентичны, а a и b нет, но эквивалентны.

Хотя в зависимости от ситуации может быть и по-другому — смотря что надо.
Posted via RSDN NNTP Server 2.0
Re: Идентичность и эквивалентность
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.01.06 05:49
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>в чем разница?

Идентичность двух объектов означает что это один и тот же объект. Имеет смысл только при сравнении по ссылке. В ООП из идентичности следует невозможность послать сообщение только одному из двух идентичных объектов. Эквивалентность — то, что объекты находятся в одинаковом состоянии. При наличии инкапсуляции состояние напрямую определить невозможно, поэтому эквивалентность гарантирует одинаковое поведение обоих объектов при получении одинаковых сообщений.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Возможно, имеет смысл...
От: Аноним  
Дата: 04.01.06 10:57
Оценка: +1
... сравнить ваше понимание этих понятий с их значением, например, в математике (где идентичность — совпадение, а эквивалентность — какое угодно отношение, удовлетворяющее трём известным условиям)...
Re: Идентичность и эквивалентность
От: mefrill Россия  
Дата: 04.01.06 12:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>в чем разница?


В математике идентичность объектов есть их совпадение, а эквивалентность — это пример абстакции, когда мы считаем эквивалентными какие-то множества объектов на основе некоторых признаков, присущих этим объектам. Более обще, мы вводим отношение на множестве этих объектов и это отношение должно удовлетворять трем свойствам, чтобы выделенные нами множества эквивалентных объектов не пересекались между собой: рефлексивность, когда объекты эквивалентны друг другу, симметричность, когда если первый объект эквивалентен второму, то и верно обратное, т.е. что второй объект эквивалентен первому, и тразитивность — когда a эквивалентен b, а b эквивалентен c, то a эквивалентен c. Тогда мы как бы склеиваем множества объектов в один большой объект, называемый типом этих объектов. В программирвоании такие отношения эквивалентности встречаются часто. Интересный пример — это структуры поиска. Имеем две структуры поиска: хеш-таблицу и бинарное дерево. В хеш-таблице для сравнения объектов используется оператор сравнения "==". Это ни что иное, как идентичность. Два объекта считаются идентичными, если они равны (через оператор сравнения). А есть еще оператор "<". Два объекта a и b считаются эквивалентными, если a < b и b < a. Рассматривая оператор "<" как отношение на множестве объектов, мы добиваемся, чтобы это отношение было антисимметричным, т.е. склеиваем симметричные объекты в один.
Re[2]: Идентичность и эквивалентность
От: Кодт Россия  
Дата: 06.01.06 11:25
Оценка:
Здравствуйте, mefrill, Вы писали:

M>В математике идентичность объектов есть их совпадение, а эквивалентность — это пример абстакции, когда мы считаем эквивалентными какие-то множества объектов на основе некоторых признаков, присущих этим объектам. Более обще, мы вводим отношение на множестве этих объектов и это отношение должно удовлетворять трем свойствам, чтобы выделенные нами множества эквивалентных объектов не пересекались между собой: рефлексивность, когда объекты эквивалентны друг другу, симметричность, когда если первый объект эквивалентен второму, то и верно обратное, т.е. что второй объект эквивалентен первому, и тразитивность — когда a эквивалентен b, а b эквивалентен c, то a эквивалентен c. Тогда мы как бы склеиваем множества объектов в один большой объект, называемый типом этих объектов.


Этот большой объект называется не типом, а классом эквивалентности.
Причём, поскольку можно ввести разные отношения эквивалентности над пространством объектов (например, сравнение строк с учётом и без учёта регистра; подсчёт контрольной суммы строки по CRC16 и CRC32), то и разбиение пространства на классы эквивалентности получится разным.

M>В программирвоании такие отношения эквивалентности встречаются часто. Интересный пример — это структуры поиска. Имеем две структуры поиска: хеш-таблицу и бинарное дерево.

M>В хеш-таблице для сравнения объектов используется оператор сравнения "==". Это ни что иное, как идентичность. Два объекта считаются идентичными, если они равны (через оператор сравнения). А есть еще оператор "<". Два объекта a и b считаются эквивалентными, если a < b и b < a. Рассматривая оператор "<" как отношение на множестве объектов, мы добиваемся, чтобы это отношение было антисимметричным, т.е. склеиваем симметричные объекты в один.

А вот это уже ерунда.
Оператор == вводит отношение эквивалентности. Кстати говоря, для хеш-таблицы необязательно, чтобы эквивалентность была именно через operator==, можно и через произвольный предикат E, удовлетворяющий аксиоматике (рефлексивность E(a,a)=true, симметричность E(a,b)=E(b,a), транзитивность E(a,b)&E(b,c)=E(a,c)).
Кстати говоря, в хеш-таблице используются сразу два отношения эквивалентности: грубое C(a,b) (через равенство значений хеш-функции) и точное E(a,b). Причём требуется, чтобы точное было строже грубого, т.е. E(a,b) -> C(a,b) == (h(a)==h(b)).

Оператор < вводит отношение строгого порядка. Его аксиоматика:
— антирефлексивность P(a,a) = false
— антисимметричность P(a,b) = !P(b,a)
— транзитивность P(a,b)&P(b,c) = P(a,c)
Если такое отношение существует, то можно определить эквивалентность через него: E(a,b) = !P(a,b) & !P(b,a).

Очевидно, что идентичность I(a,a)=true, I(a,b)=false во всех остальных случаях, является частным (самым узким) случаем эквивалентности.




С точки зрения ООП, как уже сказал Sinclair, идентичность означает совпадение ссылок.
Если два объекта идентичны, то они неразличимы
— их состояния всегда совпадают
— их поведение всегда совпадает
— изменение состояния первого приводит к точно такому же изменению второго
— их системные идентификаторы (указатели, хендлы, имена в реестре и т.п.) эквивалентны

В принципе, можно создать сущность, которая будет представлена множеством когерентных частей. Например, массив веб-серверов, доступ к которым (через балансировщика нагрузки или через грамотно разломаный DNS) происходит по одному и тому же URL'у.
Но это, скорее, из разряда извращений. Чаще встаёт задача — устранить ложную неидентичность (один и тот же объект может быть доступен через разные идентификаторы — например, при множественном наследовании, при расщеплении хендлов и т.п.)
То есть, нужно ввести такое отношение эквивалентности над системными идентификаторами, которому соответствует идентичность указуемых объектов.
В COM для этого используется запрос интерфейса IUnknown (тем самым, компенсируется множественное наследование, агрегирование и учитываются прокси).
Перекуём баги на фичи!
Re[3]: Идентичность и эквивалентность
От: mefrill Россия  
Дата: 07.01.06 08:38
Оценка:
Здравствуйте, Кодт, Вы писали:

К>А вот это уже ерунда.

К>Оператор == вводит отношение эквивалентности. Кстати говоря, для хеш-таблицы необязательно, чтобы эквивалентность была именно через operator==, можно и через произвольный предикат E, удовлетворяющий аксиоматике (рефлексивность E(a,a)=true, симметричность E(a,b)=E(b,a), транзитивность E(a,b)&E(b,c)=E(a,c)).

Совсем непонятно. В чем состоит смысл эквивалентности? Ну ясно, эквивалентность всегда подразумевает наличие хотя бы двух объектов. Т.е. чтобы делать нечто эквивалентными нам надо иметь это нечто и не в единственном экземпляре. Идентичность в нашем, достаточно узком смысле, требует наличия только одного объекта. В русском языке есть два значения слова идентичность. Первое значение касается сравнения двух объектов, а второе выделяет данный объект среди других, как-бы отличает его от остальных. Вот я имел ввиду как раз второе значение. В этом смысле, когда мы говорим об идентичности, мы имеем ввиду, что существует только один объект с заданными свойствами, т.е. уникальный объект. А в случае эквивалентности мы неявно подразумеваем, что существует несколько объектов, не идентичных друг другу, но некоторые, важные для нас, свойства которых совпадают.

К>Кстати говоря, в хеш-таблице используются сразу два отношения эквивалентности: грубое C(a,b) (через равенство значений хеш-функции) и точное E(a,b). Причём требуется, чтобы точное было строже грубого, т.е. E(a,b) -> C(a,b) == (h(a)==h(b)).


Ага, только вполне можно сконструировать из этих двух вычислимых функций их композицию, которая и будет выделять этот самый объект среди множества, хранящегося в хеш-таблице. Заметим, что в хеш-таблице возможно хранение только одного объекта с заданными свойствами, т.е. мы имеем идентичность в чистом виде. В бинарном дереве с отношением эквивалентности R, заданным следующим утверждением: "aRb <==> a < b И b < a" мы можем иметь несколько эквивалентных но, вообще говоря, отличающихся объектов.

К>Оператор < вводит отношение строгого порядка. Его аксиоматика:

К>- антирефлексивность P(a,a) = false
К>- антисимметричность P(a,b) = !P(b,a)
К>- транзитивность P(a,b)&P(b,c) = P(a,c)
К>Если такое отношение существует, то можно определить эквивалентность через него: E(a,b) = !P(a,b) & !P(b,a).

Совершенно верно. Теперь, используя механизм факторизации мы "склеиваем" все эквивалентные друг другу объекты в один. И тогда получаем идентичность.

К>Очевидно, что идентичность I(a,a)=true, I(a,b)=false во всех остальных случаях, является частным (самым узким) случаем эквивалентности.


Да, конечно.
Re[4]: Идентичность и эквивалентность
От: Кодт Россия  
Дата: 07.01.06 15:01
Оценка:
Здравствуйте, mefrill, Вы писали:

M>Здравствуйте, Кодт, Вы писали:


К>>А вот это уже ерунда.

К>>Оператор == вводит отношение эквивалентности. Кстати говоря, для хеш-таблицы необязательно, чтобы эквивалентность была именно через operator==, можно и через произвольный предикат E, удовлетворяющий аксиоматике (рефлексивность E(a,a)=true, симметричность E(a,b)=E(b,a), транзитивность E(a,b)&E(b,c)=E(a,c)).

M>Совсем непонятно. В чем состоит смысл эквивалентности? Ну ясно, эквивалентность всегда подразумевает наличие хотя бы двух объектов. Т.е. чтобы делать нечто эквивалентными нам надо иметь это нечто и не в единственном экземпляре. Идентичность в нашем, достаточно узком смысле, требует наличия только одного объекта. В русском языке есть два значения слова идентичность. Первое значение касается сравнения двух объектов, а второе выделяет данный объект среди других, как-бы отличает его от остальных. Вот я имел ввиду как раз второе значение. В этом смысле, когда мы говорим об идентичности, мы имеем ввиду, что существует только один объект с заданными свойствами, т.е. уникальный объект. А в случае эквивалентности мы неявно подразумеваем, что существует несколько объектов, не идентичных друг другу, но некоторые, важные для нас, свойства которых совпадают.


Есть несколько отношений, удовлетворящих аксиоматике эквивалентности.

  • Идентичность предполагает равенство ссылок. DIXI. Если это один и тот же объект — true. Если два объекта — false.

  • Следом за ней идёт отношение равенства — два объекта равны, если их состояние и поведение полностью совпадают (но необязательно они идентичны).
    Например, равны все литералы и константы с одинаковым значением, 123 == 123 где бы и как бы не были получены эти значения (константы времени компиляции, хоть выражения, вычисляемые во время работы)

  • И наконец, есть разнообразные пользовательские отношения эквивалентности — например,
    — равенство целых чисел в кольце по модулю
    — равенство чисел по абсолютной величине
    — равенство строк без учёта регистра
    и т.п.

    Как правило (хотя и необязательно) оператор == вводит отношение равенства.

    Очевидно, что I(x,y) -> E(x,y).
    Если пользовательское отношение U(x,y) не сравнивает адреса объектов/подобъектов, то E(x,y) -> U(x,y).

    К>>Кстати говоря, в хеш-таблице используются сразу два отношения эквивалентности: грубое C(a,b) (через равенство значений хеш-функции) и точное E(a,b). Причём требуется, чтобы точное было строже грубого, т.е. E(a,b) -> C(a,b) == (h(a)==h(b)).


    M>Ага, только вполне можно сконструировать из этих двух вычислимых функций их композицию, которая и будет выделять этот самый объект среди множества, хранящегося в хеш-таблице. Заметим, что в хеш-таблице возможно хранение только одного объекта с заданными свойствами, т.е. мы имеем идентичность в чистом виде. В бинарном дереве с отношением эквивалентности R, заданным следующим утверждением: "aRb <==> a < b И b < a" мы можем иметь несколько эквивалентных но, вообще говоря, отличающихся объектов.


    Смысла нет конструировать композицию. Поскольку E(a,b)->C(a,b), то E(a,b)&C(a,b) = E(a,b), то есть, композиция и есть заявленное отношение.
    А если E->C не тождественно, т.е. существуют x,y : E(x,y) & !C(x,y) — то хеш-таблица будет врать.

    Кроме того, контейнеры значений вообще не имеют дела с идентичностью! Они не должны различать между собой копии одного объекта.

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

    Например, первый контейнер учитывает равенство по модулю 3, другой — равенство по модулю 5.
    Пихаем туда 0, 1, 3, 5, 1, 13
    mod3    mod5
                    <- 0
    0       0       <- 1
    0 1     0 1     <- 3  mod3 сообщил о конфликте (3 == 0 mod 3) (и допустим, мы совершили запись поверх)
    1 3     0 1 3   <- 5  mod5 сообщил о конфликте (5 == 0 mod 5)
    1 3 5   1 3 5   <- 1  оба сообщили о конфликте - и действительно, "1" уже есть
    1 3 5   1 3 5   <- 13 оба сообщили о конфликте (13==1 mod 3, 13==3 mod 5)
    3 5 13  1 5 13

    А каким способом вёлся поиск — по хеш-значениям, последовательным перебором, двоичным поиском в массиве, поиском в N-арном B±дереве — никакого значения не имеет.

    К>>Оператор < вводит отношение строгого порядка. Его аксиоматика:

    К>>- антирефлексивность P(a,a) = false
    К>>- антисимметричность P(a,b) = !P(b,a)
    К>>- транзитивность P(a,b)&P(b,c) = P(a,c)
    К>>Если такое отношение существует, то можно определить эквивалентность через него: E(a,b) = !P(a,b) & !P(b,a).

    M>Совершенно верно. Теперь, используя механизм факторизации мы "склеиваем" все эквивалентные друг другу объекты в один. И тогда получаем идентичность.


    Объекты не склеиваются! Они существуют каждый сам по себе, и в других местах к ним могут применяться другие эквивалентности.
  • Перекуём баги на фичи!
    Re[5]: Идентичность и эквивалентность
    От: mefrill Россия  
    Дата: 10.01.06 09:05
    Оценка:
    Здравствуйте, Кодт, Вы писали:

    К>Есть несколько отношений, удовлетворящих аксиоматике эквивалентности.

    К>
  • Идентичность предполагает равенство ссылок. DIXI. Если это один и тот же объект — true. Если два объекта — false.
    К>
  • Следом за ней идёт отношение равенства — два объекта равны, если их состояние и поведение полностью совпадают (но необязательно они идентичны).
    К>Например, равны все литералы и константы с одинаковым значением, 123 == 123 где бы и как бы не были получены эти значения (константы времени компиляции, хоть выражения, вычисляемые во время работы)
    К>
  • И наконец, есть разнообразные пользовательские отношения эквивалентности — например,
    К>- равенство целых чисел в кольце по модулю
    К>- равенство чисел по абсолютной величине
    К>- равенство строк без учёта регистра
    К>и т.п.
    К>Как правило (хотя и необязательно) оператор == вводит отношение равенства.
    К>Очевидно, что I(x,y) -> E(x,y).
    К>Если пользовательское отношение U(x,y) не сравнивает адреса объектов/подобъектов, то E(x,y) -> U(x,y).

    Я имел ввиду несколько более широкую интерпретацию понятия отношения. Как это делается в математике, не только в программировании. В математике любое отношение, удовлетворяющее трем свойствам, которые здесь неоднократно описывались, является отношением эквивалентности. Но только этим определением понятие отношения, естественно, не исчерпывается. Для понимания того, что такое в математике есть отношение необходимо еще выяснить механизмы, которые используют это понятие. В математике основным механизмом такого вида является механизм факторизации. Его сущность есть математическое выражение свойства нашего разума — способности к абстрагированию, т.е. выделении из многих объектов нескольких "с одними и теми же" признаками или свойствами и последующем образовании нового идеального объекта — понятия, описывающего данное множество оъектов. Я такой объект называю типом. В математике есть даже специальная теория типов. Придумал ее Бертран Рассел для разрешения своих парадоксов наивной теории множеств. В диалектике этот способ человеческого мировидения считается вполне объективным и считается главной формой ее эволюционного развития. Это так называемый переход количества в качество. В математике это образование из множества констант переменной, которая может принимать значения на этом множестве. Даже есть специальный анализ, построенный на этом принципе, называется нестандартный анализ Робинсона. На каком основании мы обозначаем множества разных объектов (констант) одной переменной? Мы выделяем в объектах некоторое количество общих признаков-свойств, а затем объявляем объекты, удовлетворяющие этим свойствам, эквивалентными. Склеивание, т.е. факторизация объектов в один, и есть тот самый переход количества в качество, т.е. образование типа объектов, которое в тексте (программы или другого формального языка) мы обозначаем переменной данного типа. Это что касается эквивалентности. Идентичность как бы противополжна эквивалентности по ее применению в математике. Если эквивалентность используется для объединения объектов на основании каких-то признаков, то идентичность наоборот, выделяет объект из этого множества, т.е. отделяет его от остальных. Каким-же образом это происходит в тексте программы? Как нам выделить объект из множества других? Да как угодно, мы здесь вольны делать все что хотим. Главное, чтобы была определена некоторая вычислимая процедура сравнения, т.е. одноместный предикат, который дает истину только на одном объекте, т.е. эквивалентен нульарной операции выделения константы — данного объекта из множества других. Как мы можем определить эквивалентность в тексте программы? Точно также, как душе угодно. В этом смысле оператор сравнения может быть использован и для идентичности и для эквивалентности. В языке си реализация по умолчанию является определением идентичности объекта, т.е. его выделения из множества констант программы того же типа. Но в си++ мы можем переопределить операцию сравнения для данного типа таким образом, чтобы она использовалась для эквивалентности. Например, сделать сравнение мо модулю 5 для целых чисел. Пример с бинарным деревом поиска и хеш-таблицей я привел только для иллюстрации того, что я написал выше. Но этот пример также и являетс классическим. Ведь, если положить что два объекта эквивалентны друг другу, если одновременно один меньше другого и другой меньше первого, то мы будем иметь в бинарном дереве поиска несколько в нашем смысле эквивалентных, но вообще говоря, отличающихся друг от друга объектов. Этой ситуации не может случиться в поисковой структуре под названием хеш-таблица, если мы используем операцию сравнения в ее значении по умолчанию. Т.е. там всегда храниться один объект с данным свойством (выделенном операцией сравнения).

    К>Смысла нет конструировать композицию. Поскольку E(a,b)->C(a,b), то E(a,b)&C(a,b) = E(a,b), то есть, композиция и есть заявленное отношение.

    К>А если E->C не тождественно, т.е. существуют x,y : E(x,y) & !C(x,y) — то хеш-таблица будет врать.
    К>Кроме того, контейнеры значений вообще не имеют дела с идентичностью! Они не должны различать между собой копии одного объекта.
    К>Попробуй абстрагироваться от внутреннего устройства ассоциативных контейнеров. Вообрази, как могут работать два контейнера с разными отношениями, когда в них последовательно пихают один и тот же набор объектов. Понятно, что они могут выдавать отказ "похожий (т.е. эквивалентный) объект уже вставлен", причём на разных объектах этого набора.
    К>Например, первый контейнер учитывает равенство по модулю 3, другой — равенство по модулю 5.
    К>Пихаем туда 0, 1, 3, 5, 1, 13
    К>
    К>mod3    mod5
    К>                <- 0
    К>0       0       <- 1
    К>0 1     0 1     <- 3  mod3 сообщил о конфликте (3 == 0 mod 3) (и допустим, мы совершили запись поверх)
    К>1 3     0 1 3   <- 5  mod5 сообщил о конфликте (5 == 0 mod 5)
    К>1 3 5   1 3 5   <- 1  оба сообщили о конфликте - и действительно, "1" уже есть
    К>1 3 5   1 3 5   <- 13 оба сообщили о конфликте (13==1 mod 3, 13==3 mod 5)
    К>3 5 13  1 5 13
    К>

    К>А каким способом вёлся поиск — по хеш-значениям, последовательным перебором, двоичным поиском в массиве, поиском в N-арном B±дереве — никакого значения не имеет.

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

    К>Объекты не склеиваются! Они существуют каждый сам по себе, и в других местах к ним могут применяться другие эквивалентности.


    Что я подразумевал под склеиванием я написал выше.
  • Re[6]: Идентичность и эквивалентность
    От: Кодт Россия  
    Дата: 10.01.06 11:28
    Оценка:
    Здравствуйте, mefrill, Вы писали:

    M>Я имел ввиду несколько более широкую интерпретацию понятия отношения. Как это делается в математике, не только в программировании.


    В математике объекты иммутабельны и литеральны, т.е. сами себя идентифицируют. Поэтому равенство (equality, не equivalence) и идентичность (identity) в ООП-трактовке — тождественны.
    В программировании на языках, где объекты мутабельны — идентичность не тождественна равенству (два объекта, равные в настоящий момент, могут рассогласоваться в дальнейшем). И даже если они иммутабельны, свойство идентичности применяется как ускорение для вычисления равенства.

    M>В математике любое отношение, удовлетворяющее трем свойствам, которые здесь неоднократно описывались, является отношением эквивалентности. Но только этим определением понятие отношения, естественно, не исчерпывается. Для понимания того, что такое в математике есть отношение необходимо еще выяснить механизмы, которые используют это понятие. В математике основным механизмом такого вида является механизм факторизации. Его сущность есть математическое выражение свойства нашего разума — способности к абстрагированию, т.е. выделении из многих объектов нескольких "с одними и теми же" признаками или свойствами и последующем образовании нового идеального объекта — понятия, описывающего данное множество оъектов. Я такой объект называю типом. В математике есть даже специальная теория типов. Придумал ее Бертран Рассел для разрешения своих парадоксов наивной теории множеств. В диалектике этот способ человеческого мировидения считается вполне объективным и считается главной формой ее эволюционного развития. Это так называемый переход количества в качество. В математике это образование из множества констант переменной, которая может принимать значения на этом множестве. Даже есть специальный анализ, построенный на этом принципе, называется нестандартный анализ Робинсона. На каком основании мы обозначаем множества разных объектов (констант) одной переменной? Мы выделяем в объектах некоторое количество общих признаков-свойств, а затем объявляем объекты, удовлетворяющие этим свойствам, эквивалентными. Склеивание, т.е. факторизация объектов в один, и есть тот самый переход количества в качество, т.е. образование типа объектов, которое в тексте (программы или другого формального языка) мы обозначаем переменной данного типа. Это что касается эквивалентности. Идентичность как бы противополжна эквивалентности по ее применению в математике. Если эквивалентность используется для объединения объектов на основании каких-то признаков, то идентичность наоборот, выделяет объект из этого множества, т.е. отделяет его от остальных. Каким-же образом это происходит в тексте программы? Как нам выделить объект из множества других? Да как угодно, мы здесь вольны делать все что хотим. Главное, чтобы была определена некоторая вычислимая процедура сравнения, т.е. одноместный предикат, который дает истину только на одном объекте, т.е. эквивалентен нульарной операции выделения константы — данного объекта из множества других. Как мы можем определить эквивалентность в тексте программы? Точно также, как душе угодно. В этом смысле оператор сравнения может быть использован и для идентичности и для эквивалентности. В языке си реализация по умолчанию является определением идентичности объекта, т.е. его выделения из множества констант программы того же типа. Но в си++ мы можем переопределить операцию сравнения для данного типа таким образом, чтобы она использовалась для эквивалентности. Например, сделать сравнение мо модулю 5 для целых чисел.


    Всё-таки мой ум противится тому, чтобы называть классы эквивалентности — типами. Разнотипные объекты нельзя перемешивать (складывать апельсины и километры), а однотипные из разных классов эквивалентности — пожалуйста. Например, модулярная арифметика.

    M>Пример с бинарным деревом поиска и хеш-таблицей я привел только для иллюстрации того, что я написал выше. Но этот пример также и являетс классическим. Ведь, если положить что два объекта эквивалентны друг другу, если одновременно один меньше другого и другой меньше первого, то мы будем иметь в бинарном дереве поиска несколько в нашем смысле эквивалентных, но вообще говоря, отличающихся друг от друга объектов. Этой ситуации не может случиться в поисковой структуре под названием хеш-таблица, если мы используем операцию сравнения в ее значении по умолчанию. Т.е. там всегда храниться один объект с данным свойством (выделенном операцией сравнения).


    Пожалуйста, не смешивай в одну кучу множества и мультимножества.
    Не имеет значения, какой именно контейнер — дерево, хеш-таблица, линейный список (вырожденный случай хеш-таблицы, где h(x)==Const, но Eq(x,y)=!=true).
    И там, и там можно хранить как единственный объект из его класса эквивалентности, так и несколько объектов (обычно идущих подряд).
    Например, неупорядоченный линейный список является случаем и дерева (несбалансированного), и хеш-таблицы, — мультимножество для вырожденного отношения DummyEq(x,y)==true или, соответственно, DummyOrder(x,y)==false.

    К>>Объекты не склеиваются! Они существуют каждый сам по себе, и в других местах к ним могут применяться другие эквивалентности.


    M>Что я подразумевал под склеиванием я написал выше.


    Склеивать можно математические сущности — но не объекты в программе. Зачем устраивать путаницу
    Перекуём баги на фичи!
    Re: Идентичность и эквивалентность
    От: dreamer57 Россия http://uss-spb.com
    Дата: 10.01.06 11:36
    Оценка:
    Здравствуйте, Аноним, Вы писали:

    А>в чем разница?


    Идентичность — соответствие и структуры, и функциональности.
    А вот эквивалентность — соответствие лишь функциональности, а структура может быть различной (можно сказать, что эквивалентность сходна с изоморфизмом).
    There are peoples and there are gods... Or there isn't anybody?..
    Re[7]: Идентичность и эквивалентность
    От: mefrill Россия  
    Дата: 12.01.06 10:22
    Оценка:
    Здравствуйте, Кодт, Вы писали:

    К>В математике объекты иммутабельны и литеральны, т.е. сами себя идентифицируют. Поэтому равенство (equality, не equivalence) и идентичность (identity) в ООП-трактовке — тождественны.


    Полагаю, что термином "иммутабельный" обозначается объект, который может менять значение? Если так, то:

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

    Вообще, ты здесь, мне кажется, смешиваешь понятия. Ты рассматриваешь понятие объекта узко, с точки зрения программирования. А в программировании объект — это прежде всего элемент некоего процесса вычисления. Поэтому и слово это "иммутабельный" можно к объекту применять. На чем основано понятие "процесса"? На очень важной вещи — причинно-следственной связи между событиями. В различных парадигмах вычисления эти события трактуются по разному, но обозначют по сути одно и тоже. В тьюринговской схеме мы имеем понятие состояния, в теории рекурсивных фукнуий — это вызов функции с конкретным набором параметров, в нормальных алгоритмах Маркова — это уже операция подстановки. В любом случае, здесь неявно присутствует понятие времени, где события разделены в рамках некоторого процесса. В математике такого процесса вообще говоря нет, т.е. он необязателен. Что там обязательно — это большой и отдельный вопрос, корым занимается специальная наук: основания математики. Например, структуралисты стоят на позиции, что математика изучает структуры, или структуры моделей, если более кокретно. Например, такой подход применяет Бурбаки. Есть различные точки зрения на то, что такое математический объект, т.е. объект нашего мышления в математических экспериментах. Здесь тоже есть много подходов. Классически, основным понятием, которое изучает математика, является понятие пространства как некотрой структурированной протяженности. Существует два базовых подхода, различающиеся в том, как можно изучать пространство. Подход "снизу-вверх" предлагает структурировать пространство, т.е. разложить его на элементы, затем те элементы на более простые и т.д. пока не дойдем до предела. Этот предел у греков назывался атомом, а у на современном языке он называется элементом множества. Пространство строится из плоскостей, те — из линий, которые, в свою очередь, строятся из точек. Т.е. мы идем как-бы снизу вверх в определении понятия пространства. А есть другой подход — "сверху-вниз". Здесь мы имеем пространство как таковое и не сруктурируем его совсем. Все характеристики пространства описываются в виде "внешних" свойств. В этом случае, мы имеем "неделимые" объекты (а можем их совсем не иметь, в данном случае понятие объекта совсем не важно) и разные отношения между ними. причем отношения эти всегда должны удовлетворять определенным законам. Такой подход используется в теории категорий. Но, в обоих подходах есть базовая операция, называемая факторизацией. Это диалектический переход количества в качество. Из констант мы образуем переменную. Но переменная всегда подразумевает, что есть множество элементов-значений, которые эта переменная может принимать. Это множество в математике называется типом перменной. объект в программировании это объект в обычном математическом смысле. Он может быть константой, а может быть и переменной. И тогда он принимает значения различных констант в процессе вычисления. Т.е. это та самая пременная в языке первого порядка, о которой мы говорили выше.

    К>В программировании на языках, где объекты мутабельны — идентичность не тождественна равенству (два объекта, равные в настоящий момент, могут рассогласоваться в дальнейшем). И даже если они иммутабельны, свойство идентичности применяется как ускорение для вычисления равенства.


    Что такое "свойство идентичности"? Идентичность, как я уже писал выше, в русском языке имеет два значения. Первое значени обозначет равенство двух или более объектов (т.е. это просто синоним равенства), а второе — уникальность данного объекта, его отличие от любого другого. Какое значение ты используешь? Я всегда использую второе значение.

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

    К>Всё-таки мой ум противится тому, чтобы называть классы эквивалентности — типами. Разнотипные объекты нельзя перемешивать (складывать апельсины и километры), а однотипные из разных классов эквивалентности — пожалуйста. Например, модулярная арифметика.


    Не уверен, что точно понял термин "модулярная арифметика". Это арифметика классов вычетов по модулю? Если да, то здесь все как раз именно так — объекты склеиваются! Мы строим отношение эквивалентности на множестве целых чисел и образуем классы эквивалентности (классы вычетов). Затем строим отображение в специальный объект — группу классов вычетов. Эта группа строится уже не на множестве целых чисел, а на "абстрактном" множестве из конечного числа элементов, на котором определена операция "плюс" (если мы рассматриваем поле целых как адитивную группу). Эта группа изоморфна нашему множеству целых с адитивной операцией, где некоторые элементы объявлены эквивалентными. Таким образом, мы имеем в чистом виде операцию построения отношения эквивалентности (строим классы вычетов по модулю), затем факторизации (изоморфизам в группу вычетов). Т.е. есть типичный математический процесс абстракции: построение отношения эквивалентности с последующей факторизацией. Далее, мы можем провести дальнейшую факторизацию путем склеивания всех конечных групп с данной структурой в одну "универсальную" группу с данными свойствами. Это вполне законно и основано на теореме Келли. Она гласит, что любая конечная группа из n элементов изоморфна некотрой подгруппе группы подстановок, состоящей из n элементов. т.е. мы строим изоморвное отображение нашей группы классов вычетов в группу подстановок. Иначе говоря, строим отношение эквивалентности на множестве всех групп и затем проводим факторизацию на сонове классов эквивалентности. Для каждой конечной группы мы имеем своего представителя, т.е. тип всех таких групп. Значит Галуа, когда он эксперементировал с корнями полиномов и строил свою теорию этих корней, на самом деле работал со всеми конечными группами, которые только придумали за следующие 150 лет! Это типичный пример того, как развивается математическая теория, от частного к общему с последующим превращением этого общего в новое честное. Если рассматривать общее и частное как противоположности, то здесь мы имеем в чистом виде гегелевский принцип отрицания отрицания.

    К>Склеивать можно математические сущности — но не объекты в программе. Зачем устраивать путаницу


    Переменная некоторого типа и есть на самом деле такое склеивание. Мы оперируем с множеством констант к с единой программной сущностью — объектом типа. Это в чистом виде механизм эквивалентность-факторизация, разве нет? Конечно, в современных языках нет (или я ошибаюсь?) такого механизма "динамического типизирования" — это прерогатива человека. Но уверен, в будещем такие языки обязательно появяться. Напрмиер в ВИНИТИ Финн и Аншуков придумали механизм образования новых типов по образцу, предложенному еще Миллем, метод так и называн, по его имени — ДСМ-метод. Или data mining, тот же процесс нахождения типов на основе множеств констант с определенными свойствами-признаками. Как только хороший алгоритм этого механизма будем найден, уверен, что он обязательно появится в языках программирования.
    Re[8]: Идентичность и эквивалентность
    От: Кодт Россия  
    Дата: 12.01.06 11:14
    Оценка:
    Здравствуйте, mefrill, Вы писали:

    К>>В математике объекты иммутабельны и литеральны, т.е. сами себя идентифицируют. Поэтому равенство (equality, не equivalence) и идентичность (identity) в ООП-трактовке — тождественны.


    M>Полагаю, что термином "иммутабельный" обозначается объект, который может менять значение? Если так, то:


    Который НЕ может менять значение.

    К>>В программировании на языках, где объекты мутабельны — идентичность не тождественна равенству (два объекта, равные в настоящий момент, могут рассогласоваться в дальнейшем). И даже если они иммутабельны, свойство идентичности применяется как ускорение для вычисления равенства.


    M>Что такое "свойство идентичности"? Идентичность, как я уже писал выше, в русском языке имеет два значения. Первое значени обозначет равенство двух или более объектов (т.е. это просто синоним равенства), а второе — уникальность данного объекта, его отличие от любого другого. Какое значение ты используешь? Я всегда использую второе значение.


    Ещё раз повторю. В математике, где объекты неизменны и литеральны — уникальность и равенство тождественны.

    Любую переменную можно представить как объект "функция времени": x(t).
    Равенство по-программистски означает равенство значений на некоторой части времени. All t in T, x(t)==y(t)
    Идентичность же означает, как минимум, равенство объектов целиком: x==y <=> All t, x(t)=y(t). Назовём это свойство когерентностью.

    Видишь, сама "функция времени" от времени не зависит. Это к вопросу о неизменности (иммутабельности).

    Помимо когерентности, есть ещё один фактор: идентификация. По сути, функция места.
    В математике объекты литеральны. 1 невозможно отличить от 1, где бы мы эти единицы ни записали и как бы их не получили.
    А в программировании во многих языках можно различать объекты по месту их расположения.

    Так вот, идентичность — это равенство функций времени и места, а не только функций времени, и уж тем более не только отдельных значений.

    Пример того, как два физически различных объекта могут быть идентичными для пользователя: массив веб-серверов. Параметр места — это URL.



    На самом деле, спор бестолковый получается.
    В программировании есть уже определённое отношение "идентичность", и выдумывать велосипед не только бессмысленно, но и вредно. Зачем устраивать терминологическую путаницу. А то давайте ещё затеем флейм, почему std::vector не имеет отношения к векторному пространству.
    Перекуём баги на фичи!
    Re[8]: Идентичность и эквивалентность
    От: Кодт Россия  
    Дата: 12.01.06 11:17
    Оценка:
    Здравствуйте, mefrill, Вы писали:

    M>Переменная некоторого типа и есть на самом деле такое склеивание. Мы оперируем с множеством констант к с единой программной сущностью — объектом типа. Это в чистом виде механизм эквивалентность-факторизация, разве нет? Конечно, в современных языках нет (или я ошибаюсь?) такого механизма "динамического типизирования" — это прерогатива человека. Но уверен, в будещем такие языки обязательно появяться. Напрмиер в ВИНИТИ Финн и Аншуков придумали механизм образования новых типов по образцу, предложенному еще Миллем, метод так и называн, по его имени — ДСМ-метод. Или data mining, тот же процесс нахождения типов на основе множеств констант с определенными свойствами-признаками. Как только хороший алгоритм этого механизма будем найден, уверен, что он обязательно появится в языках программирования.


    Переменная — это функция времени. Естественно, у неё есть область значений (тип). Но на одной области значений может быть определено много разных функций. И склеивать их — сомнительное дело.
    Перекуём баги на фичи!
    Re[9]: Идентичность и эквивалентность
    От: Cyberax Марс  
    Дата: 12.01.06 11:35
    Оценка:
    Кодт wrote:
    > В программировании есть уже определённое отношение "идентичность", и
    > выдумывать велосипед не только бессмысленно, но и вредно. Зачем
    > устраивать терминологическую путаницу. А то давайте ещё затеем флейм,
    > почему std::vector не имеет отношения к векторному пространству.
    Баян

    Уже было где-то в середине темы "Перегрузка == героин".
    Posted via RSDN NNTP Server 2.0
    Sapienti sat!
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.