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
- переменные, которые не идентичны, тоX
term_precedesY
должен быть зависимым от реализации
за исключением того, что во время создания отсортированного списка (7.1.6.5,
8.10.3.1 j) порядок должен оставаться постоянным.
Так что неясно, будет ли predsort/3
по-прежнему квалифицироваться как
создание отсортированного списка. Ясно, что упорядочение остается неизменным во время sort/2
и keysort/2
.
1 Благодаря @WillNess эта проекция должна по крайней мере включать также reverse/2
— или любое линейное преобразование. Это также означает, что результаты с использованием как дубликатов, так и уникальных могут быть реализованы (аналогично тому, как реализуется keysort/2
).