2016-05-12 83 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