CLIPS超入門4(ルールと推論エンジン2)

次に、2つのルールを持った事例を見てみましょう。 

ルールサンプル2

(defrule rule-room
    (room)
=>
    (assert  (chair))
    (printout  t  “There is a room.” crlf)
)

(defrule rule-chair
    (room)
    (chair)
=>
    (printout  t  “There is a chair.” crlf)
)

上記のルールを編集し、sample2.clpというファイルに保存しましょう。

 ここで、再びCLIPSを立ち上げ、メニューから、Window-Facts、Agendaのウィンドウを開いておきましょう。さらに上記のファイルを読み込み、CLIPSのプロンプトに引き続き

(assert  (room)) 

と入力して、(room)というfactを書き込んでおきましょう。 このとき、Factsウィンドウに(room)というfactが表示され、Agendaウィンドウに、rule-roomというルール名が表示されていることを確認します。

ここで、メニューのExecution-Runを選択し、実行します。すると、

There is a room.
There is a chair.

と表示され、実行が止まります。

 

実行のトレース

  以上の動きを最初からトレースしてみましょう。まず、(room)をassertした時点で、推論エン ジンは、ワーキングメモリの内容に対し、条件部がマッチするルールとFactの組を選択し、Agendaに載せます。この場合、Agendaに載っている 組は1組だけなので、その組が実行されます。(ここで、仮にAgendaに載っている組が複数あった場合には、ある「戦略」にしたがった競合解消手続きに よって、そのうちの1組が選ばれ実行されることになります)
 このルールが選択されることによって、結論部の(assert  (chair))と(printout  t  “There is a room.” crlf)が実行されます。新たに、(chair)というFactが書き込まれ、There is a room.が表示されます。
 さて、ここで再び、推論エンジンは、ワーキングメモリの内容に対し、条件部がマッチするルールとFactの組を選択し、Agendaに載せます。新たに (chair)というFactがassertされたので、rule-chairがマッチするようになり、Agendaに載ってきます。(すでに実行された ルールとFactの組は、再びAgendaには載らないことになっている-無限ループに陥らないため-ので、(room)とrule-roomの組は、 Agendaには載りません。) そして、この組が実行され、”There is a chair.”が表示されます。
 再び、推論エンジンはワーキングメモリの内容に対し、条件部がマッチするルールを探してこようとしますが、これ以上マッチするルールはないので、実行は止まります。


認知-実行サイクル

  このようにルールは、CLIPSに組み込まれている推論のエンジンを通して、常にワーキングメモリに書かれるファクトを見ています。まず、書かれ たファクトとルールの条件部をマッチさせ 、実行のルールとファクトの組の候補をAgendaに登録し(認知)、その中からある戦略にしたがって、実行すべき組を選択(判断:競合解消)し、結論部 に書かれているアクションを実行することになります(競合解消の詳細は、項をあらためて説明しますが、競合解消の「戦略」がいくつかあって、それぞれを問 題に合わせて適切に設定して使います)。こうして次々にルールが実行されていき、最終的にマッチするルールがなくなったところで実行が終了します。

  こうして見てみると、ルールベースの非常に特徴的な部分が見えてきます。まず、ルールを書いてある順番に関係なくその場のワーキングメモリの状態と競合解 消の戦略によって、実行の順序が決まること、そして、マッチするルールとFactの組がある間は実行が続き、なくなった時点で実行が停止するということで す。それぞれのルールは、ワーキングメモリの状態に依存してのみ実行がなされる(正確に言うと競合解消の戦略にも依存する)ので、必然的にルール間の独立 性は高くなり、メンテナンスがし易くなります。