!Mathematicaプログラミング !!■ 式の書き換え 「x^2+2x+3」のxが5の時の値を求める方法として単純に考えると 以下のようになる。 <<< In[1]:= x=5 Out[1]= 5 In[2]:= x^2+2x+3 Out[2]= 38 >>> しかし、この方法ではxに値を割り当ててしまうために、 元の値を上書きしてしまう上に、 これ以降のxはすべて5として計算されてしまう。 そこで、以下のようにするとこれらの問題が解決できる。 <<< In[1]:= x^2+2x+3 /. x->5 Out[1]= 38 >>> この様に「/.」を使用することで 式を書き換えることができるために、 シンボルの割り当てをいじらずに値を求めることができる。 !!! ReplaceAll (/.) <<< 式 /. ルール >>> とすることによって、式をルールによって書き換えることが可能である。 なお、ルールをリストにして与えることで 複数のルールが一度に適用可能である。 <<< In[1]:= {a, b, c, b} /. b->x Out[1]= {a, x, c, x} n[2]:= {o, p, q, r} /. {p -> x, r -> y} Out[2]= {o, x, q, y} >>> !!! ReplaceRepeated (//.) ReplaceAllとは違い、 式をこれ以上変換することが出来なくなるまでルールの適用をおこなう。 <<< In[1]:= {a,b,c} /. {a->b, b->x} Out[1]= {b, x, c} In[2]:= {a,b,c} //. {a->b, b->x} Out[2]= {x, x, c} >>> !!! Rule (->) 「lhs -> rhs」のように書き、 lhsにはパターンを用いることが出来る。 <<< In[1]:= {a^b, b^c, c^a} /. a^x_ -> f[x] Out[1]= {f[b], b^c , c^a } >>> !!! RuleDelayed (:>) 「lhs :> rhs」のように書き、パターンが適用される度に評価される。 <<< In[1]:= {a, b, c, a} /. a -> Random[] Out[1]= {0.249516, b, c, 0.249516} In[2]:= {a, b, c, a} /. a:> Random[] Out[2]= {0.137118, b, c, 0.559063} >>> 「->」では割り当てられるランダムな値が同一なのに対し、 「:>」では異なっている事が分かる。