次のようにグラフを表す必要があります。
Graph = graph([Object1,Object2,Object3,Object4],
[arc(Object1,Object2,connected),
arc(Object2,Object4,connected),
arc(Object3,Object4,connected),
arc(Object1,Object3,connected),
arc(Object2,Object3,parallel),
arc(Object1,Object4,parallel),
arc(Object2,Object3,similar_size),
arc(Object1,Object4,similar_size)])
コードに制限はありませんが、既にコーディングした他のすべての構造に適合するため、この表現に固執します。
つまり、頂点がいくつかのオブジェクトであり、エッジがそれらの間の無向関係を表す無向グラフです。この特定の例でより多くの背景を説明するために、私は長方形を表現しようとしているので、オブジェクトはその 4 つのエッジ (セグメント) です。これらのセグメントは、頂点などを使用して同様に表されます。ポイントは、同じレベルのオブジェクト間の制約を表すグラフの階層を構築することです。
問題はエッジの表現にあります。円弧 (a,b) を表す最も明白な方法は、(a,b) と (b,a) の両方をプログラムに入れることです。しかし、これは私のプログラムを冗長なデータ指数関数であふれさせます。たとえば、頂点 a、b、c、d があるとします。セグメント (a,b),(a,c),(a,d),(b,c),(b,d),(c,d) を作成できます。しかし、(b,a)、(c,a) なども得られます。この時点では問題ありません。しかし、後で長方形を作成します。セグメント (a,b)、(b,c)、(c,d)、(a,d) のビルドにすることができます。答えを知りたいのですが、長方形が 1 つあります。ただし、この1つの長方形の組み合わせがいくつ得られるかを計算できます。また、計算に時間がかかりすぎます。明らかに、長方形レベルで終了したくありません。
要素をソートすることを考えました。セグメント内の頂点を並べ替えることができます。しかし、セグメントを長方形に並べ替えたい場合、制約は無効になります。グラフは有向になります。たとえば、最初の 2 つの関係を考慮して、アーク (a,b) と (a,c) があるとします。アークがソートされていない場合、プログラムは希望どおりに答えます: arc(b,a,connected),arc(a,c,connected) with match: Object1=b,Object2=a,Object4=c. 要素を並べ替えると、arc(b,a,connected) と arc(a,b,connected) を試すことができないため、有効ではなくなります。2つ目だけ。私はソートに固執しますが、この最後の問題を解決する方法がわかりません。
うまくいけば、私はこれらすべてを非常に明確に述べました。私は、私がすでに持っている表現やアイデアにできるだけ近づけたいと思っています. しかし、まったく新しいものも大歓迎です。私は正確な答えを期待していません.むしろ、私を正しい方向に向けたり、Prologにまったく慣れていないので、読むべき特定の何かを提案したりします.おそらく、この問題は私が思うほど珍しいことではありません.
昨日からこれを解決しようとしていますが、簡単な答えは見つかりませんでした。いくつかの離散数学と、隣接リストのような一般的な無向グラフ表現を調べました。ご不明な点がございましたらお知らせください。詳細をお知らせいたします。