37
список из (1) не сопоставляется с первым объектом утверждения.
Происходит откат к рекурсивному правилу (2), здесь происходит
рекурсия и элемента списка L1 помещаются в стек (работает метод
отделения головы от хвоста). С элементами списка L2 ничего не
происходит, список L3 не определен. При образовании пустого списка
L1 список L3 становится равным списку L2, на основании факта (1),
дальше идет обратная рекурсия. Элементы извлекаются из стека и один
за другим, помещаются в качестве головы к L1 и L3, значение
извлеченного из стека элемента присваивается переменной Х.
Шаги процедуры для объединения двух списков:
append ([a, b, c ],[d, e ], L).
append ([b, c],[ d,e], L).
append ([c],[d, e], L).
append ([ ],[ d, e], L).
append ([ ],[d, e], [d, e]).
append ([c],[d, e ], [c, d, e]).
append ([b, c],[d, e], [b, c, d, e]).
append ([a, b, c], [d, e], [a, b, c, d, e]).
4.2.5. Сортировка списков
Сортировка – это процесс переупорядочивания элементов списка в
определенном порядке. Назначением сортировки является ускорение
доступа к нужным элементам списка. Турбо-Пролог позволяет
осуществлять сортировку, используя три основных принципа действия
сортировок: принцип перестановки, принцип выборки, принцип вставки,
или их комбинаций. Список можно отсортировать, если между
элементами определено отношение порядка например, order(Х, Y): –
Х > Y. Данное отношение означает, что Х больше Y.
Особенно удобен для реализации на Турбо Прологе принцип
вставки, который осуществляется при помощи неоднократной вставки
элементов в список, до тех пор, пока он не будет упорядочен.
Рассмотрим процедуру, которая осуществляет такую сортировку.
insert_sort([ ], [ ]). (1)
insert_sort([X | Tail], sorted_list):– (2)
insert_sort(Tail, Sorted_Tail),
insert(X, Sorted_Tail, sorted_list).
insert(X, [Y|Sorted_list], [Y | Sorted_list1]):–(3)
order(X, Y), !,
insert(X, Sorted_list, Sorted_list1).
insert(X, Sorted_list, [X | Sorted_list]). (4)
order(X, Y):– X > Y. (5)
Процедура сортировки содержит два предиката :
insert_sort – предикат, производящий сортировку, имеет два объекта: