:- use_module(library(lists), [flatten/2, member/2]). choices(Goal,ChoiceList) :- exec(Goal,Multis), elim_dupl(Multis,ChoiceList). exec((A,B),MultiAB) :- !, exec(A,MultiA), findall(Multi,(A,exec(B,Multi)),MultiB), flatten([MultiA,MultiB],MultiAB). exec(true,[]) :- !. exec(Head,MultiH) :- findall(Multi,(clause(Head,Body),exec(Body,Multi)),BodyMultis), ( BodyMultis == [] -> MultiH = [] ; BodyMultis = [MultiH] -> true ; copy_term(Head,HeadC), flatten([HeadC|BodyMultis],MultiH) ). elim_dupl([],[]). elim_dupl([X|R],Out) :- ( member(Y,R), variants(Y,X) -> elim_dupl(R,Out) ; Out = [X|NewOut], elim_dupl(R,NewOut) ). variants(X,Y) :- \+ \+ (numbervars(X,1,N),numbervars(Y,1,N),X = Y).