Уравнение Threading: почему поведение по умолчанию?

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

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

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

Теперь приступим к использованию поведения потоков для решения следующего уравнения для x 'вручную':

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 настроена так себя вести по умолчанию? Автоматическое потокование похоже на тип поведения, которое ожидал начинающий математики - для меня, по крайней мере, - возможно, кто-то может предложить пример или два, которые могут вызвать проблемы с системой в целом. (И не стесняйтесь указать на какое-либо математическое невежество...)

Ответы

Ответ 1

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

Когда я пишу

Boole[a==b]  

Я не хочу

Boole[a] == Boole[b]  

И это то, что делает пакет Maeder.

Изменить

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

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

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

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

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

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

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

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

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

НТН!

Ответ 2

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

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

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