2012-12-08 45 views
0

我的數據庫是與此類似:prolog:排序w.r.t.一些屬性

% happy(Person,Happiness) 
happy(1,10). 
happy(2,5). 
happy(3,8). 
happy(4,1). 

我要排序的人w.r.t.他們的幸福。

我編碼以下,它做我想要的。不過,這對我來說看起來很麻煩。任何改進?

? - sortPeople(Ts). 
Ts = [1, 3, 2, 4]. 

我的解決辦法:

getFirst([],R,R). 
getFirst([[H1,_]|T],F,R) :- 
    append([H1],F,R1), 
    getFirst(T,R1,R). 

compareHappiness(X, [_,S1], [_,S2]) :- compare(X, S1, S2). 

sortPeople(Ts) :- 
    findall([X,Y], happy(X,Y), List), 
    predsort(compareHappiness, List, SortedList), 
    getFirst(SortedList,[],Ts). 
+1

並非如此cumberstone!對我來說似乎沒問題。 – Haile

回答

2

考慮使用更多的描述和聲明謂詞名稱,例如:

person_happiness(1, 10). 
person_happiness(2, 5). 
person_happiness(3, 8). 
person_happiness(4, 1). 

要通過幸福排序的人,可以考慮使用內置keysort/2,這比predsort/3更有效率。你只需要建立鍵值對,其中按照慣例仿函數 - 用於/ 2,而不是您的輔助謂詞,請考慮使用SWI-Prolog的內置插件pairs_values/2reverse/2

descending_happiness(Ps) :- 
     findall(H-P, person_happiness(P, H), HPs), 
     keysort(HPs, HPs1), 
     pairs_values(HPs1, Ps1), 
     reverse(Ps1, Ps). 

例查詢:

?- descending_happiness(Ps). 
Ps = [1, 3, 2, 4]. 
1

,尤其是圓形是我得到:

sort(Rez) :- findall([Happiness,PId],happy(PId,Happiness),List), 
      msort(List,LSorted), 
      findall(PersonID,member([_,PersonID],LSorted),Sorted), 
      reverse(Sorted,Rez).