2

您可以提出以下建议:我有一个类似于仓库的东西,并从中获得了一个图表。顶点是 (0-0)、(0-1) 等等,边是加权的,例如:e(0-0,0-1,1)。

从这张图(有循环)中,我用 Prim 算法获得了一个最小生成树。现在我的问题:

我想通过回溯遍历整个树,例如

tree_walker(Es, X) :-
   member(e(X,Y,_), Es),
   tree_walker(Es, Y).

我怎样才能做到这一点?我的主要问题是树的表示(如下所示),因为在互联网上找到的示例中的其他树以另一种方式表示。所以我无法抓住解决这个问题的想法。

我对具有四个顶点的示例最小生成树的表示:(0-0)、(0-1)、(1-0) 和 (1-1)

[e(0-0,0-1,1),e(0-0,1-0,1),e(0-1,1-1,2)]

谢谢你的帮助!

4

2 回答 2

1

Tree walker 还需要它当前正在访问的节点的表示。附加子句用于报告它正在访问的每个节点作为解决方案:

tree_walker(_, Node, Node).
tree_walker(Es, From, To) :-
     member(e(From,Next,_), Es),
     tree_walker(Es, Next, To).

您发布如下查询:

?- tree_walker(Es, Start, Node).

并获得访问节点作为顶层报告的一系列解决方案。

+1 用于避免副作用,而是使用 Prolog 顶层报告解决方案。

于 2013-10-09T08:47:46.017 回答
0

prolog 代码对列表进行编号,其中可以包含树常量,并在列表上执行深度。例如 [14,sdsd,a(b,27,c(16,[dfdf]))] 将变为 [14,0,a(0,27,c(16,[0]))]。它用数字零替换叶原子。

于 2015-10-27T05:39:04.733 回答