Wolfram ResearchPRODUCTSPURCHASEFOR USERSCOMPANYOUR SITES
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.

Documentation / Mathematica / Mathematicaブック / Mathematicaの仕組み / パターン /

2.3.5 パターン適用範囲の制限

Mathematicaは,パターンに制約条件を指定するための一般化された機構を提供している.単に,パターン記述の後に書式/; conditionの条件を加えればよい.そうすると,制約条件がTrueになる場合に限り,パターンを適用する.ここで,記号/;はスラッシュ・セミと読み,その意味は「何々の,場合に限り」と解釈する.

パターンと変換規則の適用範囲の限定

引数n0より大のときだけ適用する定義を関数facに与える.

In[1]:= fac[n_ /; n > 0] := n!

facの定義は,引数が正のときにだけ適用される.

In[2]:= fac[6] + fac[-4]

Out[2]=

リストから負の要素を検索させる.

In[3]:= Cases[{3, -4, 5, -2}, x_ /; x < 0]

Out[3]=

/;は,個々のパターンだけでなく,:=の関数定義式や:>の変換規則にも使える.そのときも,式や規則の末尾に書式/; conditionを使い制約条件を加えることで,特定の条件が満たされるときだけに定義や変換規則が適用されるようにすることができる.ただし,注意点として,この書式は,通常,=の定義や,->の変換規則に使ってはならない.2.5.8で述べるように,これらの式は直ちに評価されてしまうからである.

この方法でも,引数nが正の値を取るときだけに適用される定義を与えることができる.

In[4]:= fac2[n_] := n! /; n > 0

引数が正のときだけ階乗関数は評価を行う.

In[5]:= fac2[6] + fac2[-4]

Out[5]=

演算子/;を使い,規則の適用範囲を任意な数学的条件で制限することも可能である.通常の場合,広範な式と構造的にマッチするパターンを使い,数学的な制約条件で式の範囲をずっと小さな集合にできる.

この規則は,v[x_, 1 - x_]の構造を持つ式にだけ適用される.

In[6]:= v[x_, 1 - x_] := p[x]

この式は規則と同じ形なので規則が適用されることになる.

In[7]:= v[a^2, 1 - a^2]

Out[7]=

この式は,数学的に同じ形を取っているが,構造が違う.このため規則は適用されない.

In[8]:= v[4, -3]

Out[8]=

この規則は,条件y == 1 - xが付いているので,w[x_, y_]の形の式ならばどれにでも適用される.

In[9]:= w[x_, y_] := p[x] /; y == 1 - x

新規則は,この式には適用されない.

In[10]:= w[4, -3]

Out[10]=

パターンと変換規則を組み合せて設定する際,式によっては,/;の制約条件を加える位置を選択することができる.例えば,lhs :> rhs /; conditionとすれば,規則の右辺に条件を加えることができるし,lhs /; condition -> rhsとすれば,左辺に条件を加えることができる.さらに,左辺lhsの内部に条件を挿入することも可能である.ただし,制限事項が1つある.それは,制約条件が付加されたパターンの記述において,すべてのパターンの参照名が明記されている必要がある,という事項である.これがないと,実際に制約条件を評価する際に,必要な参照名がまだパターンマッチングのプロセスに組み込まれていないという状況に陥ってしまい,制約条件の評価が続けられなくなってしまう.そうなると,パターンマッチングから参照したはずのオブジェクトは使えなくなるので,代りに,変数には大域的な値が適用されることになる.

例を見てみよう.f[x_, y_] /; (x + y < 2)で示される制約条件は,f[x_, y_]のパターンマッチングから得られる変数xyを必要とする.この式をf[x_ /; x + y < 2, y_]と書き換えたとすると,条件の評価に必要なyはパターンマッチングから取得できなくなってしまう.このため,代りにyには大域的な値が適用される.

適切な参照名がパターンに与えられていれば,なるべく小さいパターンを選び,そこに/;の制約条件を適用するようにしておくと検索効率を向上させることができる.その理由は,パターンマッチングはパターン式の先頭から末尾に向かって要素の1つずつに対して行われるので,/;の制約条件が早く見付かれば見付かるほど候補を早く絞り込めるからである.

パターン全部に制約条件を適用させるより,x_にだけ適用した方がわずかではあるが,効率が上がる.

