我要代表這樣的圖形:分層無向圖表示
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)])
我對代碼沒有限制,但是我會堅持這種表示,它適用於所有我已經編碼的其他結構。
我的意思是無向圖,其中頂點是一些對象,邊代表它們之間的無向關係。爲了給你在這個特定的例子中更多的背景,我試圖表示一個矩形,所以對象是它的四個邊(段)。這些片段使用頂點等以相同的方式表示。重點是構建圖表的層次結構,它表示同一級別上的對象之間的約束。
問題存在於邊緣的表示中。表示弧(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)。我想得到答案 - 有一個矩形。然而,你可以計算出這個矩形的組合數。這也需要太多的時間來計算,顯然我不想在矩形級完成。
我想過排序元素。我可以在一個段中排序頂點。但是,如果我想要在矩形中對段進行排序,則約束不再有效。圖表變成了指示。例如考慮前兩個關係,假設我們有弧(a,b)和(a,c)。如果沒有對弧進行排序,則程序按照我的要求進行回答:arc(b,a,connected),arc(a,c,connected)匹配:Object1 = b,Object2 = a,Object4 = c。如果我對元素進行排序,它不再有效,因爲我不能有弧(b,a,連接)和弧(a,b,連接)試用。只有第二個。我會堅持排序,但我不知道如何解決這個最後的問題。
希望我說得很清楚。我寧願儘量接近我已有的表示和想法。但全新的也是非常受歡迎的。我不期待任何確切的答案,而是讓我朝着正確的方向傾斜,或者提出具體的東西來讀,因爲我對Prolog來說很新,也許這個問題並不罕見。
我想從昨天開始解決這個問題,不能拿出任何簡單的答案。我查看了一些離散數學和通用無向圖表示,如鄰接表。如果有任何不清楚的地方,請告訴我 - 我會盡力提供更多細節。
由於您對約束的興趣,[本](http://stackoverflow.com/a/10101483/874024)回答可能會對您感興趣 – CapelliC 2012-07-22 15:06:20