|
2.5.1 変換規則の適用

変換規則の適用法
置換演算子 /.(スラッシュ・ドットと読 む)を使うことで,規則を式に適用することができる.
In[1]:= x + y /. x -> 3
Out[1]= 
規則はリスト形式で適用することができる.各規則が一度ずつ各式に試される.
In[2]:= x + y /. {x -> a, y -> b}
Out[2]= 

変換規則リストの適用
規則をリストのリストの形で与えると,結果はリストとして得られる.
In[3]:= x + y /. {{x -> 1, y -> 2}, {x -> 4, y -> 2}}
Out[3]= 
Solveや NSolve等の組込み関数は,要素を規則のリストとしたリストを返す.各規則は解を表している.
In[4]:= Solve[x^3 - 5x^2 +2x + 8 == 0, x]
Out[4]= 
これらの規則を適用すると,各解に対応した結果がリスト形式で得られる.
In[5]:= x^2 + 6 /. %
Out[5]= 
書式 expr /. rulesを使い複数の規則を適用すると,各規則は式の各部分に代る代る試される.ある規則が適用されると直ちに,それに対応した変換が施され,変形された該当部分が返される.
x^3の規則がまず試される.それが適用できなければベキの規則 x^n_が使われる.
In[6]:= {x^2, x^3, x^4} /. {x^3 -> u, x^n_ -> p[n]}
Out[6]= 
規則が適用されると結果は即座に返される.このため,内側の hは置換されない.
In[7]:= h[x + h[y]] /. h[u_] -> u^2
Out[7]= 
expr /. rulesによる変換操作では,rulesにある各規則は式 exprの各部分に一度だけ試される.
各規則は一度しか適用されない.そのため,これは xと yを入れ替える働きをする.
In[8]:= {x^2, y^3} /. {x -> y, y -> x}
Out[8]= 
この記述を使うことで,最初に規則のセットを適用し,続いて別のセットを適用することができる.
In[9]:= x^2 /. x -> (1 + y) /. y -> b
Out[9]= 
ときには,式に変化がなくなるまで,繰返し規則を適用しなければならないことがある.これを行うには,書式 expr //. rulesによる繰返し置換操作,または,組込み関数 ReplaceRepeated[expr, rules]を使う(ここで, rulesは規則を, exprは式を示す).

規則を一度だけ適用する方法と繰り返し適用する方法
1回だけ置換演算子 /.を使うと,各規則は式の各部分に対して一度だけ試行される.
In[10]:= x^2 + y^6 /. {x -> 2 + a, a -> 3}
Out[10]= 
これに対して,繰返し置換演算子 //.を使えば,式に変化がなくなるまで規則は繰り返し試行される.
In[11]:= x^2 + y^6 //. {x -> 2 + a, a -> 3}
Out[11]= 
この規則は一度しか適用されない.
In[12]:= log[a b c d] /. log[x_ y_] -> log[x] + log[y]
Out[12]= 
繰返し置換演算子を使ったので,今度は,結果が変わらなくなるまで規則が繰り返し適用される.
In[13]:= log[a b c d] //. log[x_ y_] -> log[x] + log[y]
Out[13]= 
//.(スラッシュ・スラッシュ・ドットと読む)が使われると, Mathematicaは式を繰り返し走査しながら与えられた各規則を適用していく.この走査は,全く同じ結果が続けて得られるまで繰り返される.
循環してしまうような規則の組合せを与えると,いつまでたっても //.の置換走査が終らなくなってしまう.実際には, //.による特定の式に対して繰り返される走査の最大回数は,オプション MaxIterationsの現行値で決定される.繰返しを何回でもできるようにしたければ,ReplaceRepeated[expr, rules, MaxIterations -> Infinity]を使う.そうした場合でも, Mathematicaを手動で中断すれば走査をいつでも停止することができる.
繰返しの上限(MaxIterations)を再設定することで,ReplaceRepeatedに対して式の走査を何回まで許可するかを指定することができる.
In[14]:= ReplaceRepeated[x, x -> x + 1, MaxIterations -> 1000]

Out[14]= 
2つの置換演算子 /.と //.は,ともに,式の各部分に対して各規則を試行していく,という同じ機能を持つ.これに対して, Replace[expr, rules]は,式 expr全体に対して規則を適用するが,式の各部分には適用しない.
それでも, Replaceを MapやMapAt等の他の関数と組み合せて使うことで,置換の対象になる式の部分を確実に限定することができる.また,別の節ですでに触れたが,関数ReplacePart[expr, new, pos]でも,指定されたオブジェクトによる式の部分的置換を行うことができる.
演算子 /.を使うと,規則は式のすべての部分に適用される.
In[15]:= x^2 /. x -> a
Out[15]= 
これに対して,レベル指定をせずにReplaceを使うと, 規則は式全体にだけ適用される.
In[16]:= Replace[x^2, x^2 -> b]
Out[16]= 
この例は,何も置換されない.
In[17]:= Replace[x^2, x -> a]
Out[17]= 
規則をレベル2まで適用することで,xは置換される.
In[18]:= Replace[x^2, x -> a, 2]
Out[18]= 

式の部分への規則の適用と式全体への規則の適用
Replaceは,最初に適用された規則による結果を返す.
In[19]:= Replace[f[u], {f[x_] -> x^2, f[x_] -> x^3}]
Out[19]= 
ReplaceListは,適用される各規則の結果をリスト形式ですべて返す.
In[20]:= ReplaceList[f[u], {f[x_] -> x^2, f[x_] -> x^3}]
Out[20]= 
規則を複数の方法で適用することができるならば, ReplaceListはすべての結果をリストで返す.
In[21]:= ReplaceList[a + b + c, x_ + y_ -> g[x, y]]
Out[21]= 
これは,もとのリストを2分割するための仕分け方をリスト形式で返す.
In[22]:= ReplaceList[{a, b, c, d}, {x__, y__} -> g[{x}, {y}]]
Out[22]= 
これは,同一要素が両側におかれたすべてのサブリストを検索する.
In[23]:= ReplaceList[{a, b, c, a, d, b, d}, {___, x_, y__, x_, ___} -> g[x, {y}]]
Out[23]= 

規則の一度限りの適用と並び順変更による複数回の適用
|