6

Prologで可変グラフを効率的に表現したいと思います。グラフでサブセットを検索し、それらを他のサブセットに置き換えます。

データベースを「グラフストレージ」として使用して、なんとか機能させることができました。たとえば、私は持っています:

:- dynamic step/2.
% step(Type, Name).

:- dynamic sequence/2.
% sequence(Step, NextStep).

retract次に、一致したサブセットにいくつかのルールを使用し、を使用してそれらを新しいステップに置き換えますassert。私はこの方法が本当に好きです...読みやすく、扱いやすいので、Prologに多くの重いパターンマッチング作業を任せています。

グラフを表すために私が知っているもう1つの方法は、ノードと隣接接続のリストを使用することです。この方法を使用しているWebサイトをたくさん見ましたが、オーバーヘッドが大きいため、少し躊躇しています。

実行時間は私にとって重要であり、私自身の開発のしやすさも重要です。

どちらのアプローチの長所/短所は何ですか?

4

3 に答える 3

5

いつものように:動的データベースを使用すると、インデックス作成が可能になり、(ルックアップ時に)速度が上がり、(アサート時に)速度が低下する可能性があります。一般に、動的データベースは、検索するよりも頻繁にアサートする場合はあまり良くありません。ただし、主な欠点は、述語を個別にテストできず、データベースの現在の暗黙的な状態を念頭に置く必要があるため、テストとデバッグが大幅に複雑になることです。多くの場合、ノードと隣接接続のリストが適切な表現です。特にノードとエッジの属性をさらに保存する必要がある場合は、ノードごとに1つの変数を使用し、変数属性(SWI-Prologではget_attr/3とput_attr/3)を使用してエッジを保存するという別の表現が大好きです。それらに、たとえば[edge_to(E1、N_1)、edge_to(E2、N_2)、..。

于 2011-07-29T14:36:05.113 に答える
1

SWI-PrologのRDFデータベースの使用を検討しましたか?http://www.swi-prolog.org/pldoc/package/semweb.html

于 2011-07-29T17:22:54.070 に答える
0

マットが言ったように、動的述語には追加のコストがかかります。
ただし、グラフを作成でき、それを変更する必要がない場合は、述語をコンパイルでき、通常の述語と同じくらい高速になります。

通常、sw-prologでは、述語ルックアップは最初の引数でハッシュテーブルを使用して行われます。(動的述語の場合はサイズが変更されます)

もう1つの解決策は、ルックアップなどのコストがo(log(n))である関連付けリスト
です。これらがどのように機能するかを理解した後、必要に応じてインターフェイスを簡単に作成できます。

最終的には、いつでもSQLデータベースを使用し、ODBCインターフェイスを使用してクエリを送信できます(ただし、前述のアプリケーションにとってはやり過ぎのように聞こえます)

于 2011-07-29T18:21:34.300 に答える