Egison version 3.6.0から、数式処理機能が実装されました。 Egison独自のパターンマッチを数式に対して応用することにより、ユーザーによって簡単に拡張可能なシステムであることが、この数式処理システムの大きな特徴となっています。 このEgison上に実装された数式処理システムについてご紹介します。
シンボリックな計算とは
シンボリックな計算とは、x + x = 2x
や(x + y)^2 = x^2 + 2 x y + y^2
のようにx
やy
といったシンボルをプログラム上で数と同様に扱い計算することをいいます。
シンボリックな計算をサポートしている既存の数式処理システムとしては、Mathematicaや、Maxima、Pythonの拡張ライブラリとして実装されているSymPyなどが有名です。
最新のEgisonは以下のようにシンボリックな計算をサポートしています。
i^2
を-1
に変換するような書き換え規則は、Egisonのパターンマッチを用いてライブラリで定義されています。
ユーザーが新たに書き換え規則を追加することも可能です。
シンボリックな計算を用いることにより、代数的数を浮動小数点数で近似することなく、扱うことができます。 例えば、以下のように、二次方程式の解の公式を用いて、二次方程式の解を計算することができます。
この発展的な例として、幾つかのnについて1のn乗根を計算したプログラムを用意しています。
パターンマッチによる微分の定義
Egisonによる数式処理システムの一番大きな特徴は、Egison独自のパターンマッチを数式に対して適用できることにあります。 例えば、微分はEgisonのパターンマッチにより以下のように数十行のプログラムで定義できます。
この微分関数は以下のように動作します。
この微分関数を利用して、入力された関数のテイラー展開を計算するプログラムは以下のように定義できます。
このプログラムを利用してオイラーの公式を確かめることができます。
またもう少し複雑な微分の計算例として、極座標のラプラシアンの検算と導出をしています。
このようにパターンマッチの表現力を活かして、ここでデモした微分以外の色々な数学の理論についても、数十行のプログラムで実装し、実験できる処理系を目指して開発を進めています。
クオート式による式展開の制御
数式処理システムの設計において、式展開をどのように制御するかは非常に重要な問題です。 式展開の制御について、Egisonによる数式処理システムには、以下に述べるような動作をするクオート式の導入というオリジナルの工夫が実装されています。
'
が先頭に付いている式をクオート式と呼びます。
'
に続く式はクオートされた式と呼ばれます。
クオートされた式は評価され展開されます。
しかし、その展開された式は1つのまとまった式として扱われ、他の式と足したり、掛けたりしても、それ以上は展開されません。
意外にも、このクオート式を用いるだけでも、まるでノートで計算するように式の展開を制御できることがあります。
以下の例はクオート式が効果的に使われているある程度大きな規模の計算の例です。
計算の要所々々にクオート('
)を挿入することにより、長い計算でも自動で紙の上で計算するように制御されています。
組み込みデータ型としてテンソルのサポート
テンソルの扱いについていくつか細かい工夫をしています。 Egisonは、タプルや配列と同様に、組み込みデータ型としてテンソルをサポートしています。 そうすることにより、ベクトル解析や、テンソル解析で使われているテンソル計算の表記を、ほぼそのままプログラミングに持ち込んでいます。
いくつか具体例を見てみましょう。
2引数関数の引数の両方が、ベクトルである場合をまず見ていきます。
ベクトルは[|
、|]
で要素を囲むことにより表現されます。
またベクトルの後に、_
とそれに続いて数をつなげることにより、添字付きのベクトルを表現できます。
添字は自然数であることもあれば、シンボルであることもあります。
それぞれのベクトルに対する添字が同じシンボルである場合、以下のように、対応する要素ごとに計算が行われます。
添字が指定されていない場合、テンソル積の形で計算されます。 それぞれの添字が異なる場合も、テンソル積の形で計算されます。 この場合、ベクトルとベクトルからは行列が生成されます。
スカラーとベクトル・ベクトルと行列のように階数が異なるテンソルの演算も以下のように可能になっています。
上記の例は、関数の引数がテンソルである場合でしたが、関数がテンソルである場合にも対応する自然な処理があります。
内積を計算するには、contract
式を用います。
アインシュタインの縮約記法を実現するようにこのcontract
式の挙動は設計されており、同じシンボルの上添字と下添字がある場合、その箇所をcontract
式の第一引数で指定された演算により縮約します。
これらの記法を組み合わせると、ベクトル解析において重要な演算子、ナブラやdiv(発散)、rot(回転)なども簡潔に記述できます。
ある程度の規模になる計算の例として、リーマン曲率テンソル(空間の曲がり具合を表現する4階のテンソル)を計算するプログラムがあります。 リーマン曲率テンソルは一般相対性理論の記述の際に重要な役目を果たすテンソルです。 具体的にこのテンソルの値を計算するのは少々煩雑なのですが、Egisonを使うと、教科書に載っている定義を記述するだけで、計算することができます。
今後の展開
方程式のサポート
上に挙げた例はすべて方程式の解を導出するプログラムでしたが、処理対象のデータとして方程式もサポートし、方程式自体も導出できるようになる予定です。 また、方程式に対するパターンマッチを適用することにより、微分方程式を分類したり、変形し解くプログラムも容易に記述することができるようになります。
グラフィックのサポート
既存の数式処理システムと同様にグラフの描画もサポートする予定です。