:- module(_,_,[doccomments]).

%! \title Binary tree example: preorder

%! pre_order(T,L): `L` is the list of elements of tree `T` in preorder. 
pre_order(void, []).
pre_order(tree(X,Left,Right), Elements) :-
    pre_order(Left, ElementsLeft),
    pre_order(Right, ElementsRight),
    list_append([X|ElementsLeft], ElementsRight, Elements).

% Try:
% ?- tree_example(_T),pre_order(_T,List).

% Auxiliary predicates: 
list_append([],L,L) :- 
    list(L).
list_append([X|Xs],Ys,[X|Zs]) :- 
    list_append(Xs,Ys,Zs).

tree_example(  tree( a,
                   tree( b,
                         void,
                         void
                       ),
                   tree( c,
                         tree( b,
                               void,
                               void
                               ),
                         void
                       )
                   )).
