2011-12-07 34 views
1

我有一個動態列表,其中包含許多具有確定性值的症狀。排序症狀列表序言

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)]

誰能幫我?謝謝

回答

1

您使用哪個prolog環境? SWI_Prolog具有謂詞predsort,它可以使用自定義謂詞對列表重新排序。

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). 
1
..., predsort(compare_symptoms, L, Ordered), ... 

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

請注意,我們必須避免回到平等,否則系統將刪除症狀以相同的概率。

1

如果您使用的是Eclipse,你可以使用sort/4謂詞允許指定要使用的一個術語的說法進行排序:

sort(2, >=, Symptoms, OrderedSymptoms)