Сортировка списка в прологе

Prolog имеет уникальный способ обработки вещей, тем более, что практически каждая операция включает в себя рекурсию того или иного рода.

одним из классических примеров каждого языка является сортировка списка целых чисел в порядке возрастания.

каков оптимальный способ (без использования слишком много встроенных предикатов, что исключает предикат sort/2, Конечно) для сортировки случайного списка целых чисел?

2 ответов


сайт программирования Prolog Романа Бартака дает примеры различных алгоритмов сортировки, заканчивая оптимизированным quicksort.

quick_sort2(List,Sorted):-q_sort(List,[],Sorted).
q_sort([],Acc,Acc).
q_sort([H|T],Acc,Sorted):-
    pivoting(H,T,L1,L2),
    q_sort(L1,Acc,Sorted1),q_sort(L2,[H|Sorted1],Sorted)

насколько я знаю, лучшие алгоритмы сортировки, написанные в Prolog напрямую, без ссылки на какие-либо специальные встроенные модули используют некоторую форму сортировки слияния.

частая оптимизация - начать слияние не со списками длины 1, а с уже отсортированными сегментами.

то есть отсортировать список [4,5,3,6,2,7,1,2] списки [4,5],[3,6],[2,7],[1,2] будут объединены.

это можно оптимизировать еще больше, собирая сортированные списки не только по возрастанию направлении, но и в другом направлении. В приведенном выше примере это означает, что отсортированный сегмент собирается следующим образом:

[4,5|_]
[3,4,5|_]
[3,4,5,6|_]
...

обратите внимание, что в Prolog прямо вперед, чтобы расширить список как в начале, так и в конце.

таким образом, мы должны объединить [1,2,3,4,5,6,7] и [2] только.

текущая система, которая использует оригинальную реализацию (~1984) Ричарда О'Кифа, является Чао-Пролог на ciao-1.15/lib/sort.pl.