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

5.2.2 Добавление элемента без дублирования.

Чтобы добавить элемент в голову списка достаточно использовать

add(X, L, [X|L]).

Но если возникает необходимость добавлять только, если элемент отсутствует, то можно добавить правило:

add(X, L, L):-member(X, L), !. add(X, L, [X|L]).

Вопрос

?-add(a, [b, c], L). L=[a, b, c] ?-add(b, [b, c], L). L=[b, c]

Если сечение убрать, то

?-add(b, [b, c], L) L=[b, c]; L=[b, b, c]

Таким образом, при изъятии отсечения, изменился декларативный смысл программы - отсечение "красное".

5.2.3 Классификация.

Используя отсечение, легко произвести классификацию объектов.

Например, надо классифицировать числа

class(X, plus):-X>0, !. class(X, minus):-X<0, !. class(X, zero):-X=0, !.

?-class(4, Y). Y=plus

5.2.4 Отсечение в численной рекурсии.

Применение отсечения в рекурсии позволяет значительно сократить использование памяти.

Определим факториал

factorial(0, 1):-!. factorial(N, RES) :- N1 is N-1, factorial(N1, N1fak), Res is N*N1fak.

5.2.5 Замечания при использовании отсечения.

Применение сечения за счет сокращения перебора позволяет повысить эффективность программы. Кроме этого отсечение упрощает программирование выбора вариантов.

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

Поэтому отсечение требует осторожности в использовании.

Следует избегать двух ошибок:

  • отсечения путей вычисления, которые нельзя отбрасывать

  • и не отсечения тех решений, которые должны были быть отброшены.

5.3 Сортировка списков.

До сих пор средства пролога использовались при записи простых процедур и примеров. Рассмотрим более сложные примеры написания программ на прологе для различных методов сортировки:

  • Метод наивной сортировки

  • Метод пузырька

  • Метод вставки

  • Быстрая сортировка quick

5.3.1 Метод наивной сортировки.

В этом методе элементы в списке переставляются ( перемешиваются permutation/2 ),и проверяется отсортирован этот список или нет: sorted/1. Это записывается:

sortn(L1, L2) :- permutation(L1, L2), sorted(L2), !.

Перестановки определим через append

permutation(L, [H|T]) :- append(V, [H|U], L), append(V, U, W), permutation(W, T). permutation([], []).

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

sorted([L]). sorted([X,Y|T]) :- order(X,Y), sorted([Y|T]). order(X, Y) :- X =< Y.