In[11]:= Cases[{z[1, 1], z[-1, 1], z[-2, 2]}, z[x_ /; x < 0, y_]]

Out[11]=

複文型の従属部に制約条件を使う場合は丸カッコでくくっておかなければならない.

In[12]:= {1 + a, 2 + a, -3 + a} /. (x_ /; x < 0) + a -> p[x]

Out[12]=

/;を使いパターンと変換規則を設けるときは,特定の性質や型を持つ数や式に限って適用可能になるようにするのが普通である.Mathematicaには式の性質を識別するための組込み関数が用意されているので,それらを使い判定作業を行うとよい.組込み関数には,英語の「質問」を意味する単語"Question"から取ったローマ字Qで終る名前が付いているので分かりやすいだろう.

数の型や数学的な性質を調べるための判定関数

この規則は,数の型を持つリスト要素だけに適用される.

In[13]:= {2.3, 4, 7/8, a, b} /. (x_ /; NumberQ[x]) -> x^2

Out[13]=

この定義は,要素を整数とするベクトルについてだけ適用される.

In[14]:= mi[list_] := list^2 /; VectorQ[list, IntegerQ]

この定義は,この場合,最初のケースにだけ適用される.

In[15]:= {mi[{2, 3}], mi[{2.1, 2.2}], mi[{a, b}]}

Out[15]=

上記の判定関数を使う際の注意点として,判定する式の型や式の性質が確定していない場合,判定関数はFalseを返す,ということがある.

4561は整数なので,Trueが返される.

In[16]:= IntegerQ[4561]

Out[16]=

xは未知数なので型は未定である.このため,Falseが返される.

In[17]:= IntegerQ[x]

Out[17]=

通常,判定落ちしてしまう未定型のものでも強制的に判定をパスするように特別な設定を施しておくことができる.例えば,2.5.10で述べるように,x /: IntegerQ[x] = Trueと入力しておけば,未知数xを形式的な整数型として宣言したことになる.そうしておいた後で,IntegerQ[x]で判定すれば,Trueが返されるようになる.ただし,x自体は整数型として扱われるが,xから派生したオブジェクト,例えば,x^2も自動的に整数型になるわけではないので,注意が必要である.派生オブジェクトにも型を適用させるには,特別なMathematicaパッケージを読み込ませておく必要がある.

式の構成上の性質を調べるための判定関数

2重イコール(==)の式は,シンボル的な形のまま維持される.3重イコール(===)は, 両辺の式xyが明らかに等しくなければFalseを返す.

In[18]:= {x == y, x === y}

Out[18]=

nは,リスト{x, x^n}の「メンバー」ではない.

In[19]:= MemberQ[{x, x^n}, n]

Out[19]=

しかし,式nは,{x, x^n}には現れる.

In[20]:= FreeQ[{x, x^n}, n]

Out[20]=

FreeQを使い,hに関する「線形性」規則を定義することができる.

In[21]:= h[a_ b_, x_] := a h[b, x] /; FreeQ[a, x]

xが不在な項はhの項から引き抜かれてしまう.

In[22]:= h[a b x, x] + h[2 (1+x) x^2, x]

Out[22]=

パターン適用範囲のもう1つの限定法

条件構築パターン/; conditionを使うことで,パターン名を含む条件を評価させ,適合するものがあるかどうかを判定させることができる.これに対して,条件構築パターン ? testを使うと,任意関数testがパターンマッチングされた式全体に適用され,適合するものがあるかどうかが判定される.場合によっては,/;の代りに?を使った方がよりコンパクトな形の定義にすることができる.

この定義では,x_により抽出される前にNumberQで型が数かどうかを判定される.

In[23]:= p[x_?NumberQ] := x^2

この定義は,pが数的な引数を持つときだけに適用される.

In[24]:= p[4.5] + p[3/2] + p[u]

Out[24]=

さらに複雑な定義を使う.純関数を丸カッコでくくることを忘れないように注意.

In[25]:= q[{x_Integer, y_Integer} ?
(Function[v, v.v > 4])] := qp[x + y]

この定義は,特定のケースにしか適用されない.

In[26]:= {q[{3, 4}], q[{1, 1}], q[{-5, -7}]}

Out[26]=



Any questions about topics on this page? Click here to get an individual response.Buy NowMore Information


 © 2008 Wolfram Research, Inc.  Terms of Use  Privacy Policy |
Sign up for our newsletter: