|
2.3.3 パターンの参照名
特に変換規則を作る際は,パターンに名前を付けておき,それを参照することができるようにしておきたい.例えば,パターンに参照名x_を付けておけば,パターンで抽出される式が実際に何であれ,その式の参照はxでできる.参照名は,例えば,変換規則の右辺で使われる.
x_のような名前の付いたパターンを使う際,気を付けなければいけない点として,xの付いたすべてのブランクは,必ず同じ式を表すものでなければならない,ということがある.
このため,f[x_, x_]は,2引数を全く同じものとした式fしか表すことができない.これに対して,f[_, _]は,引数x,yを必ずしも同じものとしないf[x, y]の形を持った式を表すことができる.
この変換規則を使うと,引数のパターンは同じであるから,同じ引数を持った関数のリスト要素しか変換の対象にはならない.
In[1]:= {f[a, a], f[a, b]} /. f[x_, x_] -> p[x]
Out[1]= 
単一ブランクのパターンに限らず,任意形のパターンにも名前を付けることができる.任意パターンpatternをxと呼びたければ,x:patternと入力する.この方法で名前を付けておけば,パターンがブランク以外の要素で構成された特別なものでも,変換規則の右辺で参照できるようになる.

参照名があるパターン
パターン_^_の全体に参照名を付ける.参照名を使い,変換規則の右辺でこのパターンを参照することができるようになる.
In[2]:= f[a^b] /. f[x:_^_] -> p[x]
Out[2]= 
ここでは,指数部はnとし,オブジェクト全体はxとした.
In[3]:= f[a^b] /. f[x:_^n_] -> p[x, n]
Out[3]= 
1つのパターンを2回使い,そのどちらも同じ名前で参照されたとすると,このパターンで適合可能となる2つの式は,全く同じ構成の式に限られてしまう.
この場合は,どちらのリスト要素でもパターンにマッチする.
In[4]:= {f[h[4], h[4]], f[h[4], h[5]]} /. f[h[_], h[_]] -> q
Out[4]= 
今度は,引数のパターンに同じ名前を指定したので,同じhの引数を持つ最初のリスト要素だけがマッチする.
In[5]:= {f[h[4], h[4]], f[h[4], h[5]]} /. f[x:h[_], x_] -> r[x]
Out[5]= 
|