WOLFRAM言語チュートリアル

標準評価手順

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

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

関数Printは代る代る3回続けて評価される.評価されるたびに引数が表示され,最後に戻り値としてNullが出力される.
In[1]:=
Click for copyable input
Out[1]=
足し算の頭部Plusとする.
In[2]:=
Click for copyable input
Out[2]=
頭部が先に評価されるので,通常の足し算として扱われる.
In[3]:=
Click for copyable input
Out[3]=

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

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

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

式の頭部を評価する.
式の各要素を1つずつ評価する.
属性(順不同性Orderless,リスト可Listable,平坦性Flat)に関連した変換操作を適用する.
ユーザ指定の定義を適用する.
組込み定義を適用する.
結果を評価する.

標準評価手順

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

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

2ax+a^2+1ユーザが式を入力する
Plus[Times[2,a,x],Power[a,2],1]式が内部表記に変換される
Times[2,a,x]まずこの項が評価される
Times[2,7,x]が評価され,あらかじめ定義された値7が代入される
Times[14,x]式全体にTimesの組込み定義が使われ,積が評価される
Power[a,2]この項が次に評価される
Power[7,2]に割り当てられた値7が代入される
49式全体にPower用の組込み規則が使われ,ベキが計算される
Plus[Times[14,x],49,1]評価済みの各項がPlus式に取り込まれる
Plus[50,Times[14,x]]式全体にPlus用の組込み定義が使われ,和が計算される
50+14x結果がこのように表示される

簡単な評価例

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

としておく.
In[4]:=
Click for copyable input
Out[4]=
トレースさせると,式の評価過程で生成されたすべての副次的な式がネストされたリスト形式で表示される.
In[5]:=
Click for copyable input
Out[5]=

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

この式の評価には,ArcSinの組込み定義が使われる.
In[6]:=
Click for copyable input
Out[6]=
ArcSinにユーザ指定の定義を与える.プロテクトを解除しておく必要がある.
In[7]:=
Click for copyable input
今度は,ユーザ定義が優先される.
In[8]:=
Click for copyable input
Out[8]=

「異なるシンボルへの定義式の関連付け」で説明したが,規則を上向きの値または下向きの値としてオブジェクトに割り当てることができる.Wolframシステムは,上向きの値の定義を下向きの値の定義より優先させる.

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

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

に関する規則をに関連付けた形で定義する.
In[9]:=
Click for copyable input
今度は,に関連付けた形で定義する.
In[10]:=
Click for copyable input
に関連付けられた規則がに関連付けられた規則より先に適用される.
In[11]:=
Click for copyable input
Out[11]=
の規則を除去する.今度は,の規則が使われる.
In[12]:=
Click for copyable input
Out[12]=
において,g に関連付けられた定義は, f に関連付けられた定義より優先する.

定義の適用順序

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

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

  • g に関連付けしたユーザ定義
  • g に関連付けられている組込み定義
  • f に関連付けしたユーザ定義
  • f に関連付けられている組込み定義

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

オブジェクト」を再構成するための定義を作成し,に関連付ける.
In[13]:=
Click for copyable input
今度は,一般則を作り,に関連付ける.
In[14]:=
Click for copyable input
2つのオブジェクトを再構成させる.すると,に関連付けられた規則が使われる.
In[15]:=
Click for copyable input
Out[15]=
オブジェクトを再構成させると,に関連付けられた一般則が使われる.
In[16]:=
Click for copyable input
Out[16]=

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

に関連付ける形でに関する上向きの値を定義する.
In[17]:=
Click for copyable input
に関する上向きの値を定義する.
In[18]:=
Click for copyable input
どの上向きの値が適用されるかは,の引数列においてどちらが先に現れるかによる.
In[19]:=
Click for copyable input
Out[19]=