|
2.3.8 引数がいくつあってもよい関数
fが平坦な関数でなければ,f[x_, y_]のようなパターンは,引数を2つ持った同じ関数のインスタンスしか表さない.場合によっては,引数がいくつあってもよいとするパターンを設ける必要がある.
これを行うには,複数のブランク記号を使う.単一ブランクによるパターン,例えば,x_は,1つのMathematica式だけしか表せない.これに対して,x__のような2重ブランクは,式がいくつあってもそれらをすべて表すことができる.
x__は,式の列(a, b, c)をすべて表す.
In[1]:= f[a, b, c] /. f[x__] -> p[x, x, x]
Out[1]= 
もっと複雑な関数を定義する.この関数は,hの持つ重複成分をペアで抽出する.
In[2]:= h[a___, x_, b___, x_, c___] := hh[x] h[a, b, c]
この定義が2回適用され,2つのペアが抽出される.
In[3]:= h[2, 3, 2, 4, 5, 3]
Out[3]= 
「2重ブランク」__は,1つもしくは複数の式からなる式の列を表す.「3重ブランク」___は,ゼロもしくはそれ以上の式からなる式の列を表す.ただし,3重ブランクをパターンに使うときは特に注意が必要である.無限ループに陥る危険性があるからである.例えば,p[x_, y___] := p[x] q[y]と定義したとする.ここで今,p[a]をタイプすると,yがゼロ要素により列の要素に繰り返しマッチしてしまうことから,無限ループに陥ってしまう.このため,ゼロ要素のケースを含める必要がある場合を除いて,3重ブランクではなく2重ブランクを常に使うようにする.

パターンオブジェクトの種類
2.3.7で触れたが,PlusやTimesのような平坦性の関数では,Mathematicaは,引数がいくつあってもそれらを自動的に扱うことができる.このため,特別に2重ブランクや3重ブランクを使う必要はない.
多重ブランクを使うと,特定の式にマッチする組合せが複数生じることがよくある.Mathematicaは,普通,もっとも短くなる引数の列を,パターンマッチングの最初の多重ブランクに割り当ててくれる組合せをまず試すようになっている.
Mathematicaが試す全組合せがリスト形式で列挙される.
In[4]:= ReplaceList[f[a, b, c, d], f[x__, y__] -> g[{x}, {y}]]
Out[4]= 
ReplaceListを使いパターンを変えることで,いろいろな組合せを列挙することができる.
In[5]:= ReplaceList[f[a, b, c, d], f[___, x__] -> g[x]]
Out[5]= 
このパターンを使うと,少なくとも1要素を持ったすべてのサブリストを列挙することができる.
In[6]:= ReplaceList[f[a, b, c, d], f[___, x__, ___] -> g[x]]
Out[6]= 
|