This example illustrates the use of the meta-logical
predicates var/1, arg/3, and functor/3. The goal
variables(Term, L, []) instantiates
variable L to a list of all the variable
occurrences in Term. E.g.:
| ?- variables(d(U*V, X, DU*V+U*DV), L, []).
L = [U,V,X,DU,V,U,DV]
variables(X, [X|L0], L) :- var(X), !, L = L0.
variables(T, L0, L) :-
% nonvar(T),
functor(T, _, A),
variables(0, A, T, L0, L).
variables(A, A, _, L0, L) :- !, L = L0.
variables(A0, A, T, L0, L) :-
% A0<A,
A1 is A0+1,
arg(A1, T, X),
variables(X, L0, L1),
variables(A1, A, T, L1, L).