2011-10-23 4 views
3

I ont une liste en Prolog comme suit:Comment faire pour trier par lettres * et * nombres dans prolog?

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

où le premier élément du premier tuple est en [b,p], le second est en [x,y,z], et la troisième est en [1,2,3,4,5,6,7].

Comment trier cette liste de tuples de telle sorte que l'échantillon ci-dessus de la liste devient:

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

qui est, b vient avant p, x avant y et z et les chiffres sont triés.

Répondre

3

Utilisez apropos

apropos(sort). 

Il montre qu'il ya des prédicats vous aide à votre problème - sort avec la suppression des doublons et msort sans enlever les doublons.

?- 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

Est-ce que sicstus a msort? – dasen

+0

Je ne sais pas. Avez-vous besoin d'une réponse sans prédicats intégrés? –

+0

SICStus n'a pas 'msort/2' - voir ma réponse. – false

2

Avec SWI-Prolog vous pouvez utiliser predsort (+ Pred, + Liste, -Sorted) et définir votre propre façon de trier tuples (mais msort, fait son travail yhe très bien sans enlever les doublons).

3

Si vous voulez trier préserver les doublons dans SICStus et bien d'autres Prologs utilisent 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 et bien d'autres Prologs ont besoin à la fois keys_pairs/2 et pairs_keys/2 pour une cartographie efficace.

+0

Grande réponse, a parfaitement fonctionné! Merci. –

Questions connexes