4

特定のPrologの問題でフォワードチェイナーを使用する必要があります。メタインタープリターを使用してこれを実行すると時間がかかるため、バニラメタインタープリターを使用して最初から実装することは避けたいと思います(ただし、他のオプションが利用できない場合は、これを実行する必要があります)。いくつかの優れた実装が存在するはずです。YAPまたはSWIPrologにネイティブで効率的なフォワードチェイナーが含まれているかどうか誰かが知っていますか?その場合、それをインストール/使用する方法へのポインタをいただければ幸いです。

これらの2つのPrologエンジンでネイティブのフォワードチェイナーが利用できない場合、外部のPrologライブラリとして使用できるバニラメタインタープリターに基づいた優れたオープンソース実装を誰かが私に勧めてもらえますか?

前もって感謝します。

4

2 に答える 2

5

解像度定理証明ではなく、最小論理の観点から後向き連鎖と前向き連鎖の両方を説明しましょう。通常の後向き連鎖プロローグ規則は、最小限の論理の左含意導入規則の適用と見なすことができます。したがって、基本的に、目標PとルールA-> Pがある場合、結合された推論規則は、目標Pを目標Aに置き換える可能性があることを示しています。

-------- (Id)
P |- P            G, A -> P |- A
--------------------------------- (Left ->)
        G, A -> P |- P

同じルールを使用して、前向き連鎖アプリケーションをモデル化できるようになりました。今回はゴールPはありませんが、代わりに条件Aが前提で実現されています。ルールA->Pがある場合、このルールは、ヘッドPも実体化することを許可します。結合された推論規則は次のようになります。

------- (Id)
A |- A            G, A, A -> P, P |- B
--------------------------------------- (Left ->)
         G, A, A -> P |- B

私たちの小さなプログラムのアイデアは、前向き連鎖プロセスの不動点F(M)=Mを完全に計算することです。私たちが行うことは、反復M0、M1、M2などを計算することです。これは、プロセスが有限の結果で終了した場合にのみ機能します。演繹データベースから、Mn+1とMnの間のデルタのみを計算するというアイデアを採用しました。比較的少ない労力でF(Mn)\ Mn = G(Mn \ Mn-1、Mn-1)となるように、Gを見つけることができます。

重複は現在排除されていないため、Gの現在の実装は循環データでつまずく可能性があります。ファクトの削除も可能にするフォワードチェーンでは、特別なフォワードルールを使用して重複を排除できます。本格的な前向き連鎖システムは、とにかく事実の除去を可能にするはずであり、それからそれらは制約解決システムを実装するためにさえ使用することができます。

しかし、今のところ、単純なアイデアとそれに対応する単純なコードを残してみましょう。

F関数(元のルール)からのG関数(delta / 2)
http://www.xlog.ch/jekejeke/forward/delta.p

前向き連鎖を備えた玩具エキスパートシステム
http://www.xlog.ch/jekejeke/forward/expert.p

于 2012-05-06T00:07:53.297 に答える
5

YAPとSWIの両方に、前向き連鎖ルールシステムである制約処理ルール(http://dtai.cs.kuleuven.be/projects/CHR/ )の実装が含まれています。

あなたの特定の問題に関してそのパフォーマンスについて話すことはできませんが、CHRは効率的であることが知られています(CHRサイトからリンクされている論文を参照してください)。

CHRにはJava、Haskell、およびCの実装もあるため、後でパフォーマンスを向上させる必要がある場合は、ルールをこれらの言語の1つに簡単に移植できます。

于 2012-05-06T01:07:28.877 に答える