1

いろいろ調べてみたのですが、同じような投稿がありましたら申し訳ありません。

ルール エンジンには、基本的に、フォワード チェーンとバックワード チェーンの 2 つの推論方法があることを理解しています。また、両方が個別にどのように機能するかを理解していると思いますが、混合推論機能を備えたエンジンはどのように機能し、最初に前方連鎖を実行してから後方連鎖を実行しますか、またはその逆ですか? それとも、エンジンが知識ベースと作業メモリ内の事実に基づいて、どの推論を使用するかを決定する可能性はありますか?

また、両方の推論方法でエンジンを構築したい場合は、使用されているマッチング アルゴリズム (Rete、Treat など) を強化することから始めますか?

私は多くの質問をしたことを知っています。誰かが答えたり、どの部分についても文献を参照してくれたりしたら、本当に感謝しています.

ありがとう!

4

1 に答える 1

1

Jess and Drools を見てみることをお勧めします。これらのツールはどちらも前方連鎖と後方連鎖を実装しているため、これが実際にどのように実装されているかを見ることができます。

フォワード チェーン ツールでバックワード チェーンを実装する 1 つの方法は、自動ゴール生成を実装し、これらのゴールに一致するパターンを提供することです。たとえば、以下は CLIPS で記述された自動車修理プログラム (フォワード チェーンのみをサポートする) からのいくつかのルールの抜粋です。

(defrule determine-engine-state ""
   (not (engine-starts ?))
   (not (repair ?))
   =>
   (assert (engine-starts (yes-or-no-p "Does the engine start (yes/no)? "))))

(defrule determine-rotation-state ""
   (engine-starts no)
   (not (repair ?))   
   =>
   (assert (engine-rotates (yes-or-no-p "Does the engine rotate (yes/no)? "))))

(defrule determine-gas-level ""
   (engine-starts no)
   (engine-rotates yes)
   (not (repair ?))
   =>
   (assert (tank-has-gas
              (yes-or-no-p "Does the tank have any gas in it (yes/no)? "))))

(defrule tank-out-of-gas ""
   (tank-has-gas no)
   (not (repair ?))
   =>
   (assert (repair "Add gas.")))

質問をするためのルールには、維持するのがより困難な条件内に含まれる前提条件情報があります。

自動目標生成を使用すると、ルールは次のように書き直すことができます。

(defrule determine-engine-state ""
   (goal (engine-starts ?))
   =>
   (assert (engine-starts (yes-or-no-p "Does the engine start (yes/no)? "))))

(defrule determine-rotation-state ""
   (goal (engine-rotates ?))
   =>
   (assert (engine-rotates (yes-or-no-p "Does the engine rotate (yes/no)? "))))

(defrule determine-gas-level ""
   (goal (tank-has-gas ?))
   =>
   (assert (tank-has-gas
              (yes-or-no-p "Does the tank have any gas in it (yes/no)? "))))

(defrule tank-out-of-gas ""
   (not (repair ?))
   (engine-starts no)
   (engine-rotates yes)
   (tank-has-gas no)
   =>
   (assert (repair "Add gas.")))

この場合、質問をするルールが単純化され、保守がはるかに簡単になります。特定のタイプのファクトに対する目標がある場合は常に、ユーザーはその値を照会されます。質問の前提条件情報をエンコードする必要はありません。自動ゴール生成により、タンクガス不足ルールがゴールを含むルールを駆動することができます。修理がまだ決定されていない場合、engine-starts ファクトが存在しない場合、(engine-starts no) パターンは自動的にゴールを生成します (ルール エンジンは、一致する別のルール、determine-engine-state があると判断できます)。この目標事実について)。ユーザーが no と応答すると、(engine-starts no) パターンが一致し、engine-rotates ファクトのゴールが生成されます (determine-rotation-state ルールがトリガーされます)。ユーザーが「はい」と答えた場合、

この目標生成の方法論では、基本的に後方連鎖を使用して、前方連鎖ルールで必要なデータを取得します。

于 2014-12-23T22:50:19.017 に答える