14

私は最近、Roman Maeder による小さなパッケージを再発見しました。このパッケージは、Mathematica に x == y などの式に対して算術関数や同様の関数を自動的にスレッド化するように指示します。Maeder のパッケージへのリンク。

まず、デモンストレーションとして、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 がデフォルトでこのように動作するように設定されている理由を誰か説明できますか? 自動スレッド化は Mathematica の初心者が期待するタイプの動作のように思えます.---少なくとも私には---システム全体に問題を引き起こす可能性のある例を誰かが提供できるかもしれません. (そして、Mathematica の無知を遠慮なく指摘してください...)

4

2 に答える 2

11

算術演算を考えると自然に思えます。しかし、常にそうであるとは限りません。

私が書くとき

Boole[a==b]  

私はほしくない

Boole[a] == Boole[b]  

そして、それが Maeder のパッケージが行うことです。

編集

以下のコメントに答えます。

Boole[] は v.5.2 で追加されましたが、Maeder のパッケージは v.3 用に作成されました。私の質問の核心はまだ「デザイン」の問題を中心に展開していると思います。つまり、あなたが指摘した問題をどのように回避しますか?私にとって、最も明確な方法は、使用している変数について何かを宣言することですよね? -- 私を困惑させているのは、一般的に仮定を使用してのみこれを行うことができる方法です (グローバルに、または単純化のオプションとしてなど)。数値属性の完全なセットを持つ方が自然だと思う人はいますか? (この点で、Constant Attribute はいじめです)

私の答えは決して Maeder のパッケージに対する批評家ではありません。それは素晴らしいことですが、Mma で Equal[ ]を扱う主流の方法であってはならないという声明です。

Equal[ ] は関数であり、最初は特に把握しにくいものです。

  • lhs と rhs が同一の場合に True を返します
  • lhs と rhs が、数値または文字列などの他の生データとの比較によって等しくないと判断された場合、False を返します。
  • lhs または rhs に Indeterminate や Overflow などのオブジェクトが含まれている場合、評価されないままになります。
  • は、Solve などの関数を使用して操作される記号方程式を表すために使用されます。

私が理解しているMaederのパッケージの意図は、人間が数学を行うときに使用するのと同じ意味と操作規則を 式lhs == rhsに与えることです。

数学では、等式はセットに半順序を課す等価関係であり、方程式は式がこの特定の関係によって関連付けられているという主張です。

これらの違いを他の Mma の「機能」と比較してください。Sin[x]は Mma にあり、通常の数学では (ほぼ) 同じことが言えます。ほとんどの Mma ビーストについても同じことが言えます。ただし、数学の概念と正確に同型ではない Mma 構造がいくつかあります。Equal、SameQ、Equivalent などです。これらは、数学の世界からプログラミングの世界への架け橋です。それらは厳密な数学の概念ではありませんが、それらを保持するために修正されたプログラミングの概念です。

哲学的な側面が少しありましたら申し訳ありません。

チッ!

于 2011-04-18T11:21:47.947 に答える
8

行動を不平等にまで拡大できないことが一因だと思います。また、平等が評価されるようになると、動作は両方とも意味をなすはずだからです。

いいだろう:

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
于 2011-04-18T11:41:19.363 に答える