4

カスタムリストを注文したいです。注文したいリストはこの形になります...

[n(_,2,_),n(_,1,_),n(_,3,_)]  

コンパレータを書きました

cheaper(n(_,C1,_),n(_,C2,_)) :-
        C1>C2.  

これを predsort で使用するにはどうすればよいですか。バブルソートを使用してソートアルゴリズムを作成しましたが、リストが非常に大きいため、非常に遅くなります。

することは可能ですか

predsort(cheaper, [n(_,2,_),n(_,1,_),n(_,3,_)] , X).

ありがとうございました :)

4

3 に答える 3

5

これを試して :

cheaper(>, n(_,C1,_),n(_,C2,_)) :-
        C1>C2.

cheaper(<, n(_,C1,_),n(_,C2,_)) :-
        C1<C2.

cheaper(=, n(_,C1,_),n(_,C2,_)) :-
        C1=C2.

predsort は sort のように機能することに注意してください。ダブルスを維持したい場合は、試してください

cheaper(>, n(_,C1,_),n(_,C2,_)) :-
        C1>C2.

cheaper(<, n(_,C1,_),n(_,C2,_)) :-
        C1=<C2.
于 2013-03-15T21:52:57.130 に答える
4

Joel は基本的なケース (+1) を示しましたが、パフォーマンスを向上させるために、テストを繰り返さないようにしてください。

cheaper(R, n(_,C1,_),n(_,C2,_)) :-
        C1>C2 -> R = > ; R = < .

編集

現在、SWI-Prolog には別の組み込みソート/4 があり、単純なケースでは、ユーザー定義の述語の呼び出しに関連するペナルティを回避できます。

?- sort(2,@=<,[n(_,2,_),n(_,1,_),n(_,3,_)],S).
S = [n(_2578, 1, _2582), n(_2564, 2, _2568), n(_2592, 3, _2596)].
于 2013-03-15T22:44:52.310 に答える
3

の使用は避けてくださいpredsort/3。これは SWI 固有の述語であり、特に効率的ではありません。なぜなら、すべての ~ O(n log n) 比較は定義を呼び出すことによって実行されるからです。むしろkeysort/2、標準の述語であり、そのような呼び出しオーバーヘッドが発生しないものを使用してみてください。

したがって、最初NsにリストをペアのリストにマップしKNs、次に並べ替えてから値を抽出します。

n_pricep(N, C-N) :-
   N = n(_,C,_).

pair_value(_-V,V).

   ...,
   maplist(n_pricep, Ns, KNs),
   keysort(KNs, KNsS),
   maplist(pair_value, KNsS, NsS).
于 2013-03-15T23:08:48.263 に答える