我要代表这样的图形:分层无向图表示
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