Predsort/3 like msort/2
Asked Answered
E

2

8

I would like to know is it possible to use predsort/3 without losing duplicate values? If not, that how should I sort this list of terms?

Current sort function:

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

Result:

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

You see, that term n(8,0,9) is gone and that's not what I need.

Ermines answered 23/11, 2011 at 18:9 Comment(0)
S
5

predsort will remove duplicates, but it leaves it to the comparison predicate to define which elements are duplicates. Adapt your compareSecond predicate to also compare the first and third arguments to the functors it receives, if the second argument compares equal.

Alternatively, switch to 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)] .

where the definition of swap_1_2 is left as an exercise to the reader.

Santalaceous answered 23/11, 2011 at 18:20 Comment(0)
T
1

If you're not bothered about further sorting the duplicates, this simple addition prevents them from being removed.

compareSecond(Delta, n(_, A, _), n(_, B, _)):-
    A == B;
    compare(Delta, A, B).
Tetragonal answered 8/1, 2012 at 18:39 Comment(1)
This works, but you'll need to add a cut after predsort. => predsort(), !. Otherwise, you will get other results from the OR operator.Lewan

© 2022 - 2024 — McMap. All rights reserved.