Let’s use a DCG – a Definite Clause Grammar. We start with your original definition:
lea(T, L) :-
phrase(values(T), L).
values(nil) -->
[].
values(t(X,L,R)) -->
[X],
values(L),
values(R).
Now, we need to restrict ourselves to those t/3
that are leaves. One possibility is to enumerate all cases:
lea2(T, L) :-
phrase(leaves(T), L).
leaves(nil) -->
[].
leaves(t(X,nil,nil)) -->
[X].
leaves(t(_,L,R)) -->
{ dif(L+R,nil+nil) },
leaves(L),
leaves(R).
It would be even better and more efficient to use a conditional construct similar to if_/3
. I want to leave this to someone interested.