E.T.
E.T.

Reputation: 367

Prolog, Sorting facts by parameter

I've been trying to find how I could do this, I'm trying to sort facts like: package(X,Y,N), where N is a number. I want to create a list with the X values, ordered by the value of N (lowest to highest). Tried using :

gera_caminho_tempo(,L):- findall(package(N,,S), package(,,S), Packages), msort(Packages, L).

But no results, any ideas?

Upvotes: 1

Views: 231

Answers (1)

mat
mat

Reputation: 40778

For such tasks, check out the standard predicate keysort/2.

In your case, you can create pairs of the form N-package(X,Y,N), using for example:

?- findall(N-package(X,Y,N), package(X,Y,N), Pairs0).

Once you have obtained Pairs0, you can use keysort/2 to obtain the pairs sorted by key, where the first component of each pair acts as its key:

?- findall(N-package(X,Y,N), package(X,Y,N), Pairs0),
   keysort(Pairs0, Pairs).

I leave relating such sorted pairs to only the sorted packages as an easy exercise.

Upvotes: 3

Related Questions