1. ホーム
  2. programming-languages

[解決済み] Mathematica:シンボリックプログラミングとは?

2023-08-05 06:19:45

質問

私はStephen Wolframの大ファンなのですが,彼は間違いなく自分自身の角を立てることを恐れない人です. 多くの文献で,彼は Mathematica を別の記号的プログラミングパラダイムとして賞賛しています. 私はMathematica のユーザではありません.

私の疑問は、この記号的プログラミングとは何なのか?また,(Haskellのような)関数型言語と比較してどうなのでしょうか?

どのように解決するのですか?

Mathematica の記号的プログラミングは,検索と置換の規則を指定してプログラミングする検索置換システムだと考えることができます.

例えば,次のような規則を指定することができます.

area := Pi*radius^2;

次に area に置き換わります。 Pi*radius^2 . ここで,新しいルールを定義すると

radius:=5

これで radius を使うと、それが 5 . もし area に書き直されます。 Pi*radius^2 に書き換えられ、その結果 radius となり Pi*5^2 を中間結果として得ます。この新しい形式は、組み込みの書き換えルールである ^ 操作のための組み込みの書き換えルールが発動し、式はさらに Pi*25 . この時点で適用可能なルールがないため、書き換えは停止する。

置換ルールを関数にすることで、関数型プログラミングをエミュレートすることができます。例えば、足し算をする関数を定義したい場合、以下のようになります。

add[a_,b_]:=a+b

現在 add[x,y] は、次のように書き換えられます。 x+y . もし、数値の a,b に対してのみ add を適用したい場合は、代わりに次のようにします。

add[a_?NumericQ, b_?NumericQ] := a + b

今すぐ add[2,3] は、次のように書き換えられます。 2+3 に書き換えられ、さらに 5 の組み込みルールで + であるのに対し add[test1,test2] は変更されないままです。

以下は対話型置換ルールの例です。

a := ChoiceDialog["Pick one", {1, 2, 3, 4}]
a+1

ここで aChoiceDialog に置き換えられ、その後、ポップアップしたダイアログでユーザーが選択した番号に置き換えられるので、数値とトリガーの両方の置き換えルールが有効になります。 + . ここで ChoiceDialog を、"ChoiceDialog[some stuff] をユーザがクリックしたボタンの値に置き換える" という行に沿った組み込みの置換規則として使用します。

ルールは条件を使用して定義することができ、条件自体がルールリライティングを経て True または False . 例えば、あなたが新しい方程式を解く方法を発明したとします。しかし、その方法の最終結果が正であるときのみ、それが機能すると考えています。その場合、次のようなルールが考えられます。

 solve[x + 5 == b_] := (result = b - 5; result /; result > 0)

ここで solve[x+5==20] は 15 に置き換わりますが solve[x + 5 == -20] は適用されるルールがないため変更されません。このルールが適用されないようにする条件は /;result>0 . 評価器は、基本的にルール適用の潜在的な出力を見て、それを進めるかどうかを決定します。

Mathematica の評価器は,すべてのパターンをその記号に適用されるルールのうちの1つで貪欲に書き直します. より細かい制御を行いたい場合もあります.そのような場合は,次のように自分自身のルールを定義し,手動で適用することができます.

myrules={area->Pi radius^2,radius->5}
area//.myrules

で定義されたルールが適用されます。 myrules で定義されたルールを適用し、結果が変化しなくなるまで適用します。これはデフォルトのエバリュエータとほぼ同じですが、複数のルールセットを持ち、それらを選択的に適用することができるようになりました。より高度な の例です。 は、ルール・アプリケーションのシーケンスを検索するPrologライクなエバリュエータの作り方を示しています。

現在の Mathematica バージョンの欠点は,Mathematica のデフォルトの評価器を使う必要があるときに出てきます. Integrate , Solve など) は、デフォルトの評価順序を変更したい。それは可能ですが 複雑な で、将来のシンボリックプログラミングの実装では、評価順序を制御するもっとエレガントな方法があると思いたいのですが。