Как отсортировать по буквам * и * цифры в прологе? - PullRequest
4 голосов
/ 23 октября 2011

У меня есть список в Прологе, как следующий:

[(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 ]

4 голосов
/ 25 октября 2011

Если вы хотите отсортировать сохраняющие дубликаты записи в SICStus и многих других прологах, используйте 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 и многие другие прологи нуждаются в keys_pairs/2 и pairs_keys/2 для эффективного отображения.

3 голосов
/ 23 октября 2011

Использование 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 голосов
/ 23 октября 2011

С SWI-Prolog вы можете использовать предварительную сортировку (+ Pred, + List, -Sorted) и определять свой собственный способ сортировки кортежей (но msort, очень хорошо работает, не удаляя дубликаты).

1 голос
/ 23 октября 2011

Вы можете просто использовать сортировку (+ List, -Sorted).Но учтите, что sort / 2 удаляет повторяющиеся записи.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...