我有一個動態列表,其中包含許多具有確定性值的症狀。排序症狀列表序言
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)