I am trying to sum the leaves of a tree and cannot seem to do it correctly any help would be greatly appreciated. I have tried several different methods and none seem to work right.
nleaves(nil, 0).
nleaves(node(_,Left,Right), N) :-
nleaves(Left, N1),
nleaves(Right, N2),
N is N1 + N2.
when I ask the query ?- nleaves(3, node(1, node(2, node(3, nil, nil), node(4, nil, nil)), node(5,nil,nil)), N)., it comes back with
N = 0. Now, if I replace 0 with 1 in the base case and ask the same query, it returns N = 6. Then if I completely manipulate the predicate which is completely wrong and not acceptable
nleaves(nil, 0).
nleaves(node(_, Left, Right), N) :-
nleaves(Left, LN),
nleaves(Right, RN),
N is 3 - LN + RN.
It will then spit out N = 3.
What can I do to this to make it say N = 3 the right way? I am at a loss for counting the leaves. I seem to be able to count the height correctly with a max predicate helper.
height(nil, 0). % base case empty tree height is 0.
height(node(_,Left,Right), N) :-
height(Left, LN),
height(Right, RN),
N is max(LN, RN) + 1.
but I cannot figure out how to count the leaves.