Разница между == и === в 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? Я смотрел документацию, но я все еще не совсем понимаю ее.

Ответ 1

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

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>].

Ответ 2

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

In: 5.==5
Out: True

In: 5.===5
Out: False

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

FYI, они являются разными функциями внутри. == - Equal, тогда как === - SameQ.

Ответ 3

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

Ответ 4

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

и

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

Ссылка из здесь и здесь.