Wolfram ResearchProductsPurchasingServices & ResourcesAbout UsOur Sites
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.

Documentation / Mathematica / Mathematicaブック / Mathematicaの仕組み / 式の評価 /

2.6.4 標準評価手順

本節では,式の評価に使われるMathematicaの標準的な処理手順を説明していく.この手順はほとんどの式に使われるが,プログラムや制御構造体を表した式では使われない.後者には別の手順が使われるので,次の節で説明する.

標準評価手順では,まず,式の頭部が評価され,次に,式の各要素が評価される.式の各要素にも一般的な式と同様に扱われ同じ評価手順が帰納的に適用される.

関数Printは代る代る3回続けて評価される.評価されるたびに引数が表示され,最後に戻り値としてNullが出力される.

In[1]:= {Print[1], Print[2], Print[3]}

Out[1]=

足し算の頭部をpsとおく.

In[2]:= ps = Plus

Out[2]=

頭部psが先に評価されるので,通常の足し算として扱われる.

In[3]:= ps[ps[a, b], c]

Out[3]=

Mathematicaは,式の頭部を評価し終えると,即座に頭部が属性を持ったシンボルかどうかを判定する.もしも,順不同性Orderlessや平坦性Flat,または,リスト可Listableの属性が備わっていると,Mathematicaは,式の要素の評価が終了した時点で,これらの属性に関連した変換操作を行う.

手順の次の段階では,Mathematicaは,これから評価していく式に対して,既知の定義を適用する.ユーザ指定の定義がまず適用され,次に,組込み済みの定義が適用される.

適用可能な定義が見付かると,それに対応した変換処理が式に対して施される.結果として,別の式が生成されるが,その式についても標準評価手順による処理が繰り返し施される.

標準評価手順

2.6.1で説明したが,Mathematicaにおける評価の基本は,適用可能な規則がなくなるまで式の評価を続ける,ということである.つまり,結果がでたら,それに対して再び規則が適用さる.そして,次の結果に変化がなくなるまで,評価処理は繰り返される.

簡単な例を見ながら,具体的な標準評価手順の進行を説明する.以下の説明では,a = 7とする.

簡単な評価例

2.6.11で触れるが,Mathematicaにはトレース(Trace)と呼ばれる評価処理の追跡機能が備わっている.Traceを式に作用させると,式の評価過程で生成される暫定的な内部式をネストされたリスト形式で表示することができる.(注意点として,標準評価手順では,式の木構造において最下位から上位に向かって評価は進められるので,式の最小単位の部分がTraceからの結果のリストに最初に現れる.)

a7とおいておく.

In[4]:= a = 7

Out[4]=

トレースさせると,式の評価過程で生成されたすべての副次的な式がネストされたリスト形式で表示される.

In[5]:= Trace[2 a x + a^2 + 1]

Out[5]=

定義の適用順序は重要な意味を持っている.つまり,2.5.12で触れたように,ユーザ指定の定義は組込み型の定義より優先されるため,組込み型の定義を代替するための定義を与えることが可能である.

この式の評価には,ArcSinの組込み定義が使われる.

In[6]:= ArcSin[1]

Out[6]=

ArcSinにユーザ指定の定義を与える.プロテクトを解除しておく必要がある.

In[7]:= Unprotect[ArcSin]; ArcSin[1] = 5Pi/2;

今度は,ユーザ定義が優先される.

In[8]:= ArcSin[1]

Out[8]=

2.5.10で説明したが,規則を上向きの値または下向きの値としてオブジェクトに割り当てることができる.Mathematicaは,上向きの値の定義を下向きの値の定義より優先させる.

f[g[x]]のような式には,通常,適用可能な定義には2つの形式がある.f に関連付けられた下向きの値,そして,gに関連付けられた上向きの値である.Mathematicaは,gに関連付けられた定義をfの定義より優先させる.

この順序付けは,特殊な規則は一般的な規則より先に適用させる,といった指針に基づいている.関数に関連付けられた下向きの値の前に,引数に関連付けられた上向きの値を優先させることで,任意の引数を持つ関数のための一般定義を上書きする特別な引数に対する定義を作成することができる.

f[g[x_]]に関する規則をfに関連付けた形で定義する.

In[9]:= f/: f[g[x_]] := frule[x]

今度は,gに関連付けた形で定義する.

In[10]:= g/: f[g[x_]] := grule[x]

gに関連付けられた規則が先に適用される.

In[11]:= f[g[2]]

Out[11]=

gの規則を除去する.今度は,fの規則が使われる.

In[12]:= Clear[g] ; f[g[1]]

Out[12]=

定義の適用順序

Plusのような組込み関数の多くは下向きの値を持つ.ただし,Mathematicaの組込み型オブジェクトによっては上向きの値を持つものもある.例えば,ベキ級数を表すのに使われるSeriesDataオブジェクトは,数学的操作に関した組込み済みの上向きの値を持つ.

f[g[x]]等の式における,標準評価手順に従い適用される一連の定義の優先順位は以下の通りである.

FilledSmallSquare gに関連付けしたユーザ定義

FilledSmallSquare gに関連付けられている組込み定義

FilledSmallSquare f に関連付けしたユーザ定義

FilledSmallSquare f に関連付けられている組込み定義

下向きの値より上向きの値の方が優先されるという事実は,いろいろな場面で重要な意味を持つ.例えば,式を再構成するための操作を定義するとする.再構成の操作に関する上向きの値を各種オブジェクトに対して与えると,これらの上向きの値はこのオブジェクトが現れるたびに使われる.しかし,特別なオブジェクトが見当たらないときに使うための,再構成用の一般的な手続きを与えることもまた可能である.その場合,この手続きは,再構成操作に関する下向きの値として与えることができる.下向きの値は上向きの値の後に試されるので,上向きの値を伴ったオブジェクトが何もないときに限って,一般手続きが使われる.

qオブジェクト」を再構成するための定義を作成し,qに関連付ける.

In[13]:= q/: comp[q[x_], q[y_]] := qcomp[x, y]

今度は,一般則を作り,compに関連付ける.

In[14]:= comp[f_[x_], f_[y_]] := gencomp[f, x, y]

2つのqオブジェクトを再構成させる.すると,qに関連付けられた規則が使われる.

In[15]:= comp[q[1], q[2]]

Out[15]=

rオブジェクトを再構成させると,compに関連付けられた一般則が使われる.

In[16]:= comp[r[1], r[2]]

Out[16]=

一般に,式は上向きの値を備えた複数のオブジェクトを持つ.Mathematicaは,まず,式の頭部を参照し,それに関連した上向きの値を試す.次に,式の各要素を順々に参照していき,要素に上向きの値があればそれを試す.この手順は,まずユーザ定義の上向きの値に対して行われ,続いて,組込み済みの上向きの値に対して行われる.また,この手順が一連の要素に対して適用されるとき,先に現れる要素に関連付けられた上向きの値は,後寄りの要素に関連付けられた上向きの値より優先される.

cに関連付ける形でpに関する上向きの値を定義する.

In[17]:= p/: c[l___, p[x_], r___] := cp[x, {l, r}]

qに関する上向きの値を定義する.

In[18]:= q/: c[l___, q[x_], r___] := cq[x, {l, r}]

どの上向きの値が適用されるかは,cの引数列においてどちらが先に現れるかによる.

In[19]:= {c[p[1], q[2]], c[q[1], p[2]]}

Out[19]=



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: