パターンと変換規則
パターン
ある分類に属す式を表すものをパターンと呼ぶ.パターンは特定の種類の式を表すパターンオブジェクトを含んでいる.
| _ | 任意の式を表すパターン |
| x_ | 任意の式を表すパターン.抽出された式には名前x が付けられる |
| x:pattern | 名前をx とするパターン |
| pattern?test | test を適用し,Trueを返すような式を表すパターン |
| _h | 頭部h を持つ式を表すパターン |
| x_h | 頭部にh を持つ式を表すパターン.抽出された式には名前x が付けられる |
| __ | 1つ以上の任意の式を表すパターン |
| ___ | 0個以上の任意の式を表すパターン |
| x__ および x___ | 抽出された式の列には名前x が付けられる |
| __h および ___h | 頭部にh を持つ式の列を表すパターン |
| x__h および x___h | 頭部にh を持つ式の列を表すパターン.抽出された式には名前x が付けられる |
| PatternSequence[p1,p2,...] | 一連のパターン |
| x_:v | 任意の式を表すパターン.デフォルト値はv とする |
| x_h:v | 頭部h を持つ任意の式を表すパターン.デフォルト値はv とする |
| x_. | 任意の式を表すパターン.大域的に有効なデフォルト値が使われる |
| Optional[x_h] | 頭部h を持ち,大域的にデフォルト値が定義された式 |
| Except[c] | c にマッチするもの以外の任意の式 |
| Except[c,pattern] | c にマッチするもの以外でpattern にマッチする任意の式 |
| pattern.. | パターンが1回以上繰り返される場合を表すパターン |
| pattern... | パターンが0回か1回以上繰り返される場合を表すパターン |
| Repeated[pattern, spec] | spec に従って繰り返されるパターン |
| pattern1|pattern2|... | パターンpatterni のどれかにマッチするような式を表すパターン |
| pattern/;cond | 判定条cond をTrueとする式を表すパターン |
| HoldPattern[pattern] | 評価しないまま使用するパターン |
| Verbatim[expr] | 与えた通りにマッチする式を表すパターン |
| OptionsPattern[] | 一連のオプション |
| Longest[pattern] | pattern からなる最長の文字列 |
| Shortest[pattern] | pattern からなる最短の文字列 |
Patternオブジェクト
複数の同じ名前を持ったパターンオブジェクトが1つのパターン内に存在するとき,それらのオブジェクトはすべて同一の式を指していなければならない.つまり,
f[x_, x_]では
f[2, 2]は表せるが,
f[2, 3]は表せない.
_h 等のパターンオブジェクトにおいて,頭部
h はどのような式でもよいが,パターンであってはならない.
x__等のパターンオブジェクトは式の列を表す.例えば,式
f[a, b, c]はパターン
f[x__]で表せる.そのとき,
xは
Sequence[a, b, c]になる.パターンで抽出した後に
xを変換規則で使用したなら,規則にある
xに列が代入され,関数中の他の引数と一緒にされる.例えば,
g[u, x, u]の式は
g[u, a, b, c, u]になる.
関数の引数においてパターンオブジェクト
x_:v,
x_.は,省略可能な引数を表す.
x_:v 形式の引数が省略されたときは,
x には値
v が使用される.
x_.形式の引数が省略されるときは,
x には関数に関連付けられているデフォルト値が取られる.このデフォルト値は
Default[f]の書式を使って設定できる.
| Default[f] | x_.が関数f の引数として存在するときに有効なデフォルト値を指定する |
| Default[f,n] | x_.がn 番目の引数として存在するときに有効なデフォルト値を指定する(n が負のときには末尾から数える) |
| Default[f,n,tot] | 引数が全部でtot 個あるとき,n 番目の引数のデフォルト値を指定する |
Default値の設定
f[x__, y__, z__]のようなパターンは,さまざまな
x,
y,
zの組合せで
f[a, b, c, d, e]等とマッチする.このようなときは,まず,
x,
yが最小になるような組合せが試される.一般に,単一の関数に複数の
__や
___が使われている場合,最後尾にあるものを除いた,すべての
__や
___が最も短くなるような組合せが使用され,最後尾のパターンに残りがマッチする.
x_:v や
x_.があるときは,どの引数も省略されていないという仮定のもとに関数の検索が行われる.その後で,後寄りの引数が省略されているとして検索が行われる.
異なる組合わせを試す順番は
Shortestあるいは
Longestを使って変更できる.
パターンマッチングで使われる属性
x_のようなパターンオブジェクトは,属性
Flatを備えた関数
f のどんな引数の列でも表せる.この場合,
x の値は引数に
f を適用したものになる.
f が
OneIdentityの属性を持ち,
x がマッチするのが単一の引数であるなら,
x には
f[e]ではなく
e が使われる.
割当て
| lhs=rhs | 即時型の割当て:割当て時に右辺 rhs が評価される |
| lhs:=rhs | 遅延型の割当て:左辺 lhs の値が参照されるときに右辺 rhs が評価される |
Mathematica における2つの割当て式の基本型
割当てとは,式に対して変換規則を指定することである.割当て操作は必ず特定のシンボルに関して設けられる.
| f[args]=rhs | 値f に関する割当て(下向き) |
| t/:f[args]=rhs | 値t に関する割当て(上向き) |
| f[g[args]]^=rhs | 値g に関する割当て(上向き) |
シンボルの種類に応じた割当ての仕方
f[args]=rhs のような割当て式を入力すると,
f がまず検査され,次に
f の頭部が,その次に引数の頭部が,というように割当て式を関連付けするシンボルが見付かるまで検査が続けられる.
一方,
lhs^=rhs のような割当て式を入力すると,左辺
lhs の引数として与えられたシンボルか,または
lhs の引数の頭部に対して変換規則が設けられる.
シンボル
s に関連付けられた変換規則は,決められた並び順で内部保管され,また,その順序に従い規則が適用される.新たな割当て定義を行うと,対応する変換規則は
s 関連の変換規則リストの末尾に加えられることになっている.ただし,次の場合はその限りではない.
- 変換規則式の左辺が定義済みリストにある変換規則に等しく,かつ,右辺に/;による条件があれば,それも等しいとき.この場合,新しい変換規則は古い規則と入れ替えられる.
- 新たな変換規則がすでに登録済みの古い規則より,より具体的な内容を備えており,また,古い規則の後に置かれたなら使われることがない,とMathematica が判断したとき.この場合,新規の規則は古い規則の手前に置かれる.ある規則が他の規則に比べてより具体的かどうかが判別できないときがよくあるが,そのような場合には,新しい規則は常にリストの最後に置かれる.
値の型
シンボルに関連付けられている各種の値
オブジェクトの消去と除去
| expr=. | expr に定義してある値を消去 |
| f/:expr=. | expr に定義してあるf に関する値を消去 |
| Clear[s1,s2,...] | シンボルsi について,属性,メッセージ,デフォルト値を除いたすべての値を消去 |
| ClearAll[s1,s2,...] | シンボルsi について,属性,メッセージ,デフォルト値を含めたすべての値を消去 |
| Remove[s1,s2,...] | si についてのすべての値を消去し,名前も除去する |
オブジェクトの消去と除去
Clear,
ClearAll,
Removeでは,引数はシンボル,もしくは文字列としてのシンボルの名前として与える.文字列の引数にメタ文字の*および@を入れて,パターンにマッチする名前のシンボルに対するアクションを指定することができる.
変換規則
| lhs->rhs | 即時型の置換:規則式が入力された時点で右辺rhs が評価される |
| lhs:>rhs | 遅延型の置換:規則が適用された時点で右辺rhs が評価される |
Mathematica における2つの変換規則の基本型
変換規則に現れるパターン変数に対する置換操作は,
ReplaceAll(または,演算子
/.)を使い行われる.