いくつか簡単なサンプルプログラムを見てきましたが、ここでDroolsの動きを振り返ってみましょう。
Droolsは、ルールベースのシステムで特に前向き推論をサポートしています(後向き推論も後のバージョンでサポートするようです)。この前向き推論によるルールベースのプログラミングは、通常の手続き型でのプログラミングはもちろんのこと、近年一部流行している関数型や、Prologに代表される後向き推論のプログラミングとも感覚がちがうように思うので考え方を(「プロダクションシステム(ルールベースシステム)とは」という記事と多分に重なるところがありますが)ここで整理しておきたいと思います。
Droolsが拠って立つルールベースのシステム(プロダクションシステム)は、70年代の初めに人工知能の研究の中から生まれてきたもので、人間の問題解決モデルをシステム化したものです。まず、このモデルに沿って前向き推論の動き方を追っていきましょう。
人間の記憶には短期記憶と長期記憶があると聞いたことがあるかと思います。短期記憶は「今、その場で起こったこと」を短時間記憶しておく場所。長期記憶は作業のやり方とか規則とか長時間記憶しておく場所。プロダクションシステムを作ったNewellは、この短期記憶と長期記憶をシステム化しました。 Droolsでは、
①短期記憶がワーキングメモリ(WorkingMemory)
②長期記憶がルールベース(RuleBase)
にあたります。・・・で、これだけですと単に記憶して取り出すだけなのですが、人間には考える(推論)という能力があります。この推論を行うエンジンがDroolsそのものというかDroolsの推論機構になります。
③推論エンジン(Droolsの推論機構)
以上の3つがDroolsによるルールベースシステムの構成要素となります。
では、どのように問題解決(推論)していくのでしょうか。それが次に示す認知-実行サイクルのモデルです。上で、短期記憶が、頭の中で認識した「今、その場で起こっている状況-問題の状態」を表すと書きました。また長期記憶は考え方、やり方の「規則(ルール)」を記憶しておくところと書きました。認知- 実行サイクルの最初は、この短期記憶が認識した「その場で起こっている状況」に対して、長期記憶の中にある適用可能な「規則」を選び出します。これが照合(認知)のフェーズです。
この認知-実行サイクルの説明の中でよく使われるのが自動車の運転の例です。ここでもそれにならって自動車の例を示しておきましょう。以下の3つのルールがある(長期記憶にある)としてみましょう。
A.[もし]交差点にさしかかかろうとして、信号が青 [ならば] そのまま進行する。
B.[もし]交差点にさしかかかろうとして、信号が赤 [ならば] そこで止まる。
C.[もし]交差点にさしかかかろうとして、横断歩道を歩行者が渡っている [ならば] そこで止まる。
さて、自動車を運転していて交差点にさしかかろうとしたら、信号が赤であることを認識した(短期記憶に保持した)とします。すると認識した状況に合ったルール(この場合B:)が選択され実行の候補となります。これが照合のフェーズです。
次に実行の候補として選び出されたルールの中から実際に実行するルールを選択します。これが競合解消のフェーズとなります。上にあげた状況の場合は、実行の候補がひとつだけなので問題はありませんが、たとえば、交差点にさしかかろうとして、自動車側の信号が青にもかかわらず、横断歩道を歩行者が渡っているという状況があったとしましょう。この場合、この状況にあったルールは上記A.とC.の2つとなり、その2つが実行の候補として候補リストにあがります。このとき競合解消のフェーズではどちらを実行するか判断する必要があります。判断に際してはその基準(戦略とよぶ)がありDroolsのデフォルト戦略は、深さ(最新)優先戦略(最も新しくできた短期記憶の状況が結びついているもの)となっています。また、ルールには優先度(salience)をつけることもでき、優先度がついている場合には優先度の高いものから選択されていきます。
選択された実行ルールは、次の実行(行動)フェーズで、[ならば]以降の「そこで止まる」が実行されます。場合によっては、実行フェーズで短期記憶が書き換えられ(新たな状況がうまれ)、次の照合フェーズで新たなルールが実行候補にあがることもあるでしょう。
このように前向き推論の動きは、その場の認識された状況に合わせてルールが実行され、新たな状況が生まれ、さらにその状況に対しマッチするルールが実行され・・・という具合に進みます。最終的に照合のフェーズでマッチするルールがなくなったときに実行は終了するというわけです。