我是新人使用Prolog,我希望你能帮助我。
我需要使用名为listofnodes(A4,L)
的谓词来获取二叉树中的所有节点。树A4
就是这样的:
[[[[[],1,[]],5,[]],
7,
[[],3,[[],4,[]]]],
6,
[[[],10,[]],
8,
[[[],9,[]],11,[[],2,[]]]]]
并且有这种形式
确定。这听起来很容易,但我只需要使用这些构造函数和选择器来创建谓词:
empty([]).
root([_,N,_], N). %root node
hi([HI,_,_],HI). %left child
hd([_,_,HD],HD). %right child
dotree(R,HI,HD,[HI,R,HD]). %make a tree
所以我认为我可以使用下一个代码执行此操作,但错误
childs(X,[L,X,R],[L,X,R]).
childs(X,[L,_,_],D) :- childs(X,L,D).
childs(X,[_,_,R],D) :- childs(X,R,D).
listofnodes([],[]).
listofnodes([[],X,[]],[X]).
listofnodes(Abn,P) :- raiz(Abn, N), childs(N,Abn,D), listofnodes(D,P).
任何想法如何解决这个问题?
谢谢!
答案 0 :(得分:1)
如果您正确定义递归案例,则可能不需要listofnodes([[],X,[]],[X]).
。您已经listofnodes([], []).
正确定义了空树的节点列表。
考虑一般情况下节点列表的规则:
树的节点列表
[Left, Node, Right]
将是Left
的节点列表,节点Node
以及Right
的节点列表。< / p>
所以你的谓词应该以某种方式类似于这个规则。
listofnodes([Left, Node, Right], ListOfNodes) :-
listofnodes(Left, LeftNodes),
...
我将剩下的作为练习。