2011-10-23 117 views
3

我有如下所示在Prolog中的列表:如何在序言中按字母*和*數字排序?

[(b,y,3),(p,z,1),(p,y,3),(b,y,2),(p,z,2),(p,x,3),...] 

其中第一元組的第一個元素是[b,p],第二個是在[x,y,z],第三是在[1,2,3,4,5,6,7]

使列表的上面的示例變成我怎麼排序的元組名單:

[(b,y,2),(b,y,3),(p,x,3),(p,y,3),(p,z,1),(p,z,2),...] 

即b自帶P,X前前y和z和數字進行排序。

回答

3

使用apropos

apropos(sort). 

這表明,有一些內置的謂詞可以幫助你解決問題 - sort與刪除重複和不msort刪除副本。

?- sort([(b,y,3),(p,z,1),(p,y,3),(b,y,2),(p,z,2),(p,x,3)], X). 
X = [ (b, y, 2), (b, y, 3), (p, x, 3), (p, y, 3), (p, z, 1), (p, z, 2)]. 

?- msort([(b,y,3),(p,z,1),(p,y,3),(b,y,2),(p,z,2),(p,x,3)], X). 
X = [ (b, y, 2), (b, y, 3), (p, x, 3), (p, y, 3), (p, z, 1), (p, z, 2)]. 
+1

sicstus有msort嗎? – dasen

+0

我不知道。你需要一個沒有任何內置謂詞的答案嗎? –

+0

SICStus沒有'msort/2' - 查看我的答案。 – false

2

隨着SWI-Prolog的,你可以使用predsort(+強的鬆,+列表,-Sorted),並定義你自己的方式來排序元組(但msort,確實YHE工作非常良好,沒有刪除重複)。

3

如果要排序保存在SICStus和許多其他Prologs重複的條目使用keysort/2

msort(Keys, KeysS) :- 
    keys_pairs(Keys, Pairs), % pairs_keys(Pairs, Keys) 
    keysort(Pairs, PairsS), 
    pairs_keys(PairsS, KeysS). 

keys_pairs([], []). 
keys_pairs([K|Ks], [K-_|Ps]) :- 
    keys_pairs(Ks, Ps). 

pairs_keys([], []). 
pairs_keys([K-_|Ps],[K|Ks]) :- 
    pairs_keys(Ps, Ks). 

SICStus等諸多Prologs既需要keys_pairs/2pairs_keys/2一種有效的映射。

+0

很棒的回答,完美的工作!謝謝。 –