Уравнение Threading: почему поведение по умолчанию? - PullRequest
14 голосов
/ 18 апреля 2011

Недавно я заново открыл небольшой пакет Романа Мейдера, который говорит Mathematica, что нужно автоматически связывать арифметические и аналогичные функции с такими выражениями, как x == y. Ссылка на пакет Maeder.

Во-первых, чтобы продемонстрировать, вот пример, данный Maeder:

In[1]:= Needs["EqualThread`"]

Теперь перейдем к использованию поведения потоков для решения следующего уравнениядля х «от руки»:

In[7]:= a == b Log[2 x]
In[8]:= %/b
Out[8]:= a/b == Log[2 x]

Теперь возвести в степень:

In[9]:= Exp[%]
Out[9]= E^(a/b) == 2 x

И разделить на 2:

In[10]:= %/2
Out[10]= (E^(a/b))/2 == x

Q: ИзС точки зрения дизайна, может кто-нибудь объяснить, почему Mathematica настроена на такое поведение по умолчанию? Автоматическое создание потоков похоже на тип поведения, которого может ожидать новичок Mathematica - по крайней мере для меня - возможно, кто-то может предложить примерили два, которые могут вызвать проблемы с системой в целом.(И не стесняйтесь указывать на любое невежество математики ...)

Ответы [ 2 ]

11 голосов
/ 18 апреля 2011

Кажется естественным, думая об арифметических операциях. Но это не всегда так.

Когда я пишу

Boole[a==b]  

Я не хочу

Boole[a] == Boole[b]  

И это то, что делает пакет Мейдера.

Редактировать

Отвечая на ваш комментарий ниже:

Я заметил, что Boole [] был добавлен в v.5.2, тогда как пакет Maeder был создан для v.3. Я предполагаю, что суть моего вопроса все еще вращается вокруг проблемы «дизайна». Я имею в виду, как можно обойти проблему, которую вы указали? Для меня самый ясный путь - объявить что-то о переменных, с которыми вы работаете, не так ли? - Что меня озадачивает, так это то, как обычно вы можете делать это только с Допущениями (глобально или в качестве опции для Упрощения и т. Д.). Кто-нибудь еще думает, что было бы более естественно иметь полный набор числовых атрибутов? (в этом отношении атрибут Constant - это дразнить)

Мой ответ ни в коем случае не является критикой пакета Медера, что приятно, но утверждение, что это не должно быть основным способом лечения Равных [] в ММА.

Равен [] - это функция, и поначалу ее не особенно легко понять:

  • возвращает True, если lhs и rhs идентичны
  • возвращает значение False, если lhs и rhs определены как неравные путем сравнения чисел или других необработанных данных, таких как строки.
  • остается неоцененным, если lhs или rhs содержит такие объекты, как Indeterminate и Overflow.
  • используется для представления символьного уравнения, для управления которым используются такие функции, как Solve.

Цель пакета Мейдера, который, как я понимаю, хорошо согласуется с вашим, состоит в том, чтобы придать выражению lhs == rhs то же значение и правила манипуляции, которые люди используют при выполнении математики.

В математике равенство - это отношение эквивалентности, накладывающее частичный порядок в множестве, а уравнение - это утверждение, что выражения связаны этим конкретным отношением.

Сравните эти различия с другими "функциями" Mma. Грех [x] в Мма, и в обычной математике то же самое (ну, почти), и то же самое можно сказать о большинстве зверей Мма. Однако есть несколько конструкций Mma, в которых нет точного изоморфизма математических понятий: Equal, SameQ, Equivalent и т. Д. Они являются мостом из мира математики в мир программирования. Это не строгие математические концепции, а модифицированные программные концепции для их удержания.

Извините, если я немного коснулся философской стороны.

НТН!

8 голосов
/ 18 апреля 2011

Полагаю, это отчасти потому, что поведение нельзя распространить на неравенства. А также потому, что поведение должно иметь смысл как при оценке равенства:

Было бы неплохо:

In[85]:= Thread[Power[a == b, 2], Equal]

Out[85]= a^2 == b^2

In[86]:= Thread[Power[a == b, c == d], Equal]

Out[86]= a^c == b^d

но:

In[87]:= Thread[Power[a == b, c == d] /. {c -> 2, d -> 2}, Equal]

Out[87]= a^True == b^True
...