Разница между == и === в 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, == может вернуть неоцененный (вот почему это полезно для представления уравнений.)

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), они не совсем идентичны.

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

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

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

Я направляю вас к разделу 2.5: Проверка на равенство отличной книги Леонида Шифрина.

Другие вопросы по тегам