ガジェット通信

見たことのないものを見に行こう

数式処理システムとしてのプログラミング言語Egisonの紹介

DATE:
  • ガジェット通信を≫

シンボリックな計算とは

シンボリックな計算とは、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乗根を計算したプログラムを用意しています。
1の5乗根の計算
1の7乗根の計算
1の9乗根の計算
1の17乗根の計算

パターンマッチによる微分の定義

Egisonによる数式処理システムの一番大きな特徴は、Egison独自のパターンマッチを数式に対して適用できることにあります。

例えば、微分はEgisonのパターンマッチにより以下のように数十行のプログラムで定義できます。

この微分関数は以下のように動作します。

ここで、上記に現れるf|1、f|2は、それぞれ関数fを1つめ、2つめの引数で微分することによって得られる関数を表しています。

この微分関数を利用して、入力された関数のテイラー展開を計算するプログラムは以下のように定義できます。

このプログラムを利用してオイラーの公式を確かめることができます。

またもう少し複雑な微分の計算例として、極座標のラプラシアンの検算と導出をしています。
2次元極座標のラプラシアンの計算
3次元極座標のラプラシアンの計算

このようにパターンマッチの表現力を活かして、ここでデモした微分以外のいろいろな数学の理論についても、数十行のプログラムで実装し、実験できる処理系を目指して開発を進めています。

クオート式による式展開の制御

数式処理システムの設計において、式展開をどのように制御するかは非常に重要な問題です。

式展開の制御について、Egisonによる数式処理システムには、以下に述べるような動作をするクオート式の導入というオリジナルの工夫が実装されています。

‘が先頭に付いている式をクオート式と呼びます。
‘に続く式はクオートされた式と呼ばれます。
クオートされた式は評価され展開されます。

しかし、その展開された式は1つのまとまった式として扱われ、他の式と足したり、掛けたりしても、それ以上は展開されません。

意外にも、このクオート式を用いるだけでも、まるでノートで計算するように式の展開を制御することができます。

以下の例はクオート式が効果的に使われているある程度大きな規模の計算の例です。計算の要所々々にクオート(‘)を挿入することにより、長い計算でも自動で紙の上で計算するように制御することができます。
曲面のガウス曲率の計算
トーラスのリーマン曲率テンソルの計算

組み込みデータ型としてテンソルのサポート

テンソルの扱いについていくつか細かい工夫をしています。

Egisonは、タプルや配列と同様に、組み込みデータ型としてテンソルをサポートしています。

そうすることにより、ベクトル解析や、テンソル解析で使われているテンソル計算の表記を、ほぼそのままプログラミングに持ち込んでいます。

いくつか具体例を見てみましょう。

2引数関数の引数の両方が、ベクトルである場合をまず見ていきます。
ベクトルは[|、|]で要素を囲むことにより表現されます。

またベクトルの後に、_とそれに続いて数をつなげることにより、添字付きのベクトルを表現できます。

添字は自然数であることもあれば、シンボルであることもあります。
それぞれのベクトルに対する添字が同じシンボルである場合、以下のように、対応する要素ごとに計算が行われます。

添字が指定されていない場合、テンソル積の形で計算されます。
それぞれの添字が異なる場合も、テンソル積の形で計算されます。
この場合、ベクトルとベクトルからは行列が生成されます。

スカラーとベクトル・ベクトルと行列のように階数が異なるテンソルの演算も以下のように可能になっています。

上記の例は、関数の引数がテンソルである場合でしたが、関数がテンソルである場合にも対応する自然な処理があります。

内積を計算するには、contract式を用います。

アインシュタインの縮約記法を実現するようにこのcontract式の挙動は設計されており、同じシンボルの上添字と下添字がある場合、その箇所をcontract式の第一引数で指定された演算により縮約します。

これらの記法を組み合わせると、ベクトル解析において重要な演算子、ナブラやdiv(発散)、rot(回転)なども簡潔に記述できます。

ある程度の規模になる計算の例として、リーマン曲率テンソル(空間の曲がり具合を表現する4階のテンソル)を計算するプログラムがあります。

リーマン曲率テンソルは一般相対性理論の記述の際に重要な役目を果たすテンソルです。

具体的にこのテンソルの値を計算するのは少々煩雑なのですが、Egisonを使うと、教科書に載っている定義を記述するだけで、計算することができます。
球面のリーマン曲率テンソルの計算
トーラスのリーマン曲率テンソルの計算

今後の展開

数学や物理で現れるあらゆる計算を、ライブラリを使わなくとも小さなコードでユーザが実現できるシステムを目指し、開発を進めています。

数学や物理の教科書を紐解くと、現在のプログラミング言語では簡単に定義できない概念を多く見つけることができます。

このような概念に対する操作は、これらの概念についてのあらゆる操作を含んだライブラリを提供することにより、サポートされているので、一見すでに簡単になっていると思う方もいるかもしれません。

しかし、これでは、複雑さがライブラリに凝縮されているだけであり、プログラマはライブラリが提供している関数の使い方を多く知らなければ、プログラムを書けないという問題点もあります。

現在のプログラミング言語では簡単に定義できない概念でも、言語レベルで新しい抽象化を実現すれば、簡単にプログラム上で表現できるようになる可能性があります。

シンプルな言語仕様とそれほど多くない組み込み関数さえ覚えていれば、簡単に記述できる計算の範囲を、20世紀の数学や物理の計算にまで広げようとしているのが最近のEgison開発における目標です。

本記事では、複数の数学の分野についての現在のEgisonの数式処理の表現をかなり駆け足でお見せしましたがが、今後の連載では、それぞれの分野について掘り下げて解説する予定です。

1〜数行のプログラムをいろいろ試しているうちに、数学の勘所もわかってしまうという言語と記事を目指しますので、ぜひご期待ください。

関連リンク

Egison公式サイト
Egisonのソースコード (GitHub)
Egison数学ノート
パターンマッチ指向プログラミング言語Egison紹介(第3回)
パターンマッチ指向プログラミング言語Egison紹介(第2回)
パターンマッチ指向プログラミング言語Egison紹介(第1回)

CodeIQ運営事務局よりお知らせ

楽天技術研究所・江木聡志さんから、Egisonに関するプログラミング問題を出題していただきました。

ぜひ、チャレンジしてくださいね!

カテゴリー : デジタル・IT タグ :
CodeIQ MAGAZINEの記事一覧をみる ▶
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。

TOP