descartes-src (ソースパッケージ descartes-src-0.26.0.tar.gz) | 2012-09-09 20:57 |
descartes-win (Windows用バイナリパッケージ descartes-win-0.26.0.zip) | 2012-09-09 20:52 |
会話キャラクター: ツンデレ アプリケーション (会話キャラ:ツンデレ v1.0 for Windows) | 2010-04-29 13:41 |
会話キャラクター: 2人の女の子 ダブルキャラクター (会話キャラクター 2人の女の子 ダブルキャラクター 1.0 for Windows) | 2011-10-02 22:23 |
会話キャラクター: Eliza風英語版 (会話キャラ:Eliza風英語版 v1.0 for Windows) | 2010-05-11 01:06 |
会話キャラクター: 猫耳メイド アプリケーション (会話キャラ:猫耳メイド v1.0 for Windows) | 2010-04-27 21:15 |
会話キャラクター: イライザ風日本語版 (会話キャラ:イライザ風日本語版 v1.0 for Windows) | 2010-04-30 21:53 |
経済指標表示プログラム for Windows (経済指標表示プログラム V1.0) | 2011-08-18 22:04 |
ニュースヘッドライン表示プログラム (ニュースヘッドライン表示プログラム V1.0 for Windows) | 2011-08-16 12:31 |
デカルト言語 example (デカルト言語の例題 example-0.7.0.zip) | 2009-03-01 19:47 |
電力状況表示プログラム for Windows (2011年夏版 全国電力供給状況表示プログラム V1.0) | 2011-08-15 13:25 |
人工知能風のプログラムをご紹介しましょう。
昔からある有名な問題です。
天井にバナナが紐で結んで吊るしてあります。 一匹の猿がいます。 猿はバナナを食べたいのですが、背伸びしても跳ねても届きません。 部屋の角には、棒が落ちています。 隣の部屋には大きな箱があります。 猿は、バナナを取れるでしょうか?
この問題を、デカルト言語で猿を作って解かせてみましょう。
注意) この例題は、descartes-0.6.0以降でないと動作しません。
この世界の状態を以下のようなリストで表すこととします。
猿の最初の状態は、このように表せます。
猿は、「スタート地点」の「地面」にいて、箱は「隣の部屋」にあり、 猿は「手ぶら」です。
最終的な目的となる状態は、猿の持ち物にバナナが入っている状態です。
上記で_となっているのは、無名変数であり、その部分はどのような状態になっていても良いことを表しています。
猿のとれる行動は以下の通りです。
猿の行動は、現在の状態を変化させて、新しい状態に変化させます。
これは次のようなプログラムで表現します。
例えば、「#who が、#place1 から #place2 まで歩く」は、こうなります。
他の行動についてもどうなるかちょっと考えてみてください。 (「6. 全体ソース」に解答があります。)
猿はオブジェクトとして実装します。
::<猿 <考える #st> // (1) <考える #st () #rep> <printlistnl #rep> ; <考える (状態 _ _ _ バナナ) #rep #rep>; // (2) <考える #State1 #rep1 #rep> // (3) <self #who> <action #who #Operate #State1 #State2> <append #rep2 #rep1 (#Operate)> <考える #State2 #rep2 #rep> ; >;
思考ルーチンは、3つの部分でできています。
(1) 1つの引数を持つ <考える> 述語は、最初の状態を #stに設定して
2つの引数を持つ <考える> 述語を呼び出し、
最後にprintlistnlで結果を表示する部分です。
(2) 状態の「猿の持ち物」が、バナナになっています。
つまり、これは最終的な目的の状態を表します。
第2、第3引数の#repには、(3)で後述する猿の行動のログが入っています。
(3) selfは、オブジェクトの名前を獲得します。
actionで、猿の行動を決めます。
appendで、猿の行動#Operateをロギングしていきます。
最後の、<考える> で新しい状態#State2を元に次の行動を模索します。
猿をオブジェクトとして実装したので、これを継承機能を使うと 別のオブジェクトに継承させることができます。
::<ゴリラ inherit 猿; >; ::<"チンパンジー" inherit ゴリラ; >;
ゴリラは猿を継承しています。
チンパンジーは、ゴリラを継承しています。
これで、ゴリラとチンパンジーも猿と同様の思考をして見せます。
さて、お待ちかねの実行結果を表示します。
ゴリラとチンパンジーについては、同じ行動をさせても面白くないので 最初の地点と箱の置き場所を変えてあります。
$ ./descartes example/saru/sarubanana3-sjis 猿 が、 スタート地点 から 部屋の角 まで歩く 猿 が、部屋の角 で棒を拾う 猿 が、 部屋の角 から 隣の部屋 まで歩く 猿 が、箱を 隣の部屋 から バナナの下 まで押す 猿 が、 バナナの下 で箱に登る 猿 が、棒を使ってバナナを落として、バナナをつかむ result -- ::猿 <考える (状態 スタート地点 地面 隣の部屋 手ぶら)> -- true ゴリラ が、 戦場 から 部屋の角 まで歩く ゴリラ が、部屋の角 で棒を拾う ゴリラ が、 部屋の角 から 敵地 まで歩く ゴリラ が、箱を 敵地 から バナナの下 まで押す ゴリラ が、 バナナの下 で箱に登る ゴリラ が、棒を使ってバナナを落として、バナナをつかむ result -- ::ゴリラ <考える (状態 戦場 地面 敵地 手ぶら)> -- true チンパンジー が、 木星 から 部屋の角 まで歩く チンパンジー が、部屋の角 で棒を拾う チンパンジー が、 部屋の角 から 月 まで歩く チンパンジー が、箱を 月 から バナナの下 まで押す チンパンジー が、 バナナの下 で箱に登る チンパンジー が、棒を使ってバナナを落として、バナナをつかむ result -- ::チンパンジー <考える (状態 木星 地面 月 手ぶら)> -- true
ゴリラは元特殊部隊員で、チンパンジーは木星帰りで箱に触ったら目覚めてしまったという設定です。
このソースは、ダウンロードにあるリリースされているファイルの中のexample/saruの下にもあります。
---
<append #X () #X >; <append (#A : #Z) (#A : #X) #Y> <append #Z #X #Y >; <action #who (#who が、棒を使ってバナナを落として、バナナをつかむ) (状態 バナナの下 箱の上 バナナの下 棒 ) (状態 バナナの下 箱の上 バナナの下 バナナ)>; <action #who (#who が、部屋の角 で棒を拾う) (状態 部屋の角 地面 #place2 手ぶら) (状態 部屋の角 地面 #place2 棒)>; <action #who (#who が、#place で箱に登る) (状態 #place 地面 #place #Hand) (状態 #place 箱の上 #place #Hand)>; <action #who (#who が、箱を #place1 から #place2 まで押す) (状態 #place1 地面 #place1 #Hand) (状態 #place2 地面 #place2 #Hand)>; <action #who (#who が、#place1 から #place2 まで歩く) (状態 #place1 地面 #place3 #Hand) (状態 #place2 地面 #place3 #Hand)>; <action #who (#who が、棒を投げる) (状態 #place1 地面 #place2 棒) (状態 #place1 地面 #place2 手ぶら)>; <action #who (#who が、箱を持ち上げる) (状態 #place1 地面 #place1 #Hand) (状態 #place1 地面 #place1 #Hand)>; ::<猿 <考える #st> <考える #st () #rep> <printlistnl #rep> ; <考える (状態 _ _ _ バナナ) #rep #rep>; <考える #State1 #rep1 #rep> <self #who> <action #who #Operate #State1 #State2> <append #rep2 #rep1 (#Operate)> <考える #State2 #rep2 #rep> ; >; ? ::猿 <考える (状態 "スタート地点" 地面 "隣の部屋" 手ぶら)>; ::<ゴリラ inherit 猿; >; ? ::ゴリラ <考える (状態 戦場 地面 敵地 手ぶら)>; ::<"チンパンジー" inherit ゴリラ; >; ? ::"チンパンジー" <考える (状態 木星 地面 月 手ぶら)>;
---
[PageInfo]
LastUpdate: 2010-04-10 11:01:07, ModifiedBy: hniwa
[License]
Creative Commons 2.1 Attribution
[Permissions]
view:all, edit:login users, delete/config:login users