|
2.5.7 定義の適用順
定義の列をMathematicaで作ると,それらの定義は他の定義より,より一般的な定義であることがある.Mathematicaは,一般定義は特殊な定義よりも後回しにされる,という原則に従っている.このため,規則の特殊ケースは,より一般的なケースより先に試される.
この動作は,前節の例で示した階乗関数で決定的な役割を果たす.つまり,規則の入力された順序に関係なしに, Mathematicaは, f[1]の特殊ケースの規則を f[n_]用の一般則の前におく.このため, Mathematicaが f[n]形のある式の値を探すときは, f[1]の特殊ケースを最初に試し,それが適用しない場合に限って,一般ケースである f[n_]を試す.その結果, f[5]の値が要求されると, Mathematicaは, f[1]に対応した「最終条件」が適用できるようになるまで,一般則を繰り返し使う.

定義の優先順位
もしも特殊則を一般則の前に使うという原則が守られなかったら,特殊則はより一般的な規則で常に「隠され」てしまう.上記の階乗の例で,もし f[n_]用の規則が f[1]の規則より優先されたなら, Mathematicaが f[1]を評価しようとするときも, f[n_]の一般則が適用されてしまい, f[1]の特殊則がいつまでたっても使われないという状況に陥ってしまう.
f[n_]に対する一般的な定義を行う.
In[1]:= f[n_] := n f[n-1]
特殊ケース f[1]に関する定義を行う.
In[2]:= f[1] = 1
Out[2]= 
Mathematicaは,特殊ケースを一般ケースの前におく.
In[3]:= ?f


上記の階乗関数の例では,どちらの規則がより一般的なものかがはっきりしている.しかし,原則的に,与えられる規則にははっきりした適用順序を見出すことができない.そのようなときは, Mathematicaは,単純に入力された順序どおりに規則を適用していく.
これらの規則には,原則的に決まった適用順序がない.
In[4]:= log[x_ y_] := log[x] + log[y] ; log[x_^n_] := n log[x]
確認すると,規則は入力した通りに保存されている.
In[5]:= ?log


この規則は, log[x_ y_]に対する規則の特殊ケースである.
In[6]:= log[2 x_] := log[x] + log2
特殊則は,先に定義された一般則の前におかれている.
In[7]:= ?log


Mathematicaは,多くの実践的なケースでは,いつある規則が他の規則より,より一般的であるかを認識することができるが,どんな場合でもそうかと言うとそうではない.例えば,2つの規則がともに /;による複雑な条件を含むとき,どちらがより一般的かは判断することが極めて困難である.決まった順序はないかもしれない.順序を判断できないとき, Mathematicaは与えられた通りの順序で規則を保管する.
|