|
2.5.12 組込み関数の変更
変換規則は,どのような式にでも定義することができる.ユーザ定義の関数だけに限らず, Mathematicaに組込み済みの内部関数についても同様である.このため,変換規則を使い,組込み関数の機能を拡張したり,目的に合うように変更したりすることができる.
この機能は強力であるとともに危険性もはらんでいる. Mathematicaは,与えられた規則をそのまま適用する.間違った規則が与えられると, Mathematicaの答も間違ったものになってしまう.
誤入力による組込み関数の変更がないように,すべての組込み関数には「プロテクト(保護)」がかけられており,再定義ができないようになっている.このため,組込み関数に関して定義を与えるに は,まず,この保護機能を解除する必要がある.そして,定義を与えた後には,将来の誤入力を防ぐために再度保護機能を有効にしておく.

関数の保護・解除
Log等の組込み関数は通常「プロテクト」されているので,再定義はできない.
In[1]:= Log[7] = 2

Out[1]= 
組込み関数 Logのプロテクトを解除する.
In[2]:= Unprotect[Log]
Out[2]= 
数学的には間違いだが,それでも,定義はできてしまう.
In[3]:= Log[7] = 2
Out[3]= 
定義が間違っていても,そのまま使われてしまう.
In[4]:= Log[7] + Log[3]
Out[4]= 
Logの正しくない定義を取り除く.
In[5]:= Log[7] =.
Logをプロテクトし直す.
In[6]:= Protect[Log]
Out[6]= 
ユーザ指定の定義は, Mathematicaの組込み機能を上書きしてしまう.また,ユーザの定義は,通常,組込み定義より先に使われる.
Mathematicaに組込み済みの規則は,なるべく多くの計算問題に対応できるように作られている.それでも,問題が非常に特殊なものだと,組込み定義ではユーザの使いたい特別な計算手法に対応できない場合も出てくる.そのようなときは,ユーザ自身で特別な規則を構築し,組込み規則を上書きしておく.
Exp[Log[expr]]を簡約するための組込み関数がある.
In[7]:= Exp[Log[y]]
Out[7]= 
しかし,ここでは,カスタムの定義を作り,組込み規則は上書きしておく.
In[8]:= ( Unprotect[Exp] ; Exp[Log[expr_]] := explog[expr] ; Protect[Exp] ; )
新定義が使われ,組込み定義は無視される.
In[9]:= Exp[Log[y]]
Out[9]= 
|