Самый быстрый способ обычно состоит в том, чтобы отобразить список в другой список и отсортировать его с помощью keysort/2
. Здесь я предполагаю, что вы также хотите отсортировать имена при условии, что они имеют одинаковое значение.
element_to_pair(E, k(NegV,N) - E) :-
E = symptom(N,V),
NegV is -V.
nigrosort(Xs, Ys) :-
maplist(element_to_pair,Xs, Ks),
keysort(Ks, Ls),
pairs_values(Ls, Ys).
Такие крошечные предикаты, как этот element_to_pair/2
, часто не заслуживают собственного имени. Это слишком много, чтобы помнить. С library(lambda)
вы можете написать более компактно:
:- use_module(library(lambda)).
nigrosort(Xs, Ys) :-
maplist(\E^(k(NegV,N)-E)^( E = symptom(N,V), NegV is -V ),Xs, Ks),
keysort(Ks, Ls),
pairs_values(Ls,Ys).