Predsort / 3, как msort / 2 - PullRequest
       24

Predsort / 3, как msort / 2

7 голосов
/ 23 ноября 2011

Я хотел бы знать, возможно ли использовать predsort/3 без потери дублирующихся значений? Если нет, то как мне отсортировать этот список терминов?

Текущая функция сортировки:

compareSecond(Delta, n(_, A, _), n(_, B, _)):-
        compare(Delta, A, B).

Результат:

predsort(compareSecond, [n(3, 1, 5), n(0, 0, 0), n(8, 0, 9)], X).
X = [n(0, 0, 0), n(3, 1, 5)].

Видите ли, этот термин n(8,0,9) исчез, и это не то, что мне нужно.

Ответы [ 2 ]

5 голосов
/ 23 ноября 2011

predsort удалит дубликаты , но оставляет предикату сравнения определение, какие элементы являются дубликатами.Адаптируйте свой предикат compareSecond, чтобы он также сравнивал первый и третий аргументы с полученными функторами, если второй аргумент сравнивается равным.

В качестве альтернативы, переключитесь на msort:

?- maplist(swap_1_2, [n(3, 1, 5), n(0, 0, 0), n(8, 0, 9)], Swapped),
|    msort(Swapped, SortedSwapped),
|    maplist(swap_1_2, Sorted, SortedSwapped).
% snip
Sorted = [n(0, 0, 0), n(8, 0, 9), n(3, 1, 5)] .

где определение swap_1_2 оставлено читателю в качестве упражнения.

1 голос
/ 08 января 2012

Если вас не беспокоит дальнейшая сортировка дубликатов, это простое дополнение предотвращает их удаление.

compareSecond(Delta, n(_, A, _), n(_, B, _)):-
    A == B;
    compare(Delta, A, B).
...