7

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)はなくなりました。それは私が必要としているものではありません。

4

2 に答える 2

5

predsort 重複を削除しますが、どの要素が重複しているかを定義するのは比較述語に任されます。2番目の引数が等しい場合は、述語を調整compareSecondして、最初と3番目の引数を受け取るファンクターと比較します。

または、次のように切り替え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読者の練習問題として残されています。

于 2011-11-23T18:20:43.113 に答える
1

重複をさらに並べ替える必要がない場合は、この単純な追加により、重複が削除されなくなります。

compareSecond(Delta, n(_, A, _), n(_, B, _)):-
    A == B;
    compare(Delta, A, B).
于 2012-01-08T18:39:34.600 に答える