Разница между == и === в Mathematica

у меня сложилось впечатление, что = это задание, == является числовым сравнением, и === является символическим сравнением (а также на некоторых других языках == будучи equal to и === будучи identical to. Однако, глядя на следующее, кажется, что это не обязательно так...

In: x == x
Out: True

In: x === x
Out: True

In: 5 == 5
Out: True

In: 5 === 5
Out: True

In: x = 5
Out: 5

In: 5 == x
Out: True

In: 5 === x
Out: True

In: 5 5 == 5x
Out: True

In: 5 5 === 5x
Out: True

In: x == y
Out: x == y

In: x === y
Out: False

In: y = x
Out: 5

In: x == y
Out: True

In: x === y
Out: True

так в чем же разница между == и === в Mathematica? Я просматривал документацию, но я все еще не совсем понимаю он.

5 ответов


одним важным отличием является то, что === всегда возвращает True или False. == может возвращать unevaluated (вот почему это полезно для представления уравнений.)

In[7]:= y == x^2 + 1

Out[7]= y == 1 + x^2

In[8]:= y === x^2 + 1

Out[8]= False

есть несколько интересных случаев, когда == возвращает недооцененные, которые стоит знать во время программирования. Например:

In[10]:= {} == 1

Out[10]= {} == 1 

что может повлиять на такие вещи, как If[foo=={}, <true>, <false>].


== и === очень похожи в том смысле, что она возвращает True Если lhs и rhs равны. Один из примеров, когда они отличаются, - это сравнение чисел в разных форматах представления.

In: 5.==5
Out: True

In: 5.===5
Out: False

хотя они одинаковы численно, (вот почему == возвращает True), они не совсем идентичны.

FYI, они различные функции внутренне. == is Equal, а === и SameQ.


Equal относится к семантическому равенству, тогда как SameQ синтаксическое равенство. Например, Sin[x]^2+Cos[x]^2 и 1 одинаковое число, поэтому они равны семантически. Поскольку это невозможно определить без дополнительных преобразований,Equal возвращает значение unevaluated. Однако фактические выражения отличаются, поэтому SameQ дает False.

Sin[x]^2 + Cos[x]^2 == 1
Sin[x]^2 + Cos[x]^2 === 1
Simplify[Sin[x]^2 + Cos[x]^2 == 1]

обратите внимание, что есть специальные обработки Real цифры SameQ[a,b] может возвратить True если a и b отличаются последняя двоичная цифра. Чтобы сделать более ограничительное тестирование идентичности, используйте Order[a,b]==0

a = 1. + 2^-52;
b = 1.;
a === b
Order[a, b]==0

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

c + d === d + c
SetAttributes[SameQ, HoldAll]
c + d === d + c

LHS===rhs дает True если выражение lhs идентично rhs, и дает False в противном случае.

и

LHS==rhs возвращает True, если LHS и rhs идентичны.

справка здесь и здесь.


Я прям вам!--1-->раздел 2.5: проверка равенства отличной книги Леонида Шифрина.