2011-11-23 2 views
7

predsort/3を重複した値を失うことなく使用することは可能ですか?そうでない場合、この用語リストをどのように並べ替えるべきですか?Predsort/3 like msort/2

現在のソート機能:

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

答えて

5

predsort重複は削除しますが、重複している要素を定義するために比較述部に残ります。 compareSecond述部を適用して、第2引数が等しいと比較した場合に受信するファンクタの第1引数と第3引数を比較します。

あるいは、スイッチmsortへ:swap_1_2の定義は、読者への課題として残され

?- 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)] . 

1

重複をさらに並べ替えることに煩わされない場合は、この単純な追加によって削除できなくなります。

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

これは機能しますが、プレドソート後にカットを追加する必要があります。 => predsort()、!それ以外の場合は、OR演算子から他の結果が得られます。 –