CLIPSのルール
ワーキングメモリの必要最小限の操作ができるようになったところで、次にルールを書いて見ましょう。
一般的なルールの形は、
(defrule <ルール名> ”コメント”
<Left Hand Side=LHS:条件部>
=>
<Right Hand Side=RHS:結論部>
)
この形に従って、非常に簡単なルールを書いてみましょう。
ルールサンプル1
(defrule rule-room
(room)
=>
(printout t “There is a room.” crlf)
)
このルールは、 もし、(room)というfactがあったら(条件部にマッチするfactがあったら)、There is a room.と表示する、と読みます。
ルールは、そのまま対話環境から直接入力してもよいのですが、入力ミスをしたときの修正が難しいので、外部のテキストエディタでルールを記述し、それをCLIPSに読み込むようにしてみましょう。
上 記ルールを、sample1.clp(.clpはCLIPSのルールファイルの拡張子) というテキストファイルに入力し、CLIPSをあらためて立ち上げ、CLIPSのFile-Loadメニューから読み込んでみましょう。ここで、True が返ってくれば、ルールの読み込みに成功したということです。
ここで、先に進む前に、Factsウィンドウと、Agendaウィンドウを表示しておきましょう。どちらもWindowメニューの該当箇所を選択すれば表示できます。
Facts ウィンドウにまだ何も表示されていない段階で、まず(room)ファクトを書き込んでみましょう。assertを用いて、書き込んでみてください。すると factsウィンドウに(room)というファクトが表示されるほか、 左下のAgendaウィンドウに、rule-roomというルール名と、(room)のfact-indexにあたる、f-0が表示されていることがわか るで しょう。
Agendaウィンドウに表示される、このルール名とファクトの組は、これから実行されようとしているルール(とファクトの組)の候補となります。ここで、CLIPSのメニューExecution-Runか
CLIPS>(run)
というコマンドを実行すると、このルールが実行され、ルールの結論部に書かれているアクションによって、”There is a room.”が表示されます。
最後に、ファクトやルールを操作するよく使うコマンドをあげておきましょう。
(reset)
現在、ワーキングメモリに書かれているファクトをすべてクリアし、(initial-fact)というファクトを作るコマンド。(なぜ、クリアするだけでないかというと、・・・ルールベースの場合、プログラムを実行するには、何らかのファクトがないと実行できないため、resetする際、常に(initial-fact)という決まったファクトを作っておくと便利であるから)
(list-defrules)
現在、読み込まれているルールのルール名一覧
(ppdefrule <ルール名>)
ルール名で指定されるルールを表示する