Mathematica 9 is now available
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.
Mathematica > 属性 >

属性

f[x_]=x^2等の定義は,関数に特定の値を指定する.場合によっては,明示的な値は与える必要がないかもしれないが,一般的な関数の性質は指定しなければならないことがある.
関数の性質は,属性で指定することができる.例えば,Flatと呼ばれる属性を関数に付与しておくと,その関数は「平坦」な特性を持つことになる.つまり,引数の部分がネストすれば,自動的にそのネスト部が平坦化され,結合則が適用可能な状態になる.
属性Flatを関数fに割り当てる.
In[1]:=
Click for copyable input
ネスト構成が平坦化され,fは結合則が適用可能な関数になる.
In[2]:=
Click for copyable input
Out[2]=
Flatのような属性は評価の仕方だけでなくパターンマッチ等の操作にも影響する.このため,属性の指定は,関数を定義したり,変換規則を適用する前に行う必要がある.
平坦な関数fに関する定義を作る.
In[3]:=
Click for copyable input
fは平坦なので,先の定義はすべての引数に自動的に適用される.
In[4]:=
Click for copyable input
Out[4]=
Attributes[f]f の属性を参照する
Attributes[f]={attr1,attr2,...}f に複数の属性を一括で割り当てる
Attributes[f]={}f を属性なしとする
SetAttributes[f,attr]属性attrf に加える
ClearAttributes[f,attr]f の属性attr を除去する

シンボルの属性操作

fに割り当てられた属性を確認する.
In[5]:=
Click for copyable input
Out[5]=
fの属性をすべて取り除く.
In[6]:=
Click for copyable input
Out[6]=
Orderless交換則が適用する関数とする(引数は標準的順序に並び替る)
Flat結合則が適用する関数とする(引数は平坦化される)
OneIdentity関数をパターンマッチング用の引数の値に等しいとする(例:f[f[a]]a に等しい)
Listablef は引数であるリストの各要素に同じ関数を適用した関数とする (例:f[{a, b}]は{{f[a], f[b]})となる)
Constantf のすべての階の導関数がゼロの関数とする
NumericFunctionf は,引数を数値とすれば,関数の返す値も数値になるような特性を持つ関数とする
Protectedf の値は変更不可
Lockedf の属性は変更不可
ReadProtectedf の値は参照不可
HoldFirstf の第1引数は評価不可
HoldRestf の第1引数を除くすべては評価不可
HoldAllすべてのf の引数は評価不可
HoldAllCompletef の引数は完全に不活性なものとする
NHoldFirstf の第1引数はNによる数値計算不可
NHoldRestf の第1引数を除くすべてはNによる数値計算不可
NHoldAllすべてのf の引数はNによる数値計算不可
SequenceHold列(Sequence)オブジェクトからなるf の引数は平坦化不可
Temporaryf は不必要になると除去される局所変数として扱われる関数とする
Stubf が明示的に入力されたときにはNeedsが自動的に呼び出される

シンボルの属性一覧

組込み関数Plusがどんな属性を持っているか調べる.
In[7]:=
Click for copyable input
Out[7]=
重要な属性にListable(リスト可)がある.この属性は,すべての組込み済み数学関数に割り当てられている.この属性の関数に引数をリストとして与えると,関数頭部がリストの各要素に直接かかるように適用される(頭部をfとすると,fが「糸を縫う」ように各リスト要素に分配されることから,この分配操作は英語でスレッド(thread)とも呼ばれる).
組込み関数Logは属性Listableを持つ.
In[8]:=
Click for copyable input
Out[8]=
関数pListableと定義する.
In[9]:=
Click for copyable input
pは自動的に引数中のリストの各要素に分配される.
In[10]:=
Click for copyable input
Out[10]=
多くの属性は,適用先の関数の評価そのものに直接影響を与える.評価には影響しないが,他の面で影響を与える属性もある.例えば,属性OneIdentityはパターンマッチだけに影響する(「平坦な関数と順不同な関数」を参照).同様に,属性Constantは微分を計算するときか,微分に依存する操作が必要なときだけに有効になる.
属性Protectedは割当て操作に影響する.プロテクトの掛かったシンボルは再定義することができない.「組込み関数の変更」で説明した関数ProtectUnprotectを,SetAttributesClearAttributesの代りに使っても,プロテクトの有効化と解除を行うことができる.「組込み関数の変更」で触れたが,Mathematica が起動した時点では,ほとんどの組込み関数にプロテクトが掛かっている.このため,ユーザが誤って定義付けをしようとしてもできない.
関数gを定義する.
In[11]:=
Click for copyable input
Out[11]=
gの属性をProtectedにする.
In[12]:=
Click for copyable input
Out[12]=
今度は,gの定義は変更することができない.
In[13]:=
Click for copyable input
Out[13]=
特定のシンボルに割り当てた定義を参照するには?f と入力する(組込み関数にもこれに関連した機能を提供するものが各種あるので,それらを使ってもよい).参照禁止の属性ReadProtectedを変数や関数に付加しておけば,定義内容が参照できないようにすることができるようになっている.参照不可になっても,関係式自体は有効なままであり,引き続き評価に使うことができる.
gの定義式を変更することはできないが,参照することは可能である.
属性ReadProtectedを割り当てて,gを参照不可にする.
In[15]:=
Click for copyable input
今度は,gの定義内容は参照することができない.
SetAttributesClearAttributesのような関数を使えば,通常,変数や関数の属性をどのようにでも設定変更することができる.ただし,あらかじめ変数や関数に属性Lockedが割り当ててあるときは,属性の変更はできない.(新たに設けたMathematica セッションなら,ロックは解除されるので,この限りではない.)属性Lockedを属性Protectedと参照禁止の属性ReadProtectedに組み合せて使うことで,ユーザによる不用意な定義内容の参照や,変更を未然に防ぐことができる.
Clear[f]f に割り当てられている値を消去する(属性はそのまま維持される)
ClearAll[f]f の割当て値と属性をすべて消去する

値と属性の消去

上の例でpに属性Listableを与えたが,ここで,値と属性のすべてを消去する.
In[17]:=
Click for copyable input
属性を取ってしまったので,pは展開することができない.
In[18]:=
Click for copyable input
Out[18]=
関数に属性を与えるということは,Mathematica に対して評価や参照で特別な性質を考慮するよう指示することを意味する.通常,一度与えられた性質は常に有効だが,場合によっては,限られた状況下でだけそれを有効にしたいかもしれない.そのようなときは,属性は直接使わずに,代りに,特殊な関数を呼び出すことでその属性に関連付けられた変換を行うことも可能である.
Threadを直接作用させ,pListableのときに自動的に行われる変換操作を強制する.
In[19]:=
Click for copyable input
Out[19]=
OrderlessSort[f[args]]
FlatFlatten[f[args]]
ListableThread[f[args]]
ConstantDt[expr,Constants->f]

属性に関連した変換操作を行うための関数

属性は単一シンボルに対してのみ恒久的に定義される.ただし,属性付きの純関数を構築することで,一時的にしか有効でない属性を備えた関数を定義することは可能である.
Function[vars,body,{attr1,...}]属性attr1, ... を備えた純関数を定義する

属性を備えた純関数

この純関数では,pをリスト全体に適用する.
In[20]:=
Click for copyable input
Out[20]=
属性Listableを加えておくと,pがリストの各要素に分配されるようになる.
In[21]:=
Click for copyable input
Out[21]=
Ask a question about this page  |  Suggest an improvement  |  Leave a message for the team