2016-05-12 48 views
0

我有这个疑问在序言:序言 - 算术平均值和合并

- 单([PERSON1,[7,8,8,9],[PERSON2,[8,9,8? ,9]],[person3, [6,7,5,4]]],X)。

我需要每个人的算术平均值,然后用归并,这样的事情:

X = [[PERSON2,[8,9,8,9],8.5],[PERSON1 ,[7,8,8,9],8],[Person3可能,[6,7,5,4],5.5]]。

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

有人可以帮助我吗?

+1

不太清楚你所说的“归并”的意思是:你想随便找的手段和排序这意味着按递减顺序?为什么“mergesort”具体?你可以使用内置的排序谓词吗? – 2016-05-12 11:53:08

+0

没问题,可以使用任何排序方法。 – DualCortex

回答

3

应用谓词到列表中的每个成员,以获得新的名单是什么maplist是。对于排序,你可以使用内置的keysort/2,或者,如果您有最新的SWI-Prolog的版本,sort/4。然而,这将是更好,如果你使用的对(例如),而不是其他的项目列表中(你知道的“东西”的数量,毕竟):

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

由于事实上,所有在SWI-Prolog中对内置插件进行排序都使用合并排序算法,但这是用C语言实现的,而且非常不相关。

+0

太棒了!它完美的工作,谢谢! – DualCortex