首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog -算术均值与合并

Prolog -算术均值与合并
EN

Stack Overflow用户
提问于 2016-05-12 11:47:55
回答 1查看 314关注 0票数 0

我在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]]。

我知道如何得到一个列表的算术平均值,但在这种情况下,我想我需要递归的东西。

有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-12 12:09:01

将谓词应用于列表的每个成员以获得新的列表是maplist的目的。为了进行排序,您可以使用内置的keysort/2,或者,如果您有最新的SWI版本,则使用sort/4。但是,如果您使用对(例如)而不仅仅是列表中的另一项(毕竟您知道"things“的数量),情况会更好:

代码语言:javascript
复制
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重写为:

代码语言:javascript
复制
person_vals_mean(person_vals(P, Vs), Mean-person_vals(P, Vs)) :- ...

或者,如果您可以使用sort/4,甚至:

代码语言:javascript
复制
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).

然后:

代码语言:javascript
复制
?- 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实现的,而且非常不相关。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37185964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档