推論エンジン

推論エンジン（すいろんエンジン、）とは、知識ベースから答えを導き出すソフトウェアエンジン。エキスパートシステムの頭脳であり、知識ベース内の情報を元に推論を実行する方法を提供し、結論を導く。

 アーキテクチャ 
推論エンジンを独立したソフトウェアコンポーネントとして分離させたのは、プロダクションシステムのアーキテクチャが最初である。このアーキテクチャは、データ格納部あるいはワーキングメモリを独立させて、問題に関する事実や表明を表す記号列のデータベースとする。また、プログラム本体を表す推論規則群を別に独立させ、その規則を実行するための推論エンジンを設ける。推論エンジンは、その時点のデータ格納部の内容に対してどの推論規則を適用すべきかを選択する。規則選択の制御戦略は「衝突の解決; conflict resolution」と呼ばれる。

推論エンジンは主に以下の3つの部分から構成される。

 インタプリタ。対応する基本のルールを適用することによって、インタプリタは指定された課題を実行する。
 スケジューラー。アイテム優先度または課題に関する他の標準を考慮して、推論規則を適用したときの効果を見積もることにより、スケジューラーは課題に対する制御を行う。
 一貫性保持部。一貫性保持部は得られた解決策に対して一貫した表現をするよう務める。

 認知-行動サイクル 
推論エンジンは、3つの動作段階（規則のマッチング、規則の選択、規則の実行）を持つ有限状態機械として表現できる。

規則のマッチングの段階では、推論エンジンはデータ格納部のその時点の内容を満足する全ての規則を探し出す。規則が典型的な「条件-行動」形式である場合、条件部とワーキングメモリの内容のマッチングをすることを意味する。マッチングが見つかった規則は全て実行候補となり、これらを「衝突集合; conflict set」と呼ぶ。衝突集合では、規則の条件部が複数の事実とマッチした場合、1つの規則が複数回出現することもある。規則とそれにマッチしたデータの部分集合の組合せを、規則のインスタンスと呼ぶ。

多くの場合、データが非常に膨大だったり、要求される性能が厳しいため、衝突集合を求める処理はそれほど単純な問題ではない。初期の推論エンジンの研究では規則とデータのマッチングに関するアルゴリズムの追求が盛んであった。チャールズ・フォーギーが開発したReteアルゴリズムがそのような例として挙げられる。これは OPS5 などのプロダクションシステムで使われた。Daniel P. Miranker は Rete アルゴリズムを改良した TREAT を開発した。これは、関係データベースの最適化技法を取り入れたものである。

衝突集合が得られると、推論エンジンは第二段階として規則選択を行う。この段階では、実際にどの規則を実行すべきかの判断に一種の選択戦略を適用する。この選択戦略はエンジン内にコードとして備わっている場合もあるし、モデルの一部として外部から指定される場合もある。人工知能の中では、この選択戦略をアレン・ニューウェルの Unified theory of cognition に倣ってヒューリスティックスと呼ぶことが多い。

例えば OPS5 では、プログラマは2つの衝突の解決戦略のいずれかを選択可能である。LEX 戦略はインスタンスをデータに付与された時刻タグが現在時刻に近い順に並べる。すなわち、最近実行した規則にマッチしたデータを持つインスタンスが高い優先順位となる。この順序付けではさらに、規則の条件部の複雑さによってソートする。MEA 戦略は、規則の最初の条件にマッチするワーキングメモリ要素の新しさを重視する（特に手段目標解析でよく使われるヒューリスティック）。

さらに選択したインスタンスが第三段階に渡され、その規則が実行される。推論エンジンは選択された規則をインスタンス内のデータを引数として実行（あるいは発火）する。一般に規則の右辺にあるアクションはデータ格納部を変化させるが、それ以外に推論エンジン外の処理を変化させる場合もある（ユーザーとやり取りしたり、外部プログラムを呼び出したりなど）。データ格納部は一般に規則の実行によって更新されるので、次のサイクルでデータにマッチする規則の集合は変化する。

以上の段階を経て、推論エンジンは次のサイクルの第一段階を開始可能な状態となる。このようなサイクルを「認知-行動サイクル」と呼ぶ。推論エンジンの停止条件としては、指定された回数のサイクルを実行したか、ユーザーが停止を要求したか、サイクルの第一段階でマッチする規則が無い状態になった場合がある。

 データ駆動処理と手続き的制御 
推論エンジンの制御はデータ格納部の状態を頻繁に評価することに基づいており、静的なプログラムの制御構造には依存しない。このような処理を「データ駆動」あるいは「パターン誘導」と言い、一般的な手続き的制御と対比される。規則はデータを介してのみ相互にやり取りが発生するのであって、一般的なプログラミング言語では手続きや関数は明示的に互いに呼び出しあう。命令とは異なり、規則は逐次的に実行されず、規則群だけを見てもどれが次に実行されるかは分からず、推論エンジンがいつ停止するかもわからない。

手続き的処理では、問題領域についての知識は制御構造の中に命令としてちりばめられるが、推論エンジンでは知識（規則）と制御（推論エンジン）がより明確に分離されている。オブジェクト指向プログラミングは、それらの中間レベルの分離がなされていると言える。

 関連項目 
Reteアルゴリズム

 外部リンク 
いずれも英文
 SIE (Rubyで書かれている)
 Structural Modeling, Inference, and Learning Engine
 AI Directory
HaleyRules - Business Rules Engine for Java, .NET and XML
YASU's - Business Rules Engine for Java, .NET
 Ruby Rools
 ILOG's Business Rule Management System
 JBoss Rules

Category:エキスパートシステム
Category:推論
Category:決定理論