構造操作
Mathematica は,式の構造を変更するための強力な基本機能を備えている.それらの機能を使うことで,結合則や分配則等の数学的性質を規定することができ,また,分かりやすくて効率的なプログラムの土台を作ることができる.
ここでは式の構成そのものを操作する方法を説明する.「属性」において,式の頭部に対して適切な属性を割り当てることで,そのいくつかの操作を特定の頭部を備えたすべての式に自動的に適用可能にする方法を説明する.
Mathematica の関数Sort[expr]を使うことで,リストだけでなく,任意の頭部を持った式に対してその構成要素の並べ替えを行うことができる.この関数を使えば,結合性や対称性の数学的性質を任意関数に与えることができるようになる.
Sortを使い引数リストを標準的順序に並べ替える.
| 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引数は,ペア要素が正しく並んでいるかどうかを判断するための条件式である.実行すると,リストの要素が降順に並べ替えられる.
| Out[2]= |  |
条件式を与え,

に依存しない項が先にくるよう並べ替える.
| Out[3]= |  |
| Flatten[expr] | 式 expr と同じ頭部を持つすべてのネストした関数を平坦化 (フラット)する |
| Flatten[expr,n] | n 番目以下のレベルでネストした関数を平坦化する |
| Flatten[expr,n,h] | 頭部 h を持つ関数を平坦化する |
| FlattenAt[expr,i] | 式 expr の第 i 要素のみを平坦化する |
式の平坦化
| Out[4]= |  |
Flattenを使えば,リストや式に連番要素を「つぎはぎ」的に取り込むことができる.
| Out[5]= |  |
Flattenを使い,数学でいう結合則に従った式を作成することができる.また,関数Distributeを使えば,分配性や線形性等の性質を持った式を構成することもできる.
分配則の適用

を式

の各項に分配する.
| Out[6]= |  |
| Out[7]= |  |
f をPlus式に分配させると,通常,
のような式は
の形に「展開」される.関数Expandは,同様な操作をTimes等の標準的な代数演算子に対して行う.これに対して,Distributeを使うと,分配操作を任意の演算子について行うことができるようになる.
| Out[8]= |  |
今度は加法式ではなく,リストに

を分配させる.結果は,引数の組合せからなるすべての可能なペアを含んでいる.
| Out[9]= |  |
リストに分配させるが,今度は,式の頭部が

だけの場合に限り分配を行う.
| Out[10]= |  |
式全体の頭部が

のものに限りリストに分配操作を実施する.得られた結果では,
Listの代りに

が使われ,

の代りに

が使われる.
| Out[11]= |  |
Distributeに関連した関数にThreadがある.Threadは,リストや式の要素に対して並列的に関数を適用させることができる.
| Thread[f[{a1,a2},{b1,b2}]] | f をリスト形の各引数に並列的に適用し,式 を構成する |
| Thread[f[args],g] |  |
式への並列的な関数の適用
| Out[12]= |  |
| Out[13]= |  |
リスト形式でない引数は繰り返し使われることになる.
| Out[14]= |  |
「オブジェクトの集合を作る」と,さらに,「属性」でより詳しく説明してあるが,Mathematica の組込み関数の多くは,そのままでリストに対して並列的に作用することができる.このため,引数として現れるリストなら,その要素に対して並列的に作用することができる.
Logのような組込み済みの数学関数は,リスト要素に直接適用可能なので,自動的にリストの各要素に作用する.
| Out[15]= |  |
しかし,
Logは方程式の項には自動的に適用されない.
| Out[16]= |  |
それでも,
Threadを使えば,方程式の両辺に関数を作用させることができる.
| Out[17]= |  |
| Outer[f,list1,list2] | 一般化された外積 |
| Inner[f,list1,list2,g] | 一般化された内積 |
一般化された内積と外積
Outer[f, list1, list2]は,複数リスト
と
の要素を可能な限りの組合せで掛け合せ,その結果を f と組み合せる.Outerは,「テンソル」で説明するテンソルの直積集合を一般化したものととらえることができる.
Outerは,要素の可能な限りの組合せを作り,それらに

を適用する.
| Out[18]= |  |
この例では,
Outerは,ブール値の下三角行列を生成する.
| Out[19]= |  |
頭部が同じ式からなる式の列であれば,どんな列にでも
Outerを適用することができる.
| Out[20]= |  |
Distributeと同様にOuterはあらゆる組合せによる項を生成する.これに対して,Threadに似ているInnerは,位置が同じ要素同士だけを組み合せた項を生成する.
| Out[21]= |  |
| Out[22]= |  |