Mathematica 9 is now available
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.
Mathematica >
Mathematicaチュートリアルチュートリアル »

異なるシンボルへの定義式の関連付け

f[args]=rhsf[args]:=rhs の形で割当て式を定義すると,式がオブジェクトf に関連付けられる.例えば,?f と入力すると,表示にはこの定義が現れる.一般に,シンボルf を頭部とする式の定義は,f の下向きの値と呼ばれる.
Mathematica では,その逆の考えに基づいた上向きの値も使えるようになっている.上向きの値は,直接的な頭部ではないシンボルに定義を関連させるために使われる.
例として,Exp[g[x_]]:=rhs を考える.1つの可能性として,この定義はシンボルExpに関連付けることができるため,それをExpの下向きの値としてとらえることができる.しかし,このとらえ方は,式の構成や計算の効率を考えると最良の見方であるとはいえないだろう.
むしろExp[g[x_]]:=rhsgに関連付けられていると考え,gの上向きの値としてとらえた方がよい.
f[args]:=rhsf に対する下向きの値を定義する
f[g[args],...]^:=rhsg に対する上向きの値を定義する

違うシンボルへの定義式の関連付け

これは,fに対する下向きの値を定義するものとする.
In[1]:=
Click for copyable input
fに関して情報を得ると,この定義を確認することができる.
次に,gに関する上向きの値を定義する.
In[3]:=
Click for copyable input
定義がgに関連したものとして認識されている.
Expには関連付けされていない.
この式の評価にはこの定義が使われている.
In[6]:=
Click for copyable input
Out[6]=
単純なケースでは,f[g[x]]に対する定義を,f の下向きの値,または,g の上向きの値として与えても,計算される結果は変わらない.それでも,2つのとらえ方の内で,どちらか片方が他方に比べてより自然で,また,効率的になることがよくある.
どちらを取るかを判断する目安として,f[g[x]]の定義は,関数fgよりも使用頻度が高ければg の上向きの値としてとらえる.これに従うと,Exp[g[x]]では,ExpMathematica の組込み関数であり,g はユーザ定義の関数であろう.そのような場合は,Exp[g[x]]に対する定義は,g により満たされる関係を与えるものと通常とらえるだろう.つまり,定義をExpの下向きの値ととらえるよりは,g の上向きの値としてとらえた方がより自然である.
gの上向きの値として定義を与える.
In[7]:=
Click for copyable input
これまでにgに関連付けられた定義を確認する.
gの加法用定義が使われる.
In[9]:=
Click for copyable input
Out[9]=
g[x_]+g[y_]は,完全形でPlus[g[x_], g[y_]]であるから,このパターンに対する定義は,Plusに対する下向きの値として与えることができる.それでも,ほとんどどんな場合でも,定義はgの上向きの値として与えた方がよい.
ある特定の関数が参照されるとき,Mathematica は,その関数に関連付けられた全定義を試す.g[x_]+g[y_]用の定義をPlusに関する下向きの値として作ると,Plusが現れるたびに,Mathematica はこの定義を使ってしまう.これは,式の加法が行われるたびにこの定義が判定されるため,非常に一般的な演算操作を遅くしてしまうことになる.
しかし,g[x_]+g[y_]用の定義をgの上向きの値として与えておけば,定義をgに関連付けることになる.この場合,Mathematica は,Plusのような関数でgが現れるときにだけこの定義を試す.gPlusに比べてあまり使用されないとすると,この手順の方がより効率的になる.
f[g]^=value または f[g[args]]^=value
即時型の割り当てをf ではなくg に関連付ける
f[g]^:=value または f[g[args]]^:=value
遅延型の割当てをg に関連付ける
f[arg1,arg2,...]^=valueargi のすべての引数の頭部に割当てを関連付ける

上向きの値を定義するための短縮形

上向きの値は,特定のオブジェクトの特性に関する「データベース」を構築するのによく使われる.上向きの値を使えば,作成する定義を,指定される特性にではなくこの定義にかかわるオブジェクトに関連付けることができる.
面積を求めるための正方形(square)に関する上向きの値を定義する.
In[10]:=
Click for copyable input
Out[10]=
周辺の長さ(perimeter)に関する定義を加える.
In[11]:=
Click for copyable input
Out[11]=
両方の定義は,オブジェクトsquareに正しく関連付けられている.
十分高いレベルに位置するシンボルであれば,それが何であっても,式に関する定義をそれに関連させることができる.f[args]形の式があるとき,あるシンボルg 自体またはg を頭部とするオブジェクトがargs に現れるのであれば,g に関する上向きの値は定義することができる.しかし,もしg が式の低レベルに現れるならば,それに定義を関連付けることはできない.
gは引数の頭部としてあるため,それに対して定義を関連付けることができる.
In[13]:=
Click for copyable input
ここでは,gは深すぎる位置に現れるので,定義を関連付けることができない.
In[14]:=
Click for copyable input
Out[14]=
f[...]:=rhsf の下向きの値
f/:f[g[...]][...]:=rhsf の下向きの値
g/:f[...,g,...]:=rhsg の上向きの値
g/:f[...,g[...],...]:=rhsg の上向きの値

定義における可能なシンボルの位置

「式の意味」で説明したように,シンボルを「タグ」として使うことで式の「型」を指定することができる.例えば,複素数はMathematica 内部でComplex[x, y]と表されるが,シンボルComplexは,該当オブジェクトが複素数であることを指定するためのタグとして働いている.
上向きの値を使うと,タグにより型を特定化されたオブジェクトに対して働く操作を指定することが簡便になる.例えば,型をquatとした抽象的な数学オブジェクトからなる1つのオブジェクトクラスを導入したいとする.このとき,この型のオブジェクトは,quat[data]という形式のMathematica 式で表すことができる.
quatオブジェクトに,足し算や掛け算等の四則演算に関連した特別な性質を持たせたいときがある.このような性質は,quatに関する上向きの値をPlusTimesに対して定義することで設定することができる.
quatの上向きの値をPlusに対して定義する.
In[15]:=
Click for copyable input
定義した上向きの値が使われ,この式は簡約される.
In[16]:=
Click for copyable input
Out[16]=
quatの上向きの値をPlusのような演算に対して定義するとき,それは実効的にquatオブジェクトを包含させるべくPlusの定義域を拡張することに相当する.これは,加算される数がquat型のオブジェクトである場合には,加法に特殊則を使うようにMathematica に指示することになる.
quatオブジェクトを対象にした加法を定義する際,適当な下向きの値を割り当てた特殊な加法操作(例えば,quatPlus)を使うことも考えられる.しかし,普通は,標準の組込み関数Plusを使い加法を表せるが,quat型のオブジェクトがあるときに限り特殊な動作を指定することで加法操作に「過負荷」を掛けた方がより簡便になる.
上向きの値は,いわゆるオブジェクト指向のプログラミング手法を,部分的だが実現するのに使える.quat等のシンボルは特定の型のオブジェクトを表すので,quatに関した各種の上向きの値は「メソッド」を指定するために使える.メソッドとは,特定の操作が施されるときや,特定の「メッセージ」が受け取られるときに,quatオブジェクトがどう動作すべきかを定義するものを指す.
Ask a question about this page  |  Suggest an improvement  |  Leave a message for the team