-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi Ulrich, >>> a question about setof/3: The manual states that the result is sorted >>> but I could not find according to which ordering. I guess, it's the >>> standart term order. > >>> How could an implementation of setof/3 look like that uses an arbitrary, >>> i.e., user-supplied ordering? > >> Use bagof/3 (or the faster findall/3), and sort the resulting list >> afterwards. > > I need to sort the result of bagof/3 according to a user-supplied function. > I thought of something like the Java function "sort(List,Comparator)" in > java.util.Collections, e.g., a predicate sort/3 with > sort(+Comparator,+Random,-Sorted). I did not find anything similar in the > Referendce Manual. > > Can you suggest me some code that I could reuse? Joachim's suggestion would still be the best option if the user can be required to supply a predicate that maps a list element to an "order value" instead of a comparator. If that's not possible, then here's a simple implementation using insertion sort. I'm assuming there's an appropriate specification of Goal to find a list element and that Compare is the functor of the user-supplied arity 2 comparison predicate that succeeds if its first argument precedes its second argument in the desired ordering and fails otherwise: ... findall(Term, Goal, List), ( foreach(Term, List), fromto([], In, Out, Sorted), param(Compare) do user_insertion_sort(In, Term, Compare, Out) ), ... user_insertion_sort([], Term, _Compare, [Term]). user_insertion_sort([H|T], Term, Compare, Sorted) :- Comparison =.. [Compare, H, Term], ( call(Comparison) -> Sorted = [H|Sorted0], user_insertion_sort(T, Term, Compare, Sorted) ; Sorted = [Term, H|T] ). Versions using other sorting algorithms (merge sort, bubble sort etc.) are an exercise for the reader ;) Andy -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2 (GNU/Linux) Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org iD8DBQFFQeQpdLb1MBw2wdgRApRMAJ9Qh7O3XNsJ0ZnMhk7MU2CbEU2h7ACg0muW +Mi2RPNzGlS+mHdY0vuIrrs= =og5/ -----END PGP SIGNATURE-----Received on Fri Oct 27 2006 - 11:46:38 CEST
This archive was generated by hypermail 2.2.0 : Thu Feb 02 2012 - 02:31:57 CET