упорядочение списка симптомов пролог - PullRequest
1 голос
/ 07 декабря 2011

У меня есть динамический список, содержащий ряд симптомов со значением определенности.

ES: [symptom (a, 0.93), symptom (b, 0.56), symptom (c, 0.59), symptom (d, 0.80)]

Я хочу упорядочить список в порядке убывания в соответствии со значениемуверенности.

ES: [symptom (a, 0.93), symptom (d, 0.80), symptom (c, 0.59), symptom (b, 0.56)]

Кто может мне помочь?Спасибо

Ответы [ 4 ]

1 голос
/ 08 декабря 2011

Если вы используете ECLiPSe, вы можете использовать предикат sort/4, который позволяет указать, какой аргумент термина использовать для сортировки:

sort(2, >=, Symptoms, OrderedSymptoms)
1 голос
/ 07 декабря 2011

Самый быстрый способ обычно состоит в том, чтобы отобразить список в другой список и отсортировать его с помощью 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).
1 голос
/ 08 декабря 2011
..., predsort(compare_symptoms, L, Ordered), ...

compare_symptoms(<, symptom(_, PA), symptom(_, PB)) :-
  PA > PB.
compare_symptoms(>, _, _).

Обратите внимание, что мы должны избегать возврата равенства, иначе система удалит симптомы с той же вероятностью.

1 голос
/ 07 декабря 2011

Какую среду пролога вы используете?SWI_Prolog имеет предикат predsort , который может переупорядочивать список с помощью пользовательского предиката.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...