[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[b-free: 1401] Object Oriented の問題点 + Prolog による解決
>>以下導入(即ち、いらない話)
相変わらず、忙しい毎日です。
なにせ、期末試験が "coming soon!" ってかんじなんで、とほほとため息を付い
たりしてみます。
今日はいい天気ですが(と天候の話)、High School Programming Contest とい
うのが学校でありました。文脈がおかしいことを気にせずに書くと、
Massachusetts から top level の programming のできる高校生が集まって3時
間で 10 の問題に挑戦するという企画です。もう、今年で何年かめらしく、去年
と引き続き、僕は staff として雑用係をしていました(笑)。で、10の学校
から集まって10の問題をそれぞれ作るという話ですが、一位になった team は
7 問を解いていました。まあ、彼らの内の何人かは、MITとかに行くのでしょ
う。大抵は在り来たりのつまらない問題ですが、最後の問題は結構ひらめきがい
るやつで、
「自分自身の program source を生成する program をつくれ。」
というものでした。噂によると、GNU C doc かなんかに回答が載っているらしい
です。これは、何処の team も解かなかったようです。他には「簡易 parser 付
き計算 program」とか、誰も解けなかったかな。こいつは、計算式を評価して
infix → postfix に演算子を変換した結果を出力した後、実際の数値計算する
という奴かな。ちょっと3時間という制限が、慣れていないと、この手の
program にはきついのかなと思いました。まあ、簡単な奴は、Fibonacchi 数列
を求めよとか言うのもありますけど、うーむ、日本の高校生 programmer の方が
level が高いのかなと言う感じは毎回受けます。では、なぜ「新しい挑戦的な
software がどんどん作られないの?」という気もしますが、それはまた別の問
題なんでしょう。(^^;
# もち、LZH とか、十分すばらしい program もありますけど。
# そういう事で、今回も短い発言です。
# ほんらいは、過去の res. から付けた方が良いのだろうけど。
>>以下本題(即ち、ここまで読み飛ばせる)
えっと、Night さんの指摘していた問題点というのは、Object Oriented という
concept は対象がまず在ると言うことが背景となっている。そして、対象が特定
できない場合に、問題だ。という話でしたでしょうか? ここまで、僕に誤解は
ないですか?
そうなると、対象が特定できない状況というのがどんなものかという話になるで
しょうかねぇ。
もしくは、時計の例のように、対象の情報を集めて必要な情報を「抽出する」と
いう話です。
こいつはある意味、prolog とかの WHAT 型言語ですね。
知っての通り prolog では、今までの言語と違い、いかにして情報を抽出するか
という「手続き」を書く代わりに、何を抽出するかという「目標 (goal と称さ
れるもの)」を書きます。そして、目標を program に与えてやることで実行が
開始され、目標を program によって表現された知識を元により基礎的なものへ
置き換えていくことで最終的な操作対象を発見するわけです。
たとえば、「今の時刻は?」という質問に対して、次の program を使用すると
しましょう。
得る(現在時刻,`時刻):−存在する(`もの),
参照可能(`もの),
参照する(時間,`もの,`時刻)。
存在する(机)。
存在する(眼鏡)。
存在する(電灯)。
存在する(予定表)。
存在する(柱時計)。
存在する(腕時計)。
参照可能(柱時計)。
参照可能(腕時計)。
参照可能(予定表)。
参照する(時間,柱時計,`時刻):−`時刻=「現在時刻」。
参照する(曜日,予定表、`日):−`日=「現在日」。
「」は、system の関数とし、”,”は AND を表現するとし、”。”は文の終わ
りとしましょう。”`”は変数を意味するとします。”:−”はその文を成功さ
せるための条件を以下に連ねることを示します。
上の prolog-like psudo program に「得る(現在時刻,`今の時間)。」とい
う質問(goal)を与えて見るとします。すると、最終的に、変数「今の時間」に
現在の時刻がはいるのです。Trace は以下のようになります。
# ←は「置き換え」、→は「適合」を意味するとします。
得る(現在時刻,`今の時間)→ 得る(現在時間,`時刻)
`今の時間←`時刻
存在する(`もの)→存在する(机)/`もの←机
参照可能(机)→<適合不能:backtrac>
存在する(`もの)→存在する(眼鏡)/`もの←眼鏡
参照可能(眼鏡)→<適合不能:backtrac>
存在する(`もの)→存在する(電灯)/`もの←電灯
参照可能(電灯)→<適合不能:backtrac>
存在する(`もの)→存在する(予定表)/`もの←予定表
参照可能(予定表)→<目標達成>
参照する(時間,予定表,`時刻)→<適合不能:backtrac>
存在する(`もの)→存在する(柱時計)/`もの←柱時計
参照可能(柱時計)→<目標達成>
参照する(時間,柱時計,`時刻)→<目標達成>
/`時刻←「現在時刻」
ここで大切なのは、prolog は単なる汎用検索 program として働くと言うことで
す。上記の例と Object を組み合わせるとすると、「ある場にいる主体」に対す
る環境の prolog-like program を network 環境で、OSが自動的に構築すると
します。もちろん、OSからみて「主体」には参照可能な資源以外隠されていま
す。動的に資源の参照状態が変われば、上記のような prolog-like program を
書き換えるだけです。で、「主体」の質問(program が満たすよう要求された
goal)によって、prolog が適切な object を(ある意味いい加減に)選択し、
で、その対象に対して object oriented な作法で処理が行われるわけです。
# もし、object が処理を拒否したなら、ただ単に、
# backtrack が起こるだけとします。
Prolog の問題点は、大きく3種類在ります。
1.無限 loop を引き起こしやすい。
さらに、program の文を入れ替えると「効率や処理結果」に影響する。
2.「閉世界仮定」をしている。知識のないものは「分からない」で
はなく「No」になる。「証明できないものは存在しない」とい
う policy かな。
3.ある種の algorithm を非常に記述しにくい。たとえば、sort を行おう
とした場合、prolog での効率的な処理方法は見付かっていない。
「否定」を非常に記述しにくい。cut operator という美しくないも
のを導入して大部分解決しているが、それでも不完全。
2はOSという観点から見れば、ある主体にとって「存在しないものは、参照さ
れたくない」わけで、問題ないと思われます。3はこの場合、prolog を object
発見手段にのみ使っていますので、大きな問題にはならないだろうと。1のみが
大きな問題ですねぇ。Non-deterministic TM 風に、検索の目標適合時に常に
thread を生成し、すべての可能性を同時並列検索すれば、問題はないでしょう
が、それに掛かる大変な数の thread を思うと、すこし、怖いです。prolog の
多少の言語仕様変更により、大分軽くなるかもしれませんが、とにかく、その手
の変更をしないとだめでしょうね。
そういう事で、
Object Oriented な「対象への要求」という作法と、
Goal Oriented な「目標を満たす対象の検索」と、
Logical Isolation な「見せたくないものは見せない」OSを
組み合わせると、なかなか面白いものができあがるんじゃないかなって。
そう、思いません?
-Aki.
ps1.
じつは、僕がずっーと「いつか実装してやろう」と思っている、prolog の逆言
語というのがあるのですが、こいつはかなり面白いです。そのうち、program ML
にかくかもしれません。色々本や Net を調べる限り、それ系の処理系は存在し
ないので、楽しんでもらえると思います。
ps2.
この発言は、二日にまたがって書いていますので、
冒頭の導入部(いらない話)は、昨日のことです。
って、誰も気にしないけど。
ちなみに、今日の天気は曇り時々雨。(^_^)