我需要在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',成本线性时间?
感谢您的帮助
答案 0 :(得分:7)
如果你的图形顶点少于Prolog允许的最大值(例如SWI-Prolog具有无限的arity),你可以将边缘表示为参数的索引:
可以是
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关系表示还可以获得自动索引的(可能很大的)好处。
更多编辑我完全忘了RDF和Semantic Web。非常强大,我们正朝着这个目标前进。
答案 1 :(得分:7)
除了@chac建议的表示之外,您还可以考虑使用属性变量(如果您的Prolog系统支持它),尤其是在计算过程中需要将其他属性附加到顶点或边缘时。在此表示中,您将为每个顶点使用唯一变量,必要时附加(使用put_attr / 3)诸如“name”的属性,并附加“edge”之类的附加属性,例如可以是顶点列表,或者一个术语列表edge(E,Vertex),其中E也是一个变量,如果你需要跟踪影响边缘的信息,你可以附加其他属性。
答案 2 :(得分:5)