[解決済み] Mathematica:シンボリックプログラミングとは?
質問
私は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
ここで
a
は
ChoiceDialog
に置き換えられ、その後、ポップアップしたダイアログでユーザーが選択した番号に置き換えられるので、数値とトリガーの両方の置き換えルールが有効になります。
+
. ここで
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
など)
と
は、デフォルトの評価順序を変更したい。それは可能ですが
複雑な
で、将来のシンボリックプログラミングの実装では、評価順序を制御するもっとエレガントな方法があると思いたいのですが。
関連
-
[解決済み] 軽量化の意味[クローズド]について
-
[解決済み] 末尾再帰とは何ですか?
-
[解決済み] Mathematica でWaldoを見つけるにはどうしたらよいですか.
-
[解決済み] (関数型)リアクティブプログラミングとは?
-
[解決済み] Project Eulerとの速度比較。CとPythonとErlangとHaskellの比較
-
[解決済み] なぜ関数型言語なのか?[クローズド]
-
[解決済み】関数型プログラミングはGoFデザインパターンに取って代わるか?
-
[解決済み] スカラーとプリミティブのデータ型 - 同じものなのか?
-
[解決済み】戻り値型による関数のオーバーロード?
-
[解決済み] 何が違うの?非同期、ノンブロッキング、イベントベースアーキテクチャの違いとは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン