構造操作

Wolframシステムは,式の構造を変更するための強力な基本機能を備えている.それらの機能を使うことで,結合則や分配則等の数学的性質を規定することができ,また,分かりやすくて効率的なプログラムの土台を作ることができる.

ここでは式の構成そのものを操作する方法を説明する.「属性」において,式の頭部に対して適切な属性を割り当てることで,そのいくつかの操作を特定の頭部を備えたすべての式に自動的に適用可能にする方法を説明する.

Wolframシステムの関数Sort[expr]を使うことで,リストだけでなく,任意の頭部を持った式に対してその構成要素の並べ替えを行うことができる.この関数を使えば,結合性や対称性の数学的性質を任意関数に与えることができるようになる.

Sortを使い引数リストを標準的順序に並べ替える.
In[1]:=
Click for copyable input
Out[1]=
Sort[expr]リストや式の要素を標準的順序で並べ替える
Sort[expr,pred]並べ替え順序を決める関係判定式 pred を使い式の要素を並べ替える
Ordering[expr]並べ替えたときの要素の順序を与える
Ordering[expr,n]並べ替えたときの最初の n 個の要素の順序を与える
Ordering[expr,n,pred]関係判定式 pred により並べ替えたときの最初の n 個の要素の順序を与える
OrderedQ[expr]expr の要素が標準的順序で並んでいるときはTrueを返し,そうでなければFalseを返す
Order[expr1,expr2]の前に位置するときはを返し,後ろに位置するときはを返す

並べ替え操作と順序の判定

このSort式に与えた第2引数は,ペア要素が正しく並んでいるかどうかを判断するための条件式である.実行すると,リストの要素が降順に並べ替えられる.
In[2]:=
Click for copyable input
Out[2]=
条件式を与え,に依存しない項が先にくるよう並べ替える.
In[3]:=
Click for copyable input
Out[3]=
Flatten[expr]expr と同じ頭部を持つすべてのネストした関数を平坦化 (フラット)する
Flatten[expr,n]n 番目以下のレベルでネストした関数を平坦化する
Flatten[expr,n,h]頭部 h を持つ関数を平坦化する
FlattenAt[expr,i]expr の第 i 要素のみを平坦化する

式の平坦化

Flattenは,ネストした関数を平坦化してくれる.
In[4]:=
Click for copyable input
Out[4]=
Flattenを使えば,リストや式に連番要素を「つぎはぎ」的に取り込むことができる.
In[5]:=
Click for copyable input
Out[5]=

Flattenを使い,数学でいう結合則に従った式を作成することができる.また,関数Distributeを使えば,分配性や線形性等の性質を持った式を構成することもできる.

Distribute[f[a+b+,]]f を加法式に分配し,式 を構成する
Distribute[f[args],g]頭部 g を持った引数に f を分配する
Distribute[expr,g,f]式の頭部が f のときだけに分配する
Distribute[expr,g,f,gp,fp]fg に分配し,それらをそれぞれ fpgp で置換する

分配則の適用

を式の各項に分配する.
In[6]:=
Click for copyable input
Out[6]=
より複雑な例を示す.
In[7]:=
Click for copyable input
Out[7]=

fPlus式に分配させると,通常,のような式は の形に「展開」される.関数Expandは,同様な操作をTimes等の標準的な代数演算子に対して行う.これに対して,Distributeを使うと,分配操作を任意の演算子について行うことができるようになる.

Expandは,Timesの分配則をPlus項に適用することで代数式の展開を行う.
In[8]:=
Click for copyable input
Out[8]=
今度は加法式ではなく,リストにを分配させる.結果は,引数の組合せからなるすべての可能なペアを含んでいる.
In[9]:=
Click for copyable input
Out[9]=
リストに分配させるが,今度は,式の頭部がだけの場合に限り分配を行う.
In[10]:=
Click for copyable input
Out[10]=
式全体の頭部がのものに限りリストに分配操作を実施する.得られた結果では,Listの代りにが使われ,の代りにが使われる.
In[11]:=
Click for copyable input
Out[11]=

Distributeに関連した関数にThreadがある.Threadは,リストや式の要素に対して並列的に関数を適用させることができる.

Thread[f[{a1,a2},{b1,b2}]]f をリスト形の各引数に並列的に適用し,式を構成する
Thread[f[args],g]頭部 g を持った args の成分についてだけ並列的な関数の適用を行う

式への並列的な関数の適用

引数がリストである関数を入力する.
In[12]:=
Click for copyable input
Out[12]=
Threadを使い関数をリストの各要素に並列に適用する.
In[13]:=
Click for copyable input
Out[13]=
リスト形式でない引数は繰り返し使われることになる.
In[14]:=
Click for copyable input
Out[14]=

「オブジェクトの集合を作る」と,さらに,「属性」でより詳しく説明してあるが,Wolframシステムの組込み関数の多くは,そのままでリストに対して並列的に作用することができる.このため,引数として現れるリストなら,その要素に対して並列的に作用することができる.

Logのような組込み済みの数学関数は,リスト要素に直接適用可能なので,自動的にリストの各要素に作用する.
In[15]:=
Click for copyable input
Out[15]=
しかし,Logは方程式の項には自動的に適用されない.
In[16]:=
Click for copyable input
Out[16]=
それでも,Threadを使えば,方程式の両辺に関数を作用させることができる.
In[17]:=
Click for copyable input
Out[17]=
Outer[f,list1,list2]一般化された外積
Inner[f,list1,list2,g]一般化された内積

一般化された内積と外積

Outer[f,list1,list2]は,複数リスト の要素を可能な限りの組合せで掛け合せ,その結果を f と組み合せる.Outerは,「テンソル」で説明するテンソルの直積集合を一般化したものととらえることができる.

Outerは,要素の可能な限りの組合せを作り,それらにを適用する.
In[18]:=
Click for copyable input
Out[18]=
この例では,Outerは,ブール値の下三角行列を生成する.
In[19]:=
Click for copyable input
Out[19]=
頭部が同じ式からなる式の列であれば,どんな列にでもOuterを適用することができる.
In[20]:=
Click for copyable input
Out[20]=

Distributeと同様にOuterはあらゆる組合せによる項を生成する.これに対して,Threadに似ているInnerは,位置が同じ要素同士だけを組み合せた項を生成する.

これは,Innerで構築された構造体である.
In[21]:=
Click for copyable input
Out[21]=
Innerは,Dotが一般化されたものである.
In[22]:=
Click for copyable input
Out[22]=