我需要像这样表示图表:
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。如果我对元素进行排序,它将不再有效,因为我无法尝试 arc(b,a,connected) 和 arc(a,b,connected)。只有第二个。我会坚持排序,但我不知道如何解决最后一个问题。
希望我把这一切都说得很清楚。我更愿意尽可能接近我已有的代表和想法。但也非常欢迎全新的。我不期望有任何确切的答案,而是将我指向正确的方向或建议一些特定的阅读内容,因为我对 Prolog 还是很陌生,也许这个问题并不像我想的那么罕见。
从昨天开始,我一直在尝试解决这个问题,但找不到任何简单的答案。我查看了一些离散数学和常见的无向图表示,例如邻接表。如果有任何不清楚的地方,请告诉我——我会尽力提供更多细节。