ここでは、ルールベースのプログラム実行について通常のプログラミング言語によるプログラムとの対比によって見ていきます。
通常のプログラミング言語(JavaやC#、Visual Basicなど)によるプログラムは、変数と代入、条件分岐、繰り返しなどの一連の命令から構成されており、基本的 には、プログラムの上から逐次的に実行されます。この場合のプ ログラムは、計算を「どのように(howto)」実行していくかを考え、それを逐一プログラム上に記述することで作られます(このプログラミング手法を命 令型プログラミングとか手続き型プログラミングなどと呼びます)。
一方、ルールベースのシステムでは、「何を(what)」を記述する ことによりプログラムを作成します。このことでルールベースのシステムでは、通常のプログラミングで結構煩雑な記述となる「どのように」という部分を(あ まり)意識せずにプログラムを作成することができます(この、「何を」をもとにプログラムを記述するプログラミング手法を宣言型プログラミングと呼びま す)。以下では、ルールベースのシステムがどのようにして「どのように」実行するかという部分と、「何を」実行するかという部分を切り離して管理するかと いうところを見ていきましょう。
一般的に、ルールベースのシステム(プロダクションシステム)は、次のような構成要素からなっています。
1. ルール
2. ワーキングメモリ
3. 推論エンジン
ルールベースシステムは、 通常のプログラミング言語によるシステムの構成要素とごく単純に(誤解を恐れず)比較して、たとえてみると、
通常のプログラミング言語 | ルールベースシステム |
プログラム | ルール+推論エンジン |
変数 | ワーキングメモリ |
と なります。ルールベースシステムにおいては、プログラムは、実行をつかさどる推論エンジンと、「何を(what)」行うかを記述するルール部分とに別れま す。通常、推論エンジンは、いわゆるルールエンジンとして汎用的なものが組み込まれており、「どのように」の部分である実行の順序を一括で管理していま す。したがって、ルールベースシステムにおけるプログラム では、「どのように(howto)」行うかを記述する必要はなく、もし△△であったら××をするというif-then形式のルールを列挙することで「何を (what)」を記述することになります(プログラムの具体的な事例については、別の項で説明します)。
(もっともルールベースのルールを使って、手続き的な記述を行うこともできるのですが、それはたとえて言うなら、Javaで、一連のプログラムを一つのクラスに押し込めて記述をするようなもので、ルールベースの本来の使い方ではないでしょう。)
ルールベースの実行は、ワーキングメモリに記述されたデータに対して、そのデータとマッチする「もし~であったら」部分を持ったルールを推論エンジンが探 し出し、マッチしたルールに書かれている「~をする」部分の記述にしたがって、ワーキングメモリに新たにデータを書き込むなり、消去するなり、メッセージ を表示するなりして実行されます。これだけですと、一つのルールが実行されるだけですが、推論エンジンは、再び新たな(状態が多少変わったかもしれない) ワーキングメモリのデータに対して、マッチするルールを探してルールを実行していきます。こうしてマッチするルールがなくなった時点でプログラムの実行が 終了します。
(正確に言うと、これは「前向き推論」の場合の推論エンジンの説明)。
この実行方法について、ワーキングメモリに書かれたデータとルールとのマッチングから、ルールの実行までのサイクルのことを認知実行サイクルといいます。
上にすでに書いたように、ルールベースの実行の方法- 認知実行サイクル-では、まず、 ワーキングメモリに書かれた情報と、ルールの if 部分(条件部)と照合がなされます。 ここでマッチしたワーキングメモリとルールとの組が、実行の候補となって候補リスト(「アジェンダ」と呼ぶ)にあがってきます。次に、その候補の中から、ある決まった「戦略」にし たがって選択され(競合解消)、実行されます。このサイクルの繰り返しで次々にプログラムの実行が進んで行き、ワーキングメモリの内容とルールの if 部分とでマッチするものがなくなったときにプログラムの実行が終了することとなります。
(「戦略」については、別途項をあらためて説明します)