- •1. Введение в декларативные языки.
- •Прозрачность по ссылкам.
- •Логическое программирование
- •Правила
- •Примеры
- •Рекурсивные определения
- •Литература
- •Синтаксис пролога.
- •Структуры
- •Предикаты
- •Семантика пролога
- •Как происходит сопоставление
- •Алгоритм Эрбрана
- •Алгоритм вычисления целей(работы пролог машины).
- •Процедурный смысл правил
- •Использование списков и
- •Использование накапливающего параметра(прием)
- •Операторная запись
- •Управление перебором
- •Алгоритмы сортировки
- •1 Пузырьковая сортировка
- •Сортировка вставками
- •Быстрая сортировка.
- •Использование предикатов, анализирующих типы или структуру термов
- •Применение подстановки к структурированному терму
- •Недетерминированное программирование
- •Метод «породить и проверить»
- •Алгоритм сортировки
- •Программирование второго порядка
- •Рассмотрим, как работать с базой данный
- •Поиск в глубину
- •Темы кр
- •Использование формальных языков
- •Недетерминированный конечный автомат
- •Ввод и вывод
- •Рассмотрим ввод вывод алфавитно – цифровых символов
- •Функциональное программирование
- •Базовый язык
- •Рекурсивное определение функций
- •Функции высших порядков
- •Отображение списков
- •Декартово произведение множеств
- •Композиция функций.
- •Бесконечные списки
- •Рассмотрим как можно исп беск списки.
- •Метод породить и проверить
- •Сети связанных процессов
- •Определение ф чисел фибоначи
- •Задача хэмминга
- •Решето Эратосфена
- •Язык типов
- •Рассмотрим алгебраические типы данных.
- •Деревья – рекурсивные типы данных
- •Сделать дерево плоским
- •Удаление элемента дерева
- •Извлечение самого правого элемента
- •Функция форматирования числа
- •Законы функциональных программ
- •Наиболее важные законы функц программ доказываются по индукции
- •Закон map через foldr
- •Закон: композиция
- •Коммутативна
- •Дистрибутивность map относительно композиции:
- •Преобразование программ
- •Пример1
- •Стратегия для композиции
- •Приведение рекурсивной формы к итеративной форме
- •Введение в лямбда исчисление
- •Синтаксис лямбда исчисления
- •Множество связанных переменных
- •Множество свободных переменных
- •Подстановка
- •Конфликт имен(захват переменных)
- •Преобразование термов
- •Вторая теорема Черча – Россера “Теорема о стандартизации”
- •Комбинатор y
- •Вычислим fact 3
- •Вычислим fact 0
- •(Рассказ про y комбинатор – сразу зачёт)
Приведение рекурсивной формы к итеративной форме
Повысить эфф программы можно приведением ее к итеративному виду.
Т.е. к виду, в котором рекурсивные вызовы можно заменить на циклы.
Если рекур вызов вып в конце функции то и запоминать состояние не надо, надо сделать только переход, иначе запоминать с теке…
Говорят что множество определений F = {f1,f2,..,fn} находится в итеративной форме если для каждого определения fj функции с параметрами x1..xn, и с телом =ej , 1<=j<=N, и требование к ej (телу функции) должно быть следующим:
1 либо оно совсем не содержит вызовов функций f принадлежащих F
2 либо имеет форму fk e1..el и здесь e1,…el не содержат вызовов функций f из множества F. Вызов может быть атким что он составляет все тело функции, только вопрос в параметрах, они не должны иметь рекурсивных признаков
3 либо оно, тело, условное выражение с ветвями, имеющими одну из вышеперечисленных форм. Тело функции может быть формой if…
если такие условия выполняются то такие рекурсивные функции можно запрограммировать в императивном стиле, при этом имена функций будут служить метками, по которым будет передаваться управление программе.
*каждая функция это начало кода со своей меткой.
Мы рассмотрим оч простой пример, возьмем функцию выч факториал.
Рекурсивное определение
Fact 0 = 1
Fact (n+1) = (n+1) * (fact n)
Введем новую функцию f, в которой u обобщает (n+1)
3 f n u= u * (fact n)
Конкретизируем и раскроем по 1 и 2 это определение
4 f 0 u = u
5 f (n+1) u = u * ((n+1)*(fact n))
Учитывая ассоциативность умножения, свернем по 3
= f n u * (n+1)
Вырази fact через f, свернув по 2 и 3
6 fact (n+1) = f n (n+1)
Определения 1,6,4,5 – это итеративная реализация функии факториала.
Введение в лямбда исчисление
Будем говорит о теоритеч основах…
Лямбда исчисление была предложено в 1934 году Алонзом Чёрчем.
Парадоксы… и надо было исп другой стиль представления функкий…. Черч предложил опр функции как правило преобразующее свой аргумент в результат. Благодаря лямбда исчислению теория множеств получилась свободная от парадоксов. Потом ученые выяснили что лямбда исч можно исп как язык программирование, так и формальную основу для описания семантики языков программирования.
Синтаксис лямбда исчисления
Термы(выражения) лямбда-исчисления (будем обозначать их L,M,N…) строятся индуктивно из заданного множества переменных x,y,z… след образом
1 х – переменная явл термом
2 (лямбда х. М) – абстракция явл термом (как \x->e)
3 (M N) – применение функции явл термом
Запись M ΞN обозначает что M и N идентичны.
Метасимволы L,M,N метаязык а не язык лямбда исчисления.
Мы будем определять равенство M=N, но надо рассмотреть семантику исчисления.
Множество связанных переменных
(как глобальные и локальные переменные)
Свободные переменные – глобальные
Связанные переменные – локальные
(Lambda x.(lamday.(x z)))
Z – свободна, x - связана
BV – функция, которая строит связанные переменные. Bound value. Множеств переменных для которых есть лямбда абстракция. Надо терм рекурсивно разобрать, а вариантов будет только 3…(3 вида термов).
BV(x)=O (пустое множество)
BV(lambda x.M) = BV(M) u {x}
BV(M N) = BV(M) u BV(N)
Х – связанная здесь переменная…