1

速度を向上させるために、多数のファクトをコンパイルまたはインデックス化するより高速な方法はありますか? 私は約 30,000 個のリンクされた (groupid,id) 形式の事実を持っています

IDを指定して接続を見つけようとしますが、本当に遅いです。ルールを使っています

connected(Id1,Id2) :-
   linked(Grp1,Id1),
   linked(Grp1,Id2),
   \+Id1=Id2.

connected(Id1,Id2) :-
   connected(Id1,Id3),
   connected(Id3,Id2),
   \+Id1=Id2,!.
4

2 に答える 2

3

ほとんどのプロローグは、述語の最初の引数でインデックスを使用するため、引数の順序を変更することをお勧めします。SWI などの一部の Prolog ダイアレクトでは、:-index ディレクティブを使用してインデックス作成の方法を明示的に示すことができます。

あなたの実装は、推移的な閉鎖バリアントを提案しています。Id1 と Id2 が接地されている場合、再帰的ケースと非再帰的ケースを区別し (1)、2 番目の句の本体で connected/2 への最初の呼び出しを非再帰的ケースへの呼び出しに置き換えることを検討できます (2)。最後に、訪問した Id を追跡して、再訪問する必要がないようにすることを検討できます。

于 2012-03-22T15:00:52.183 に答える