引数がいくつあってもよい関数

f が平坦な関数でなければ,のようなパターンは,引数を2つ持った同じ関数の例しか表さない.場合によっては,引数がいくつあってもよいとするパターンを設ける必要がある.

これを行うには,複数のブランク記号を使う.単一ブランクによるパターン,例えば,は,1つのWolfram言語式だけしか表せない.これに対して,のような二重ブランクは,式がいくつあってもそれらをすべて表すことができる.

は,式の列をすべて表す.
In[1]:=
Click for copyable input
Out[1]=
もっと複雑な関数を定義する.この関数は,の持つ重複成分をペアで抽出する.
In[2]:=
Click for copyable input
この定義が2回適用され,2つのペアが抽出される.
In[3]:=
Click for copyable input
Out[3]=

「二重ブランク」は,1つもしくは複数の式からなる式の列を表す.「三重ブランク」は,ゼロもしくはそれ以上の式からなる式の列を表す.ただし,三重ブランクをパターンに使うときは特に注意が必要である.無限ループに陥る危険性があるからである.例えば,と定義したとする.ここで今,をタイプすると,がゼロ要素により列の要素に繰り返しマッチしてしまうことから,無限ループに陥ってしまう.このため,ゼロ要素のケースを含める必要がある場合を除いて,三重ブランクではなく二重ブランクを常に使うようにする.

_1つの式を表す
x_1つの式を表し,参照名を x とする
__1つ以上の式からなる式の列を表す
x__1つ以上の式からなる式の列を表し,参照名を x とする
x__hすべて h を頭部とした式である式の列を表す
___ゼロ成分のケースも含める
x___参照名を x とするゼロあるいは1つ以上の式からなる式の列を表す
x___hすべての頭部が h であるゼロあるいは1つ以上の式を表す

パターンオブジェクトの種類

「平坦な関数と順不同な関数」で触れたが,PlusTimesのような平坦性の関数では,Wolfram言語は,引数がいくつあってもそれらを自動的に扱うことができる.このため,特別に二重ブランクや三重ブランクを使う必要はない.

多重ブランクを使うと,特定の式にマッチする組合せが複数生じることがよくある.Wolfram言語は,デフォルトで,最も短くなる引数の列を,パターンマッチングの最初の多重ブランクに割り当ててくれる組合せをまず試すようになっている.この順序は,パターンの部分をLongestShortestでラップすることで変更することができる.

Longest[p]パターン p と矛盾しない最長の列
Shortest[p]パターン p と矛盾しない最短の列

マッチが試される順序の制御

Wolfram言語が試す全組合せがリスト形式で列挙される.
In[4]:=
Click for copyable input
Out[4]=
次でWolfram言語は最初に x__ に対する最長マッチを試みるようになる.
In[5]:=
Click for copyable input
Out[5]=
ReplaceListを使いパターンを変えることで,いろいろな組合せを列挙することができる.
In[6]:=
Click for copyable input
Out[6]=
このパターンを使うと,少なくとも1要素を持ったすべてのサブリストを列挙することができる.
In[7]:=
Click for copyable input
Out[7]=
次では,最初に x__ の最短マッチを試みる.
In[8]:=
Click for copyable input
Out[8]=