組込み関数の変更

変換規則は,どのような式にでも定義することができる.ユーザ定義の関数だけに限らず,Wolfram言語に組込み済みの内部関数についても同様である.このため,変換規則を使い,組込み関数の機能を拡張したり,目的に合うように変更したりすることができる.

この機能は強力であるとともに危険性もはらんでいる.Wolfram言語は,与えられた規則をそのまま適用する.間違った規則が与えられると,Wolfram言語の答も間違ったものになってしまう.

誤入力による組込み関数の変更がないように,すべての組込み関数には「プロテクト(保護)」がかけられており,再定義ができないようになっている.このため,組込み関数に関して定義を与えるには,まず,この保護機能を解除する必要がある.そして,定義を与えた後には,将来の誤入力を防ぐために再度保護機能を有効にしておく.

Unprotect[f]プロテクトを解除する
Protect[f]プロテクトを有効にする

関数の保護・解除

Log等の組込み関数は通常「プロテクト」されているので,再定義はできない.
In[1]:=
Click for copyable input
Out[1]=
組込み関数Logのプロテクトを解除する.
In[2]:=
Click for copyable input
Out[2]=
これでLogに対して自分の定義が与えられるようになった.数学的には間違いだが,それでも,定義はできてしまう.
In[3]:=
Click for copyable input
Out[3]=
定義が間違っていても,そのまま使われてしまう.
In[4]:=
Click for copyable input
Out[4]=
Logの正しくない定義を取り除く.
In[5]:=
Click for copyable input
Logをプロテクトし直す.
In[6]:=
Click for copyable input
Out[6]=

ユーザ指定の定義は,Wolfram言語の組込み機能を上書きしてしまう.また,ユーザの定義は,通常,組込み定義より先に使われる.

Wolfram言語に組込み済みの規則は,なるべく多くの計算問題に対応できるように作られている.それでも,問題が非常に特殊なものだと,組込み定義ではユーザの使いたい特別な計算手法に対応できない場合も出てくる.そのようなときは,ユーザ自身で特別な規則を構築し,組込み規則を上書きしておく.

Exp[Log[expr]]を簡約するための組込み関数がある.
In[7]:=
Click for copyable input
Out[7]=
ここでは,Exp[Log[expr]]に対するカスタムの定義を作り,組込み規則は上書きする.
In[8]:=
Click for copyable input
新定義が使われ,組込み定義は無視される.
In[9]:=
Click for copyable input
Out[9]=