如何在Prolog中表示直接访问邻居顶点的有向循环图

时间:2012-04-10 20:39:52

标签: prolog cyclic-graph

我需要在Prolog中使用循环构建有向图(在运行时),我不知道如何表示它。我的要求是我需要在一个恒定的时间内从一个顶点到达他的邻居。

是否可以将其表示为树,例如:

t(left_son,V,right_son)

但是如何解决周期?

我可以列出边缘:

graph([a,b,c,d],[e(a,b),e(b,c),e(c,a),e(c,d)])

或者只是

[a->[b],b->[c],c->[a,d],d->[]]

但是如何在搜索邻居时避免在列表中调用函数'member',成本线性时间?

感谢您的帮助

3 个答案:

答案 0 :(得分:7)

如果你的图形顶点少于Prolog允许的最大值(例如SWI-Prolog具有无限的arity),你可以将边缘表示为参数的索引:

可以是this

G = graph(a-[2],b-[3],c-[1,4],d-[2]).

然后使用arg(Edge,G,Vert-Edges)访问邻居。

当然,任何Prolog都会让您使用事实描述图表。这也是非常大的图形的首选方式。

:- dynamic edge/2.

edge(a,b).
edge(b,c).
edge(c,a).
edge(c,d).
edge(d,b).

编辑 edge / 2关系表示还可以获得自动索引的(可能很大的)好处。

更多编辑我完全忘了RDFSemantic Web。非常强大,我们正朝着这个目标前进。

答案 1 :(得分:7)

除了@chac建议的表示之外,您还可以考虑使用属性变量(如果您的Prolog系统支持它),尤其是在计算过程中需要将其他属性附加到顶点或边缘时。在此表示中,您将为每个顶点使用唯一变量,必要时附加(使用put_attr / 3)诸如“name”的属性,并附加“edge”之类的附加属性,例如可以是顶点列表,或者一个术语列表edge(E,Vertex),其中E也是一个变量,如果你需要跟踪影响边缘的信息,你可以附加其他属性。

答案 2 :(得分:5)

许多Prolog系统中都有library(ugraphs),例如YAPSWISICStusCiao。 (请随意在此处添加更多参考资料!)在那里,图表表示为对Vertex-Neighbours对。乍一看,你可能会觉得这不是一个非常有效的表现形式。毕竟,访问单个顶点与列表的长度成正比。但是,直接访问顶点很少有兴趣。大多数情况下,图表将一次性处理 - 这通常会分摊访问成本。