"Dinko Tenev" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > [EMAIL PROTECTED] wrote: >> It would seem that your program is just filtering the full cartesian >> product, right? The solution I'm looking for generates the elements >> one-by-one so that it could be used in a loop. > > Oops...missed that part. > > It took me a while to study the exchange on this topic more thoroughly, > and I now fully appreciate the fact that the problem calls for a much > more sophisticated approach. > > Sorry for the hasty shot, I'll give it another shortly.
I wouldn't worry about it, Prolog generated the elements one-by-one. The loop was the print,nl,fail line. Just beefing it up a bit, I didn't take the time to clean it up though. :-) gen(_,0,[]). gen(S,N,[H|T]):- N > 0, N1 is N - 1, member(H,S), gen(S,N1,T). filter([],[]). filter([X|T],[X|T1]):- filter(T,T1). filter([*|T],L):- filter(T,L). filter([*|T],[_|T1]):- filter([*|T],T1). filter_list(L,[[and|T]|_]):- filter_and(L,T), !. filter_list(L,[[or|T]|_]):- filter_list(L,T), !. filter_list(L,[H|_]):- H \= [and|_], H \= [or|_], filter(H,L),!. filter_list(L,[H|T]):- H \= [and|_], H \= [or|_], filter_list(L,T). filter_and(_,[]) :- !. filter_and(L,[H|T]):- filter_list(L,[H]), filter_and(L,T). generate_member(X,S,N,[]):-gen(S,N,X). generate_member(X,S,N,[H|T]):-gen(S,N,X),\+ filter_list(X,[H|T]). 1 ?- generate_member(X,[a,b],3,[[a,*,b],[b,*,a]]). X = [a, a, a] ; X = [a, b, a] ; X = [b, a, b] ; X = [b, b, b] ; No 2 ?- generate_member(X,[1,2],3,[[and, [*,2], [or, [2,1,*], [1,2,*]]]]). X = [1, 1, 1] ; X = [1, 1, 2] ; X = [1, 2, 1] ; X = [2, 1, 1] ; X = [2, 2, 1] ; X = [2, 2, 2] ; No --- Geoff -- http://mail.python.org/mailman/listinfo/python-list