このセクションでは"学校までドライブする"というドメインにつイて、list operatorを定義し、そのドメインにいける問題をどのように作成し、解決するのかをみていきます。最初に必要なのはドメインについてのlist operatorの構築です。defsstructは下記のとおり、opの型のmake-opを自動的に定義します。
(make-op :action 'drive-son-to-school
:preconds '(son-at-home car-works)
:add-list '(son-at-school)
:del-list '(son-at-home))
この表現はactionがdrive-son-to-schoolというactionと、その前提条件であるadd-list,del-listという分割されたlistを返します。このoperatorの意図するところは、いつでも息子は自宅にいて、車は動作し、driving-to-schoolを適用すると息子が自宅にいる状態が削除され彼が学校にいるという状態に変更されるということです。
son-at-homeのように長いフレーズにハイフンをつけて表現する方法はシンプルで有効な手段です。よりよい表現はもしかしたら(at son home)かもしれませんが、これはatomではなくなってしまいます。atom-basedなアプローチの問題点の一つは組み合わせです。もし、10個の述語と10人とオブジェクトがあった場合は、利用可能なatomが10 * 10 * 10 = 1000になってしまいますが、componentなら20ですみます。明かに、componentを記述する方が簡単でしょう。この章では、世界記述の全部に必要ではないのでと単純さのために、ハイフンつきのatomを利用します。別の章ではもっとより深い知識表現をとります。
このoperatorを使ったモデルでは、109ページで引用したNewellとSimonの引用に対応する別のoepratorを定義できます。バッテリーの設置、店で問題を修理、店への電話などです。電話番号を調べたりとか店にお金を支払うなどの"and so on"もoperatorを追加することで実現できます。
(defparameter *school-ops*
(list
(make-op :aciotn 'drive-son-to-school
:preconds '(son-at-home car-works)
:add-list '(son-at-school)
:del-list '(son-at-home))
(make-op :action 'shop-install-battery
:preconds '(car-needs-battery shop-known-problem shop-has-money)
:add-list '(car-works))
(make-op :action 'tell-shop-problem
:preconds '(in-communication-with-shop)
:add-list '(shop-knows-problem))
(make-op :action 'telephone-shop
:preconds '(known-phone-number)
:add-list '(in-communication-with-shop))
(make-op :action 'look-up-number
:preconds '(have-phone-book)
:add-list '(known-phone-number))
(make-op :action 'give-shop-money
:preconds '(have-money)
:add-list '(shop-has-money)
:del-list '(have-money))))
次のステップ定義した問題をGPSで解決するかを試すことです。3つの問題があります。それぞれの場合、goalは同じson-at-schoolという状態です。利用できるoperatorのlistには、それぞれの問題は同じですが、最初の状態が異なります。3つのGPSを読んだ場合、Lispシステムでどうなるかを試してみます。(gps...というのがuserの入力で、 (EXECUTE...というのがプログラムの出力で、結果はSOLVEDかNILになります。
(gps '(son-at-home car-needs-battery have-money have-phone-book)
'(son-at-school)
*school-ops*)
(EXECUTING LOOK-UP-NUMBER)
(EXECUTING TELEPHONE-SHOP)
(EXECUTING TELL-SHOP-PROBLEM)
(EXECUTING GIVE-SHOP-MONEY)
(EXECUTING SHOP-INSTALLS-BATTERY)
(EXECUTING DRIVE-SON-TO-SCHOOL)
SOLVED
(gps '(son-at-home car-needs-battery have-money)
'(son-at-school)
*school-ops*)
NIL
(gps '(son-at-home car-works)
'(son-at-school)
*school-ops*)
(EXECUTING DRIVE-SON-TO-SCHOOL)
SOLVED
すべての例のgoalはson at schoolです。son-at-schoolがadd-listに含まれるoperatorはdrive-son-to-schoolだけで、GPSは最初にそれを選択します。operatorが実行される前に、GPSは前提条件を解決します。最初の例では、shop-installs-battery, give-shop-money, tell-shop-problem, telephone-shopを通して前提条件のないlookup-numberをみつけます。その上で、lookup-numberが事項され、programは別のアクションに移ります。アリストテレスによれば「解析というのは、最初から順にやっていくことである」。
2番目の例は最初は同じなのですが、look-up-number operatorがhave-phone-bookを実行できないために失敗します。直接、間接を問わず、電話番号が前提条件ですが、そこに該当するアクションがないため、GPSはNILを返します。
最後に3番目の例ですが、より直接的で、車が動けばdriving operatorは直接実行できます。
最終更新:2008年01月15日 07:52