2009-06-11 18 views
1

私は推論エンジンを開発しています。これは、基本的に、基本的には特定の瞬間の世界の表現である「事実」があることを意味します。事実(通常は2つだけで、開始状態と目標状態)と一緒に、私は多くのルールを持っています(文字通り特定の問題では数百になるかもしれません)。推論エンジンの目的は、開始状態と一連のルールが与えられれば、受け入れ可能な目標状態の1つに最短経路を見つけることです。これは、DFS、BFS、A *などのいくつかのアルゴリズムで行うことができます。プログラムの基本的な構造は次のとおりです。ルールでパターンマッチングの変数置換?

 
fact factname 
    attribute1 = "value"; 
    attribute2 = [ 1, 2, 3]; 
    attribute3 = 4; 
    attribute4 = 7; 
    ... 
endFact 

rule ruleOne 
    equalsto(attribute, "value") or 
    greaterthan(attribute, 5) 
    > 
    remove(attribute); 
endRule 

rule ruleTwo 
    isprimeinteger(attribute) 
    > 
    add(attribute, 1) 
endRule 

、LHS(>前の部分)が「値」と等しい実際factnameすべての属性と一致します。この場合は1つだけですが、多くの場合があります。 これは変数を解決する必要があることを意味します(同じ事実のためにしばしば複数回)。規則のLHSには複数の条件が入れられているか、適切な優先度解析が行われている可能性があります。

問題はこの種の変数を解決する方法がありますか?私が今やっていることは、事実のすべての属性を繰り返し処理することです。基本的には、かなり大きなn-aryツリーを生成しています。これは不均衡でもあります。

は、私は簡単なハッシュテーブルはOになるところ、あなたはO(N)アルゴリズムを使用している

+0

問題を少し正確に説明できますか?私はそれを理解するのに苦労します。どの州からどのように到達できる状態になるのですか?変数についてはどういう意味ですか? (私は「属性」を見ることができますが、これは非常に特殊な変数です。他にもありますか?)パターンマッチング(または統一)を検出できず、タグのエキスパートシステム'と' C++ '。最後に、DFSは、最短パスを望むなら、大きな選択肢ではないようです。 – mweerden

答えて

0

ここには大きな驚きをパターンマッチングのこの種の論文に愛のポインタをいただきたい(1)。ハッシュテーブルは、各属性値に対して対応する属性を格納する。

+1

いいえ、ハッシュテーブルはこの場合役に立ちません。たぶん、この例では考えられないかもしれませんが、LHSでは次のようなものがあります:greaterthan(variable_name、2)これはvariable_name * all *に値が2より大きいファクトの属性を与えなければなりませんたくさんの)。 – user121155

+1

この状態での例をよりよく更新してください。可能であれば、 "isprimeinteger(attribute)"を追加してください。 根本的な問題は、効率的なソリューションがO(N)リストウォークを排除するために構造を利用するということです。構造体なし、効率性なし。 – MSalters

2

私はあなたの投稿に統一という単語を使用していないことに気付きました。それはあなたが実装しようとしているアルゴリズムは一般的に呼ばれているものです。記事を参照してくださいWikipedia;スペースやサイクルが重要だった70年代からのものも含まれています。

0

eduffy has it:これを統一といいます。 Prologは、一般的な場合にしようとしていることを正確に行うように設計されたプログラミング言語であり、統一を使用してその汚い作業を行います。

しかし、PrologでPeano公理を使用して算術演算を実装しようとしている人は、常に最速の方法で取得できるとは限りません。おおよそ同じことをするが、ソルバーが可能な限り迅速に最適なソリューションを見つけるのに役立つヒューリスティックを提供することに重点を置いている「制約プログラミング」言語があります。それらの1つはCometです。