2008年12月21日日曜日

【PAIP】探す、ということ

PAIPをやっているなかで、ぼやぼや感じていること。

プログラミングの本質の一つは、「探す」ということではないか。探す、というと探索(Search)ということで、プログラミングの中でアルゴリズムが比較的整備されている分野、程度に思っていた。しかし、PAIPで古典AI系のプログラムがとどのつまり「探す」ということに終始しているのを見るにつけ、何かそれ以上のことに思えてきた。

例えば、文字列を変換する、ということは、入力された文字列をもとに、出力すべき文字列を探して、それを出力するということだ。
例えば、数値計算をする、ということは、入力である数値から、出力すべき数値を探して、それを出力するということだ。
そもそも、問題を解決する、ということは、入力である状況情報から、解空間を探索して、解を提示する、ということだ。
解空間をどのように定義して、探索をどのようにスマートにおこなうか、がプログラミング。これはとても抽象的な話であり、それの卑近な例がデータ構造とアルゴリズムである。

数値計算を例に少し考えを進める。
数値計算の内容が解析的に判明している場合は、探すという色合いは低くなり、解析的に明確になっている手順で解を計算することができる。
数値計算の内容が解析的に判明していない場合は、探すという色合いが強く、近似や漸近的な手法を用いた手順で解を計算することができる。

この「探す」ということは関数プログラミングと関連が深いように思う。
というのは、解空間を考えたとき、探すということは、入力と解空間の写像をどうしますか? ということになるからだ。入力と解空間の連鎖を考えるとき、それは関数適用の連続であり、思考は関数的であると思う。

そのような問題分析の結果、それをプログラミング言語でかきくだすときに、関数指向で書くのが自然である。それが関数プログラミング。なので、関数的に問題を分析していないのに、関数型プログラミング言語で関数プログラミングする、というのは無理がある。

もちろん、プログラミングの本質は「探す」ということだけではないだろう。だけど、とても重要に感じる。
他の本質は何か、ということも気になる。

ふと思ったのが、ここに書いたのは、今の自分にとっての本質かもしれない、ということだ。
今の自分の世界観にとって、この観点がピースとしてはまる、ということ。今の自分の世界観は、すでに集合論や計算理論やCLの複数の本の学習をやった上でのものだからだ。なので、本当の本質は、すでに既得となっているそれらの概念の中にあるのかもしれない。しかし、本質って何だ? というと、真実が無いのと同じように、客観的な本質など存在しないだろうから、いたしかたないと考えよう。

ちょっと見晴しがよくなった。
さあPAIP再開。

0 件のコメント: