


:- op(450,xfy,'.'). /* + has 500, * has 400 as priority */
:- op(400,xf,'*').



generate(X) --> [X], {atomic(X)}.

generate(X  +_Y) --> generate(X).
generate(_X + Y) --> generate(Y).

generate('.'(X,Y)) --> generate(X), generate(Y).

generate('*'(_)) --> [].
generate('*'(X))  --> generate(X), generate('*'(X)).

gen(RE,S) :- generate(RE,S,[]).

test(S) :-  gen(a+c.(a.b)*,S).


