Сортировка представляет собой переупорядочивание элементов списка определенным образом. Гораздо проще и гораздо эффективнее искать что-либо в отсортированном списке, нежели в неотсортированном.
Существует много способов сортировки списков. Сортирующее правило Турбо-Пролога принимает на вход неотсортированный список, и выдает отсортированный на выходе. Входной список называется ИСХОДНЫМ, выходной — ЦЕЛЕВЫМ.
Метод вставки особенно удобен для реализации его на Турбо-Прологе.
Идея этой сортировки следующая:
1. Извлекаем из списка голову H.
2. Методом вставки сортируем хвост.
3. Вносим H в подходящее место отсортированного хвоста.
Опишем предикат, производящий сортировку списка методом вставки
insert_sort(Source_list,Target_list)
Внешней целью в задаче сортировки списка [4,7,3,9] будет утверждение
insert_sort([4,7,3,9],S)
В этом утверждении отсортированный список обозначен переменной S. Правила, реализующие этот способ сортировки, имеют следующую структуру:
insert_sort([],[]).
insert_sort([H|T],Sorted_list) :-
insert_sort(T,Sorted_Tail),
insert(H,Sorted_Tail,Sorted_list).
insert(X,[H|Sorted_list],[H|Sorted_list1]) :-
X > H,!,
insert(X,Sorted_list,Sorted_list1).
insert(X,Sorted_list,[X|Sorted_list]).
Дальнейшее обсуждение продемонстрирует работу правил на примере списка [4,7,3,9].
Вначале Турбо-Пролог применяет приведенные правила к исходному списку, выходной список в этот момент еше не определен.
insert_sort([4,7,3,9],_)
Первая попытка удовлетворить правило insert_sort осуществляется с первым вариантом правила
insert_sort([],[])
Для удовлетворения правила оба списка должны быть пустыми.
Согласно второму варианту правила внутренние унификационные процедуры Турбо-Пролога пытаются сделать пустым исходный список. Рекурсия убирает элементы исходного списка, начиная с головы, и переносит их в стек. В результате применения этой процедуры список становится нулевым. Теперь первый вариант правила insert_sort производит обнуление выходного списка.
Далее, первое взятое из стека значение (9), вносится во второй список:
insert(9,[],[9])
Из стека извлекается следующий элемент (3), и при помощи второго варианта insert вставляется в выходной список слева от 9:
insert(3,[9],[3,9])
Происходит возврат к insert_sort, теперь оно имеет форму
insert_sort([3,9],[3,9])
Таким образом, все элементы извлекаются из стека и помещаются в выходной список.