% 5.02 Write a predicate nnodes/2 to count the nodes of a multiway tree.
%
% nnodes(T,N) :- the multiway tree T has N nodes (i,o))
% the following is a test case:
tree(1,t(a,[t(f,[t(g,[])]),t(c,[]),t(b,[t(d,[]),t(e,[])])])).
nnodes(t(_,F),N) :- nnodes(F,NF), N is NF+1.
nnodes([],0).
nnodes([T|Ts],N) :- nnodes(T,NT), nnodes(Ts,NTs), N is NT+NTs.
% Note that nnodes is called for trees and for forests. An early
% form of polymorphism!
% For the flow pattern (o,i) we can write:
nnodes2(t(_,F),N) :- N > 0, NF is N-1, nnodes2F(F,NF).
nnodes2F([],0).
nnodes2F([T|Ts],N) :- N > 0,
between(1,N,NT), nnodes2(T,NT),
NTs is N-NT, nnodes2F(Ts,NTs).