式
Wolfram言語では数式,リスト,グラフィックス等各種のオブジェクトを扱うことができる.見掛けはずいぶんと違うが,Wolfram言語では,すべてが統一的に表現される.つまり,すべては「式」として表される.
式の記述に,いつも f[x,y,…]の書式を使う必要はない.例えば,足し算式なら,x+yと書いてもよい.しかし,一旦,Wolfram言語にx+yと入力されたなら,この式は,Plus[x,y]とされ,違った形に変換される.また,表示されるときは,再び,x+yの形式に逆変換される.
式の完全形を確認するには,FullForm[expr]と入力する.
式 f[x,y,…]においてオブジェクト f は式の「頭部」と呼ばれる.これは,先頭に位置するのでそう呼ばれる.式の頭部が何か調べるにはHead[expr]の機能を使う.計算プログラムを作る際に,式がどんなものか知る必要がよくあるが,そのようなときにこの機能を使い頭部を調べるとよい.
ここでは,Headは「演算子」の名前を返す:
式の概念は,Wolframシステムにおいて中核的で統一的な原理である.Wolframシステムの扱うすべてのオブジェクトは同じ基本構造を持つという事実が,Wolframシステムを限られた数の基本操作だけで多くの領域に対応することができるものとしている.
f
の意味
|
x,y,…
の意味
|
例
|
Function(関数) | 引数,パラメータ | Sin[x]
,
f[x,y] |
コマンド | 引数,パラメータ | Expand[(x+1)^2] |
演算子 | 演算数 | x+y
,
a=b |
Head(頭部) | 要素 | {a,b,c} |
オブジェクトの型 | 内容 | RGBColor[r,g,b] |
さらに,重要な式の使い方として,他の関数を適用させることができる構造体の保持がある.例えば,式{a,b,c}は演算操作を保持するのではなく,3成分からなるリスト形式の構造体の構築を保持するために使われる.この構造体には,ReverseやDot等の他の関数を作用させることができる.
完全形の式を使うことで任意の構造体を構築することができる.例として,3つの座標で決定される,3D空間の点を表した構造体を考える.点は英語でポイントというので,point[x,y,z]で表すことにする.リストと同じように,このpoint構造体も何も操作は行わない.単に,3座標をまとめて保持し,その結果としてのオブジェクトにラベルpointを付けたに過ぎない.
point[x,y,z]等の式は,特定の頭部が名札として付けられた「データの集合体」ととらえることもできる.すべての式は同じ構造を持つが,式の「型」は,違った頭部が与えられるとき当然変わり得る.このため,式の取る型に応じて式を違った方法で扱う変換規則やプログラムを設定することができる.
Wolfram言語では,多くの慣用的な演算子に対して特別な表記を使えるようになっている.例えば,二項の加算は,Wolframシステム内部ではPlus[x,y]と表されるが,その入力は,慣用的な形を使い x+y とすればよい.
Wolfram言語には特定の文法が備わっており,入力はそれに従って内部表記へ変換される.文法の規則に入力成分のまとめ方に関するものがある.例えば,この規則によると,a+b^cと入力された式は,a+(b^c)に等しいとされるが,(a+b)^cには等しくない.これは,ベキ乗(^)は加算(+)より優先順位が高いとする標準的な数学表記法に基づいた規則である.一般的に,優先順位が高ければ高いほど,その演算項は先にまとめられる.
Wolfram言語で使われるすべての特殊入力形には特定の優先順位が割り当てられている.このことは,慣用数学の演算子に限らず,例えば,「->」や「:=」の入力形や,Wolfram言語プログラムにおける複文形式の式と式の間を区切るセミコロンにもいえる.
「演算子の入力形」の表に,Wolfram言語で使えるすべての演算子の優先順位を高い順に掲載した.順位の決定は数学の標準的な使い方が基本になっており,丸カッコをなるべく使わなくて済むように考えられている.
それでも,カッコを使わなければいけない場合は結構ある.例えば,セミコロン(;)はイコール(=)より順位が低い.したがって,x=(a;b)には,丸カッコを入れておく必要がある.もし式をx=a;bとしたなら,(x=a);bと解釈されてしまう.一般論として,丸カッコを付けすぎるということはない.その逆に,付け惜しむと,予期しなかった順序で式の項が読み取られてしまい,計算に思わぬ間違いが生じてしまうことがある.
演算子は上記の表記形のどれかを取る.例えば,式 x+y のプラス記号+は「中置」演算子であり,「-p」におけるマイナス記号-は「前置」演算子である.さらに,f[x,y,…]等の式を入力するときは,それを,中置,前置,後置形式で記述することもできる.
「結果的」に,N等の関数を後置的に加えることも可能である:
気が付かれたかもしれないが,二重スラッシュ記号(//)には非常に低い優先順位が割り当てられている.このため,//f と,式の末尾に関数の頭部を加えると,式が四則演算でも論理演算の式であっても,頭部 f は式全体にかかってしまう.つまり,x+y//fとすると,f[x+y]と解釈される.x+f[y]とはならない.
前置形演算子@には高い優先順位が与えられている.このため,f@x+yは,f[x+y]ではなく,f[x]+yと解釈される.f[x+y]に等しい式を記述するには,前置形式を使いf@(x+y)とし,引数を丸カッコでくくる.
リストが単に式の一形態であることはすでに説明した通りだが,その逆に,一般的な式もリストと同様に使えたとしても驚かないだろう.リストの各成分を個別に参照できるように,一般的な式の部分もまた個別に参照することができる.
添数の式の部分への割当ては,FullFormによるWolfram言語内部の表記形に従って行われる.これらの表記形は,必ずしも表示に現れる順番に対応しない.このことは,標準内部表記が使われるが,特別な形で表示される代数式に対して特に当てはまる.
Part[expr,n] または expr[[n]] | 式 expr の第 部分を抽出する |
Part[expr,{n1,n2,…}] または expr[[{n1,n2,…}]] | |
複数部分の抽出 | |
Part[expr,n1;;n2] | 式の部分 から |
ReplacePart[expr,n->elem] | 式 expr の第 要素を elem で置換する |
「リスト要素の操作」において,添数のリストを作り,それをもとにリストから複数の要素を一括抽出する方法を説明した.それと全く同じやり方で,一般式の複数の部分も一括抽出することができる.
「リスト」で説明したリストの操作機能は,一般式にも同様に使える.それらの機能を使い式の構造をどのようにでも操作することができる.
式の構造を操作するすべての関数は,式の内部表記形に対して働く.これらの形は,FullForm[expr]を使うことで見ることができる.内部表記形は,必ずしも表示される式の形ではない.
Appendを使うと,引数を追加することができる:
上記の他にも式の部分操作を行うための関数がいくつかある.詳しくは,「構造操作」を参照のこと.
TreeFormを使うと,式の「木」構造を表示させることができる:
すべてのWolfram言語の式は木と考えることができる.例えば,上記の式を例に取ると,ノードの頂点はPlus項であり,頂点から「枝分かれ」する2つの枝は,x^3と(1+x)^2である.ノードx^3からは,さらに2つの枝,xと3が伸びる.これらは,木構造の「葉」と見ることができる.
関数Partを使えばWolfram言語式の特定部分だけを参照することができる.しかし,式の構造がほとんど一様ならば,複数部分に一括で参照することができた方が通常便利になる.
式の複数部分をまとめて指定するには,レベル指定に基づいた,一般化された方法を使う.多くの Wolfram言語関数では,それらを式の特定部分に作用させるとき,作用対象になるレベル位置を指定することができるようになっている.
レベルを使ったPositionの制御
普通のレベルの使い方が分かってきたところで,今度は,負のレベルの使い方を見てみる.レベルに負の値を指定すると,木構造の最下位から数えた部分を指すことができる.例えば,レベル-1には,木の葉の部分に当たるすべてのシンボルや数のオブジェクトが含まれる.