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 ルールがトリガーされます)。ユーザーが「はい」と答えた場合、
この目標生成の方法論では、基本的に後方連鎖を使用して、前方連鎖ルールで必要なデータを取得します。