2013-11-20 121 views
1

我试图以后序方式遍历prolog中的普通树。我发现很多二叉树后序遍历,但无法将它们用于我的目的。我写了一个程序,但它只能打印我的树在如何进入它的相反的方式,即输入
Prolog Postorder在使用univ的普通树中遍历

?-postorder(a(b,c,d(e,f,g))). 
->g f e d c b a true (is what I get) 
->b c e f g d a true (what i want to get) 

这里是代码我已成功地编写到现在

postorder([]). 
postorder(List):- List =..X , myfun(X). 
myfun([A|B]):- atom(A), myfun(B),write(A),write(' '). 
myfun([A|B]):- postorder(A),myfun(B). 
myfun([]). 

我没有得到的后序遍历的方式
任何帮助深表感谢

+0

可能重复[PROLOG(如何后序多路树)(http://stackoverflow.com/questions/20035673/prolog-how-to-postorder-a-multiway-tree) – Shevliaskovic

+0

嗯,我确实看到了这个问题,但是在那里他们并没有在给定的解决方案中使用univ谓词。我想用univ来做。 –

回答

0

这里是为我工作得很好的解决方案。

postorder([]). 
postorder(Tree):- Tree =..[Parent|Children] , myfun(Children), write(Parent),write(' '). 
myfun([First|Next]):- atom(First), write(First), write(' '), myfun(Next). 
myfun([First|Next]):- postorder(First),myfun(Next). 
myfun([]). 
0

你的论点命名这是一个有点混乱

postorder(List):- List =..X , myfun(X). 

应该读

postorder(Struct):- Struct =.. List, myfun(List). 

现在应该更清楚,你必须编写结构仿函数有:

postorder(Struct):- 
    Struct =.. [Functor|Arguments], myfun(Arguments), write(Functor). 

在这一点上,你应该改变myfun以及...

作为一个例子,这里是一个紧凑的问题解决方案

​​

能产生

?- postorder(a(b,c,d(e,f,g))). 
bcefgda 
+0

对于我的命名约定,我很抱歉。我对prolog很陌生,并没有得到它的一窍不通。那么maplist在这里扮演什么角色? –

0

做的另一种方式它 -

建议 - 我会组织你的树有点不同,具体而言,一棵树的形式

tree(Value,[Subtrees]) 

其中值将是类似于a,然后列表是子树的列表。叶具有空单[]

如果这样做,你可以用这个算法利用unification-

postorder(tree(VAL,[Child1|ChildList])) :- postorder(Child1),postorder(tree(VAL,ChildList)). 
postorder(tree(VAL,[])) :- write(VAL). 

输出:

?- postorder(tree(a,[tree(b,[]),tree(c,[]),tree(d,[tree(e,[]),tree(f,[]),tree(g,[])])])). 
bcefgda 
true .