我在Prolog中有一个查询:
?-顺序([[person1,7,8,8,9],[person2,8,9,8,9],[person3,6,7,5,4],X)。
我需要每个人的算术平均值,然后使用mergesort,如下所示:
X=[个人2,8,9,8,8.5],[个人1,7,8,8,9,8],[个人3,6,7,5,4,5.5]]。
我知道如何得到一个列表的算术平均值,但在这种情况下,我想我需要递归的东西。
有人能帮我吗?
发布于 2016-05-12 12:09:01
将谓词应用于列表的每个成员以获得新的列表是maplist的目的。为了进行排序,您可以使用内置的keysort/2,或者,如果您有最新的SWI版本,则使用sort/4。但是,如果您使用对(例如)而不仅仅是列表中的另一项(毕竟您知道"things“的数量),情况会更好:
person_vals_mean([P, Vs], Mean-[P, Vs]) :-
numlist_mean(Vs, Mean). % assuming you have defined it elsewhere
order(PVs, Ordered) :-
maplist(person_vals_mean, PVs, PVMs),
keysort(PVMs, Ordered_rev),
reverse(Ordered_rev, Ordered).最好也完全去掉列表:为什么是[person, [1,2,3]]而不是person_vals(person, [1,2,3])?使用这种表示形式,您可以将person_vals_mean/2重写为:
person_vals_mean(person_vals(P, Vs), Mean-person_vals(P, Vs)) :- ...或者,如果您可以使用sort/4,甚至:
person_vals_mean(person_vals(P, Vs), person_vals_mean(P, Vs, M)) :-
numlist_mean(Vs, M).
order_by_means(PVs, Ordered) :-
maplist(person_vals_mean, PVs, PVMs),
sort(3, @>=, PVMs, Ordered).然后:
?- order_by_means([person_vals(person1, [7,8,8,9]),
person_vals(person2, [8,9,8,9]),
person_vals(person3, [6,7,5,4])],
Ordered).
Ordered = [person_vals_mean(person2, [8, 9, 8, 9], 8.5),
person_vals_mean(person1, [7, 8, 8, 9], 8),
person_vals_mean(person3, [6, 7, 5, 4], 5.5)].事实上,sorting中的所有排序内置程序都使用合并排序算法,但这是用C实现的,而且非常不相关。
https://stackoverflow.com/questions/37185964
复制相似问题