ISO-Prolog предоставляет sort/2 и keysort/2, который опирается на термин порядок (7.2), который часто называют "стандартным срочным порядком".
Обычный способ сортировки списка с другим порядком состоит в том, чтобы сопоставить каждый элемент El этого списка как-то с списком пар XKey-El, а затем отсортировать этот список и, наконец, проецировать ключи. В качестве примера рассмотрим, как keysort/2 можно выразить в терминах sort/2 (См. Примечание для реализации).
Во многих ситуациях этот подход намного быстрее, чем использование типичного предиката сортировки реализации, который зависит от пользовательского порядка как SWI predsort(C_3, List, SortedList)
или SICStus samsort(O_2, List, SortedList).
Мой вопрос сводится к:
Существуют случаи, когда сортировка с использованием
predsort/3соответственно.samsort/3не может быть заменено некоторым отображением,sort/2-инг и проецирование? 1
И для ясности лучше придерживаться конечных, наземных терминов. Ибо бесконечные земные члены не обладают полным лексикографическим порядком, так как это необходимо в качестве расширения конечного случая; и далее неясно, как будет показано сравнение переменных с случаем зависимых от реализации двух разных переменных, приведенное в 7.2.1 ИСО/МЭК 13211-1:1995:
7.2.1 Переменная
Если
XиY- переменные, которые не идентичны, тоXterm_precedesYдолжен быть зависимым от реализации
за исключением того, что во время создания отсортированного списка (7.1.6.5,
8.10.3.1 j) порядок должен оставаться постоянным.
Так что неясно, будет ли predsort/3 по-прежнему квалифицироваться как
создание отсортированного списка. Ясно, что упорядочение остается неизменным во время sort/2 и keysort/2.
1 Благодаря @WillNess эта проекция должна по крайней мере включать также reverse/2 — или любое линейное преобразование. Это также означает, что результаты с использованием как дубликатов, так и уникальных могут быть реализованы (аналогично тому, как реализуется keysort/2).