我有一个动态列表,其中包含许多具有确定性值的症状。排序症状列表序言
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)]
谁能帮我?谢谢
我有一个动态列表,其中包含许多具有确定性值的症状。排序症状列表序言
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)]
谁能帮我?谢谢
您使用哪个prolog环境? SWI_Prolog具有谓词predsort,它可以使用自定义谓词对列表重新排序。
最快的方法是将列表映射到另一个列表并用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).
..., predsort(compare_symptoms, L, Ordered), ...
compare_symptoms(<, symptom(_, PA), symptom(_, PB)) :-
PA > PB.
compare_symptoms(>, _, _).
请注意,我们必须避免回到平等,否则系统将删除症状以相同的概率。
如果您使用的是Eclipse,你可以使用sort/4
谓词允许指定要使用的一个术语的说法进行排序:
sort(2, >=, Symptoms, OrderedSymptoms)