如何在prolog中按字母*和*数字排序?

时间:2011-10-23 02:46:34

标签: prolog

我在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之前,并对数字进行排序。

4 个答案:

答案 0 :(得分:4)

如果要对SICStus中保留重复条目进行排序,许多其他Prolog使用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和许多其他Prolog需要keys_pairs/2pairs_keys/2来进行有效的映射。

答案 1 :(得分: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)].

答案 2 :(得分:2)

使用SWI-Prolog,你可以使用predsort(+ Pred,+ List,-Sorted)并定义你自己的方法来排序元组(但msort,如果不删除重复项就可以很好地工作)。

答案 3 :(得分:1)

你可以使用sort(+ List,-Sorted)。但请注意sort / 2会删除重复的条目。

http://www.swi-prolog.org/pldoc/doc_for?object=sort/2