Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пролог.doc
Скачиваний:
17
Добавлен:
10.11.2018
Размер:
1.44 Mб
Скачать

7.12.3. Разделение на два списка.

Разделение на два списка используется тогда, когда для целей текущей обработки нужна лишь часть списка.

Разделить(M, L, L1, L2) – М – компаратор, – исходный список, L1, L2 – подсписки результата. В L1 помещаются все элементы исходного списка меньшие или равные компаратора, а в L2 – элементы исходного списка, большие компаратора.

Правило разделения списка гласит: очередной элемент извлекается из списка по методу выделения головы, а потом сравнивается с компаратором.

Граничное условие: разделить(_. [ ], [ ], [ ])

  1. Разделить (M, [H|T], [H|L1], L2): – H<=M, разделить (M, T, L1, L2].

  2. Разделить (M, [H|T], L1, [H| L2): – разделить(M, T, L1, L2), H>M.

Пример.

Компаратор M=40, список L= [30, 50, 20, 25, 65, 95]

H T L1 L2

30 [50, 20, 25, 65, 95] [ ] [ ]

50 [20, 25, 65, 95] [30] [ ]

20 [25, 65, 95] [30] [50]

[30, 20]

Задания для самостоятельной работы.

  1. Написать программу, находящую последний элемент в списке.

  2. Написать программу поверки на соседство двух элементов.

  3. Написать программу обращения списков.

  4. Написать программу, исключающую элемент из списка.

  5. Написать программу, замещающую элемент X на элемент А.

  6. Написать программу, проверяющую содержится ли список X в списке Y.

7.13. Сортировки

Сортировки служат для переупорядочивания элементов определенным образом, для упрощения доступа к нужным элементам.

Рассмотрим четыре простых метода сортировки: 1) наивная, 2) включением, 3) методом пузырька, 4) быстрая.

7.13.1. Наивная сортировка.

По этому методу вначале создается некоторая перестановка чисел, затем проверяется, расположена ли она по возрастанию.

Sort(Xs, Ys):-permutation(Xs, Ys),ordered(Ys).

Permutation(Xs, [Z,Zs]):– select(Z, Xs, Ys),permutation(Ys, Zs).

Permutation([ ], [ ]).

Ordered([X]).

Ordered([X, Y|Ys]):-X<=Y, ordered([Y|Ys}).

Наивная_cорт(L1, L2): – перестановка(L1, L2), oтсортировано(L2), !.

Перестановка (L, [H|T]):– присоединить (V, [H|U], L), присоединить (V, U, W), перестановка (W, T).

Перестановка ([ ], [ ]) – граничное условие.

Отсортировано (L): - (0, L) – первый элемент 0.

Отс(_, [ ]).

отс(N, [H|T]): – N<H, отс (H, T).

7.13.2. Сортировка включением.

При этой сортировке каждый элемент удаляется из головы списка и передается предикату вклюсор2, который включают его в список и возвращает измененный список.

вклюсор ([ ], [ ]) – граничные условия.

Рекурсивные условия: вклюсор ([Х |L], М): – вклюсор(L, N), вклюсор2(X, N, M).

вклюсор2(X, [Y, L], [Y|M]): – X>Y, !, вклюсор2(X, L, M).

Граничные условия: вклюсор2(X, L, [X|L]). Это условие соответсвует случаю, когда элемент изначально стоит на своем месте.

7.13.3. Метод «пузырька».

При сортировке по этому методу производится поиск пары соседних элементов, стоящих не по порядку и обмен их местами. Такая операция делается до тех пор, пока такие пары находятся.

Пусорт (L,S): – присоединить (X, [A, B|Y], L), B<A, присоединить(X, [B, A|Y]M), пусорт (M, S).

Граничные условия: пусорт (L, L).

присоединить ([ ], L, L) – граничные условия.

Рекурсивное: присоединить([H|T], L, [H|V]): – присоединить (T, L, V).

Способ отличается от предыдущих необходимостью возвратного хода, поэтому в первом правиле отсечение не используется. Вывод и проверка осуществляется предикатом «Присоединить».