人間の直感を直接表現できるプログラミング言語
コンピュータは非常に高速な代わりに、機械語という単純な命令列しか理解できません。そのため、プログラマはコンピュータにしてほしいことを全て形式的に記述する必要があります。
コンピュータ向けに翻訳することなしに、人間の直感を表現するというのは、非常に難しい問題です。私達が日常行っているコミュニケーションは、聞き手や読み手の補完によって成り立っています。例えば、数学書の記述は、書き手の数学的認識を、読み手が自身の頭の中に構築するためのヒントの羅列に過ぎません。内容を理解するには、ただ一通り読むだけでは足りなくて、相当の思考が必要です。
人間の直感の直接的な表現が存在しないことは、コンピュータの出現によって非常に重要な問題になりました。もしそのような表現が見つかれば、プログラミングにより、コンピュータに非常に少ない労力で仕事をさせることができます。そのような表現を用いてコンピュータに数学の理論を理解させることも可能です。そして、コンピュータが自動で未解決問題を解決したり、新たな理論を構築したりするようになるでしょう。また、コンピュータがそのような表現を用いた新たなプログラムを自動で生成することも可能になるでしょう。
いくつもの表現の抽象化の発見により、プログラミング言語は、直接かつ形式的に表現できる直感の範囲を広げてきました。しかしながら、人間の考えをコンピュータ向けに翻訳して記述せねばならない場面は未だにあります。そのような場面を見つけ、自身の直感を分析し、その直接的な表現を見出すことにより、私は新しいプログラミング言語Egisonを作るに至りました。
より柔軟なパターンマッチの表現を目指して
Egisonのアイデアを得たのは、2010年3月、私が学部4年生で卒業研究をしていた時です。私は、数学の一分野である整数論の定理を自動で予想し発見してくれるプログラムの作成をテーマに卒業研究をしました。当時から、数学の理論を自動で構築するプログラムの研究をしたいと考えていたからでした。
この卒業研究をした時に、従来の論理式による推論の表現は、人間の推論を表現するのに適していないと認識しました。論理式は論理自体の性質を論じるのには確かに便利であるのですが、どのように論理を使って推論するかということを考えるのには向いていないと考えたのでした。
このようにして、数学的推論の裏にある直感の直接的な表現が必要だと強く感じるようになりました。そして既存の表現のどこに問題があるのか考え、集合を扱う表現に大きな問題があることに気づきました。既存のプログラミング言語では集合(要素の順序構造と重複度を無視するコレクション型)を扱う際、要素の並びの順序を意識したリストとして捉える必要があるため、プログラムが煩雑になります。この問題を解決するために、集合のようなデータのパターンマッチも直接的に行える新しい表現について考え始めました。そうして生まれたのがプログラミング言語Egisonです。
Egisonについて考え始めた当初は、ポーカーの役判定の簡潔な記述を目標にしていました。既存のプログラミング言語でポーカーの役判定を行うプログラムを書いた場合、手持ちのカードの組み合わせを、リストとして捉えるため、煩雑になります。Egisonを使えば、手持ちのカードの組み合わせを直接、多重集合(要素の順序構造を無視するが重複度は考慮するコレクション型)としてパターンマッチを行えるため、非常に簡潔に記述できます。
図1:ポーカーの役判定のプログラム
全てのポーカーの役がそれぞれ1つのパターンで表現されていることに注目してください。初めて、このポーカーの役判定のプログラムの実行に成功した時、とても感動しました。それまで、誰も想像さえしていなかった表現を用いたプログラムを、記述し実行したのです。Egisonのアイデアを思い付いてから、1年以上試行錯誤して、この表現に行き着きました。
次に感動したのは、無限の結果を持つパターンマッチの実現に成功した時です。下記のプログラムは、双子素数を素数の無限リストから見つけ出し列挙します。パターンマッチの際の探索の範囲が無限に広がるため、その探索の順序を工夫する必要がありました。
図2:双子素数を列挙するプログラム
もう1つ非常に感動した瞬間は、静的スコープを保持したパターンのモジュール化に成功した時です。下記のプログラムは、麻雀の上がり判定を行います。雀頭、順子、刻子のパターンをモジュール化することにより、非常に簡潔に麻雀の上がり判定を記述しています。
パターン関数というパターンのみを引数に取りパターンを返す関数を用いてパターンのモジュール化を行うという制限により、パターン内の静的スコープを保つことに成功しました。このパターンのモジュール化を実現する理論は、Egisonを実現するための理論の中で、一番自信を持っている理論です。
図3:麻雀の上がり判定のプログラム
Egisonのコンセプトをシンプルな例で説明したドキュメントも用意しております。このドキュメントを理解すれば、上記3つのプログラムの詳細も理解していただけると思います。
実世界での応用例
Egisonには多くの実世界で役立つ応用の可能性があります。
アルゴリズムの実装
トリビアルな探索・列挙を行うループ処理を簡潔なパターンで記述できるようになるため、アルゴリズムの本質の記述により集中できるようになります。
例えば、上記のプログラムを他のプログラミング言語で書くと、煩雑なループ処理を幾つも記述する必要があります。それに対し、Egisonでは簡潔なパターンにより記述できています。
テストケースの生成
パターンを用いて、欲しいデータの組み合わせを列挙することが簡潔にできます。そのため、大量のテストデータを生成したり、テストケースを生成することが非常に簡潔にできます。
様々なデータ構造に対するクエリ言語
SQLに変わるリレーショナルデータベースに対するクエリ言語としても、Egisonのパターンマッチは非常に有用です。集合に対する柔軟なパターンマッチの表現を活かすことにより、複雑なWHERE節やサブクエリが必要なくなります。
グラフやツリー構造に対しても統一された方法でパターンマッチをEgisonは記述できます。
リレーショナルデータベースだけでなく、グラフデータベースに対しても適用可能なクエリ言語として、Egisonのパターンマッチを使うことができます。
プログラミングの問題を解く
CodeIQやProject Eulerの問題をEgisonでぜひ解いてみてください。
高速なアルゴリズムを考えるには、対象の中の法則性を見つけることが重要です。
Egisonを使うと、どのような法則があるのか小さなサンプルで実験して発見するのが、非常に楽になります。
複雑な場合分けを含む問題や、最終的なアルゴリズムに全探索を部分的に含む問題の場合、回答を計算するプログラムも簡潔になります。
直感とは何かを追求する
「直感的」という言葉は「わかりやすい」という意味で使われることが多いですが、直感自体は全く「直感的」なものではありません。それゆえに、直感の直接的な表現は多くの人にとって、最初はわかりやすくありません。
例えば、Haskellは難しいと言われることが多いですが、それは直感をより深く表現しているからです。一度理解すれば、直感的だと感じられるようになります。
直感を直感で捉えることにより直感は成長します。そうしてさらに直感を深く捉えられるようになります。
自身の直感を分析するのは非常に難しく根気のいる作業ですが、大きな成果の可能性がある仕事だと考えています。
Egisonについては日々研究・開発を続けると同時に、Egisonの理論を世に広めたいと考え論文も執筆しています。Egisonの今後にぜひご期待ください。
直近では、今月末開催の楽天テクノロジーカンファレンスにてEgisonについて発表する予定です。 無料で参加できますので、ぜひともお越しいただけたら幸いです。 (お昼までにお越しいただけましたら、弊社のカフェテリアで食事が楽しめます。こちらも無料です)
参考リンク
CodeIQ運営事務局よりお知らせ
楽天技術研究所・江木聡志さんから、Egisonに関するプログラミング問題を出題していただきました。
- Egison のサンプルコードを解読して四つ子素数をパターンマッチで見つけよう(締切:11月4日(火)AM10:00まで)
ぜひ、チャレンジしてくださいね!