|
2.5.2 変換規則の一括操作
他のシンボル式と同じように変換規則のリストにも各種の操作処理を施すことができる.規則からなるリストにはよく参照名が割り当てられる.
三角関数展開規則に「名前」 sinexpを割り当てる.
In[1]:= sinexp = Sin[2 x_] -> 2 Sin[x] Cos[x]
Out[1]= 
これで,「名指し」で規則を使えるようになる.
In[2]:= Sin[2 (1 + x)^2] /. sinexp
Out[2]= 
リスト形式で規則を与えることで数学的関係やその他の関係を表すことができる.その際は,リストに名前を付けておき,実際に使うときには,ほしいリストを名前で簡単に指定できるようにしておくとよい.
ほとんどの場合は,リスト中の1つの規則だけが実際の式に適用される.ただし,演算子 /.は,リストにある全規則を1つずつ判定していくので,リストの規則が多ければ多いほど処理に時間がかかる.
規則のリストを事前に並べ替えておき,効率よく適用操作が進むように前処理を施すことができるようになっている.これを行うには,関数 Dispatchを規則のリスト全体に作用させる.結果として,「呼出し表」を含んだ規則のリストを表したオブジェクトを得ることができる.この表は, /.による適用可能な規則を即座に「呼び出す」ための情報を備え,これを参照することで,全規則を代る代るに判定する必要がなくなる.
最初の5階乗を生成するための規則を作る.
In[3]:= facs = Table[f[i] -> i!, {i, 5}]
Out[3]= 
呼出し表を設けておき,規則を早く使えるようにする.
In[4]:= dfacs = Dispatch[facs]
Out[4]= 
演算子 /.で規則を適用する.
In[5]:= f[4] /. dfacs
Out[5]= 

呼出し表の作成と適用
たくさんの規則を持つ長いリストでは,呼出し表を設けることで,置換操作をより早く済ませられる.パターンオブジェクトを含まない単体のシンボルやその他の式に関した規則を与える場合には,この方法を使うと特に効果的である.呼出し表を作っておくことで,演算子 /.による処理は,与えられた規則がいくつあってもほとんど同じ時間しかかからなくなる.逆に,呼出し表を使わない場合は,規則の総数に正比例しただけの時間がかかってしまう.
|