
- •1. Введение в декларативные языки.
- •Прозрачность по ссылкам.
- •Логическое программирование
- •Правила
- •Примеры
- •Рекурсивные определения
- •Литература
- •Синтаксис пролога.
- •Структуры
- •Предикаты
- •Семантика пролога
- •Как происходит сопоставление
- •Алгоритм Эрбрана
- •Алгоритм вычисления целей(работы пролог машины).
- •Процедурный смысл правил
- •Использование списков и
- •Использование накапливающего параметра(прием)
- •Операторная запись
- •Управление перебором
- •Алгоритмы сортировки
- •1 Пузырьковая сортировка
- •Сортировка вставками
- •Быстрая сортировка.
- •Использование предикатов, анализирующих типы или структуру термов
- •Применение подстановки к структурированному терму
- •Недетерминированное программирование
- •Метод «породить и проверить»
- •Алгоритм сортировки
- •Программирование второго порядка
- •Рассмотрим, как работать с базой данный
- •Поиск в глубину
- •Темы кр
- •Использование формальных языков
- •Недетерминированный конечный автомат
- •Ввод и вывод
- •Рассмотрим ввод вывод алфавитно – цифровых символов
- •Функциональное программирование
- •Базовый язык
- •Рекурсивное определение функций
- •Функции высших порядков
- •Отображение списков
- •Декартово произведение множеств
- •Композиция функций.
- •Бесконечные списки
- •Рассмотрим как можно исп беск списки.
- •Метод породить и проверить
- •Сети связанных процессов
- •Определение ф чисел фибоначи
- •Задача хэмминга
- •Решето Эратосфена
- •Язык типов
- •Рассмотрим алгебраические типы данных.
- •Деревья – рекурсивные типы данных
- •Сделать дерево плоским
- •Удаление элемента дерева
- •Извлечение самого правого элемента
- •Функция форматирования числа
- •Законы функциональных программ
- •Наиболее важные законы функц программ доказываются по индукции
- •Закон map через foldr
- •Закон: композиция
- •Коммутативна
- •Дистрибутивность map относительно композиции:
- •Преобразование программ
- •Пример1
- •Стратегия для композиции
- •Приведение рекурсивной формы к итеративной форме
- •Введение в лямбда исчисление
- •Синтаксис лямбда исчисления
- •Множество связанных переменных
- •Множество свободных переменных
- •Подстановка
- •Конфликт имен(захват переменных)
- •Преобразование термов
- •Вторая теорема Черча – Россера “Теорема о стандартизации”
- •Комбинатор y
- •Вычислим fact 3
- •Вычислим fact 0
- •(Рассказ про y комбинатор – сразу зачёт)
Алгоритмы сортировки
1 Пузырьковая сортировка
bubble(Src,Res) :-
exchange(Src,Tmp),!,
bubble(Tmp,Res).
bubble(Src,Src).
exchange([X,Y|Rest],[Y,X|Rest]) :- X>Y.
exchange([H|L1],[H|L2]):-exchange(L1,L2).
Если в списке есть 2 соседних элемента нарушающих заданный порядок, то переставляем эти элементы и продолжаем сортировку, иначе завершаем сортировку поскольку список получился упорядоченным.
Иначе – значит рассмотренные нами случае альтернативны…отсечение…
1 входной список Src, 2 аргумент – Res – результат.
Предикат Exchange – поменять местами.
Если можно поменять местами то получим новый вмененный список tmp, далее безальтернативно используя отсечение будем сортир полученный список tmp, чтобы получить результат Res, этот рез –т базовый случай…второе правило…оно будет выполняться только когда exchange потерпит неудачу и тогда исходный список будет результирующим списком, происходит выдача результата.
Рассмотрим предикат Exchange(поменять местами).
1 случай – если в исх списке 2 первых элемента X и Y такие что X>Y, то нарушение обнаружено в начале списка то результатом будет список Y, X и далее неизмененный хвост. Иначе второй случай. Мы строим список первая голова которого остается на месте, а хвост получается перестановкой в хвосте, соответ. первой голове.
…..После условия нужно поставить отсечение….. иначе будет действовать 2 правило, голова H и хвост L1.
Сортировка вставками
insSort([X|Xs],Ys) :- insSort(Xs,Zs), insert(X,Zs,Ys). insSort([],[]). insert(X,[],[X]). insert(X,[Y|Ys],[Y|Zs]) :- X > Y, insert(X,Ys,Zs). insert(X,[Y|Ys],[X,Y|Ys]) :- X =< Y.
Идея. Отсортированный список – это отсортированный хвост исх. списка, в который вставлена его голова так, чтобы не нарушился порядок сортировки.
1 исх список, 2 – результир.список.
Если список имеет голову X и хвост Xs то нужно отсорт хвост Xs, получается список Zs далее нужно вставить Xs спец функцией в …. И получ. результат.
В базовом случае, когда исх список пуст – то результат пустой список.
Insert – вставка в отсорт. список не нарушая порядка сортировки.
В общем случае у нас задан элемент X список Y Ys получаем список Y Zs если X>Y. Нужно двигаться в глубь списка… Если X<=Y то мы можем этот элемент сразу вставить.
Базовый случай, когда список пуст, то результатом будет список, содерж. один элемент X.
Процедуру Insert можно реализовать с отсечением.
Быстрая сортировка.
quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Bigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). quicksort([],[]). partition([X|Xs],Y,[X|Ls],Bs) :- X < Y, partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X >= Y, partition(Xs,Y,Ls,Bs). partition([],Y,[],[]).
Были n2. Эта быстрее.
Список каждый раз делится пополам, сорт его половинки и за счет этого повышается эффективность. Метод разделяй и властвуй.
Log2
Идея. Для того чтобы отсортировать список L нужно взять его голову, хвост разделить на 2 списка. В первом списке будут элементы меньшей головы, во втором большей или равные. Далее оба списка сортируем. Результат получается сцеплением двух списков. Первый из них – это отсортированный список меньшиъ элементов, а второй список имеет голову как у исходного списка, а хвост отсортированный список бОльших элементов.
quicksort([X|Xs],Ys) 1 - исх список, 2 – результирующий.
partition(Xs,X,Littles,Bigs), - разбиение, поделим хвост Xs с головой … на 2 списка Littles b Bigs.
quicksort(Littles,Ls), quicksort(Bigs,Bs),
далее сцепление 2х списков append(Ls,[X|Bs],Ys). Берутся меньшие элементы ,к ним большие, получаем Ys – рез-т работы всей процедуры.
Если список пустой – то тоже пустой список.
Имеем 2 выходных параметра -3 и 4,меньшие и большие.
partition([X|Xs],Y,[X|Ls],Bs) :- X < Y, partition(Xs,Y,Ls,Bs).
partition([X|Xs],Y,Ls,[X|Bs]) :- X >= Y, partition(Xs,Y,Ls,Bs).
partition([],Y,[],[]). Базовый случай, разделение пустого списка – 2 пустых списка. Эту процедуру можно сделать с отсечением!