我有一个动态列表,其中包含许多具有确定性值的症状。
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)]
谁能帮帮我?感谢
答案 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)