2011-12-07 33 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)