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

如何在prolog中按字母*和*数字排序?,prolog,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之前,数字被排序。您可以使用sort(+Lis

我在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之前,数字被排序。

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


恰当地使用

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

使用SWI Prolog,您可以使用predsort(+Pred,+List,-Sorted)并定义自己对元组进行排序的方法(但msort在不删除重复项的情况下工作得很好)。

如果您想在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和许多其他序言都需要
键对/2
键对/2
来实现有效的映射。您需要没有任何内置谓词的答案吗?SICStus没有
msort/2
-请参阅我的答案。