与えられたレベルNのツリーのすべてのノードのリスト(リストである必要があります)を出力するプログラムをプロローグで実行する必要があります。ノードをリストに入れることができません。誰かが関数findallを使用するように私に言いましたが、それでも機能しません。述語levelNodesを変更したくないのですが、findallを使用しないソリューションが適しています。
domains
element=integer
treetype=tree(element,treetype,treetype);nil
list=element*
predicates
create_tree(element,treetype)
insert_left(treetype,treetype,treetype)
insert_right(treetype,treetype,treetype)
levelNode(treetype,element)
levelNodes(element,treetype,element)
goal
create_tree(10,Ten),
create_tree(11,Eleven),
create_tree(3,Three),
create_tree(5,Five),
create_tree(8,Eight),
create_tree(4,Four),
create_tree(1,One),
insert_left(Ten,Eleven,Eleven1),
insert_right(Three,Eleven1,Eleven2),
insert_left(Five,Eight,Eight1),
insert_right(Four,Eight1,Eight2),
insert_left(Eleven2,One,One1),
insert_right(Eight2,One1,FinalTree),
levelNode(FinalTree,1),
nl.
clauses
levelNode(tree(I,L,R),N):-
findall(X,levelNodes(X,tree(I,L,R),N),O),
write(O).
levelNodes(X,tree(I,_,_),0):-
X=I,
!.
levelNodes(X,tree(I,L,R),N):-
N>0,
N2=N-1,
levelNodes(X,L,N2),
levelNodes(X,R,N2).
create_tree(A,tree(A,nil,nil)).
insert_left(X,tree(A,_,B),tree(A,X,B)).
insert_right(X,tree(A,B,_),tree(A,B,X)).