ISO-Prolog は、しばしば「標準用語順序」と呼ばれる用語順序 (7.2) に依存するものを提供しsort/2
ますkeysort/2
。El
リストを異なる順序でソートする一般的な方法は、そのリストの各要素を何らかの形でペアのリストにマップしてから、XKey-El
そのリストをソートし、最後にキーを射影することです。例として、 をどのようkeysort/2
に表現できるかを考えてみましょうsort/2
(実装については注を参照してください)。
predsort(C_3, List, SortedList)
多くの場合、このアプローチは、SWIや SICStus などのユーザー定義の順序に依存する一般的な実装固有の並べ替え述語を使用するよりもはるかに高速ですsamsort(O_2, List, SortedList)
。
私の質問は次のとおりです。
predsort/3
respを使用したソートが行われる場合がありますか。samsort/3
いくつかのマッピング、sort/2
-ing、および投影に置き換えることはできませんか? 1
わかりやすくするために、有限の基底項に固執することをお勧めします。というのは、無限の基底項は、有限の場合の拡張として必要になるため、完全な辞書式順序を持たないからです。さらに、ISO/IEC 13211-1:1995 の 7.2.1 を考えると、実装に依存する 2 つの異なる変数の場合との変数の比較がどのようになるかは明確ではありません。
7.2.1 変数
X
とY
が同一でない変数の場合、
X
term_precedes は 、ソートされたリスト ( 7.1.6.5、8.10.3.1 j) の作成中に順序が一定のままであることを除いて、Y
実装に依存するものとします。
predsort/3
そのため、ソートされたリストの作成としてまだ資格があるかどうかは明らかではありません。明らかなことは、 と の間 sort/2
に順序が一定のままであることkeysort/2
です。
1 @WillNess のおかげで、この射影には少なくともreverse/2
線形変換も含まれている必要があります。また、重複した結果と一意の結果の両方を実装できることも意味します (keysort/2
実装方法と同様)。