订购症状列表序言

时间:2011-12-07 19:20:36

标签: list prolog

我有一个动态列表,其中包含许多具有确定性值的症状。

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 个答案:

答案 0 :(得分:1)

您使用的是哪种prolog环境? SWI_Prolog具有谓词{{​​3}},可以使用自定义谓词对列表重新排序。

答案 1 :(得分:1)

最快的方法通常是将列表映射到另一个列表,并使用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).

答案 2 :(得分:1)

..., predsort(compare_symptoms, L, Ordered), ...

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

请注意,我们必须避免返回相等,否则系统会以相同的概率删除症状。

答案 3 :(得分:1)

如果您使用的是ECLiPSe,则可以使用sort/4谓词来指定用于排序的术语的哪个参数:

sort(2, >=, Symptoms, OrderedSymptoms)