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

Недавно я заново обнаружил небольшой пакет Романа Мэдера, который сообщает 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

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


person telefunkenvf14    schedule 18.04.2011    source источник
comment
P.S. Иногда мне хотелось поиграть со старыми версиями ММА, чтобы лучше понять, как развивалась общая конструкция системы. (квазиобъекты, такие как то, как MMA обрабатывает Series, или статистические объекты ModelObject, представляют для меня особый интерес - как они работают, так и почему они были спроектированы такими, какими они были, а не каким-то другим подходом.) Я только использовал v7-v8.   -  person telefunkenvf14    schedule 18.04.2011
comment
Хороший вопрос. Я удивлен, что никогда не замечал этой причуды в том, как ММА трактует уравнения.   -  person DavidC    schedule 18.04.2011
comment
+1, Threadable обязательно нужно сделать назначаемым атрибутом. MMA должен вести внутреннюю запись о том, какие функции являются многопоточными по сравнению с другими функциями (например, Times потоков над Plus, но не наоборот).   -  person Timo    schedule 18.04.2011


Ответы (2)


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

Когда я пишу

Boole[a==b]  

Я не хочу

Boole[a] == Boole[b]  

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

Изменить

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

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

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

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

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

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

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

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

Извините, если я немного перешел на философскую сторону.

HTH!

person Dr. belisarius    schedule 18.04.2011
comment
Я заметил, что Boole [] был добавлен в v.5.2, тогда как пакет Maeder был написан для v.3. Я полагаю, что суть моего вопроса все еще вращается вокруг проблемы «дизайна». Я имею в виду, как можно обойти указанную вами проблему? Для меня самым ясным путем было бы объявить что-то о переменных, с которыми вы работаете, не так ли? - Что меня озадачивает, так это то, как вы обычно можете делать это только с помощью предположений (глобально или как вариант для упрощения и т. Д.). Кто-нибудь еще думает, что было бы естественнее иметь полный набор числовых атрибутов? (в связи с этим постоянный атрибут вызывает недовольство) - person telefunkenvf14; 22.04.2011
comment
Философский - вот что я ищу здесь! Различие математики и компьютерного программирования - это то, что меня осенило после нескольких месяцев изучения ММА. Отчасти поэтому я советую своим студентам не использовать TraditionalForm и Pallets, к которым (к сожалению) WRI любит направлять новых пользователей в нескольких вводных скринкастах. Это может принести краткосрочные выгоды - ученики встают и бегут, - но я чувствую, что многих в стране новичков это заманивает в ловушку, возможно, навсегда. Достаточно о педагогике. Спасибо за ответ. - person telefunkenvf14; 22.04.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
person Sasha    schedule 18.04.2011