[制約プログラミング落穂拾い] 宣言性の光と影(1)

|

制約プログラミングの定義は色々と考えられるでしょうが、恐らく落とすことのできない特徴の一つとして必ず含まれるのは「宣言性」という特徴ではないでしょうか。今回から数回にわたって、「宣言性」について思うところを少し書いてみたいと思います。もっとも「宣言性」は非常に奥の深いテーマですから、ここで触れるのは、実際に制約プログラミングを実用的な問題の解決に使ったり、他人に説明したりした経験から私が個人的に感じたことに限り、また書き方はインフォーマルなものにしようと思います。

 

制約プログラミングにおける「宣言性」とは、ある問題についての制約を記述するだけで問題を解く手順を記述する必要がない、という特徴を指します。制約というのは、例えば方程式や不等式であったり、命題を表現する述語であったりします。ところで、前者であればオペレーションズ・リサーチにおける線形計画問題を解くソルバーもその条件を充たしそうですし、後者であればProlog言語に代表されるような論理プログラミングがあるではないか、と思われるかも知れません。

問題を解く手順をプログラムを書く人が記述する必要がないということは、問題を解くためのある程度汎用的な手順は事前に用意されていることになるわけで、線形計画問題を解くソルバーは単体法や内点法といったアルゴリズムを実装したエンジンを持っていますし、論理プログラミング言語にはユニフィケーション(Unification 単一化)という汎用的な手続きが実装されていて、それを用いて「推論」を行うことができるわけです。

違いは演算の対象となる領域で、領域が異なれば当然問題を解くための手続きも異なってきます。従って広い意味での制約プログラミング・パラダイムには線形計画法も論理プログラミングも含まれるという見方も可能だとは思いますが、今日一般に制約プログラミングで指し示されているのは、その両者のいずれでもない、離散的で有限な数値領域における色々な関係の取り扱いだと思います。そしてその場合でも、「宣言性」を保証する問題の記述と解法の記述の分離が保たれていることが、制約プログラミングの特徴になっているわけです。

ところで、ある問題についての制約を記述するだけで問題を解く手順を記述する必要がないというのは文字通りには素晴らしいことですが、上に書いたことからだけでも現実には様々な制限があることは容易に想像できるでしょう。これからそうした様々な制限について取り上げ、それらに対してどのように対応すれば良いのかを、産業応用の現場の現実に即して考えていきたいと思いますが、個別の議論は次回以降にするとして、今回は最後に、そうした制限の中で、現実に「最大」のものは何であると私が思っているかについて書いておきます。

制約プログラミングを使いこなす際の最大の難所は、実はまさにその「宣言性」にある、というのが偽らざる現実である、というのが私が感じていることです。誤解のないように急いで補足しますが、だからといって制約プログラミングは実用にならない、と考えているわけではありません。そうではなくて、今日の一般的なソフトウェア開発の現場で制約プログラミングを使おうとした場合には、幾つか乗り越えないといけない障碍があって、皮肉にもそれが、制約プログラミングの最大の特徴でありメリットであるものと表裏の関係にあるということです。

実際にはそうした障碍を乗り越えるだけのメリットを制約プログラミングに見出すことができる現実的なシチュエーションは少なくないと思いますし、5年後、10年後には更にそうしたシチュエーションが増大していく方向にあることは確かなことであると思います。そういう意味で制約プログラミングは、現時点でもなお、未来の技術であると言えるのではないでしょうか。

それでは次回は「宣言性」がもたらす問題について具体的に考えてみたいと思います。

 

このブログ記事について

ひとつ前のブログ記事は「アンケート座談会(その2)」です。

次のブログ記事は「宣言性の光と影(2)」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。