- •1. Введение в декларативные языки.
- •Прозрачность по ссылкам.
- •Логическое программирование
- •Правила
- •Примеры
- •Рекурсивные определения
- •Литература
- •Синтаксис пролога.
- •Структуры
- •Предикаты
- •Семантика пролога
- •Как происходит сопоставление
- •Алгоритм Эрбрана
- •Алгоритм вычисления целей(работы пролог машины).
- •Процедурный смысл правил
- •Использование списков и
- •Использование накапливающего параметра(прием)
- •Операторная запись
- •Управление перебором
- •Алгоритмы сортировки
- •1 Пузырьковая сортировка
- •Сортировка вставками
- •Быстрая сортировка.
- •Использование предикатов, анализирующих типы или структуру термов
- •Применение подстановки к структурированному терму
- •Недетерминированное программирование
- •Метод «породить и проверить»
- •Алгоритм сортировки
- •Программирование второго порядка
- •Рассмотрим, как работать с базой данный
- •Поиск в глубину
- •Темы кр
- •Использование формальных языков
- •Недетерминированный конечный автомат
- •Ввод и вывод
- •Рассмотрим ввод вывод алфавитно – цифровых символов
- •Функциональное программирование
- •Базовый язык
- •Рекурсивное определение функций
- •Функции высших порядков
- •Отображение списков
- •Декартово произведение множеств
- •Композиция функций.
- •Бесконечные списки
- •Рассмотрим как можно исп беск списки.
- •Метод породить и проверить
- •Сети связанных процессов
- •Определение ф чисел фибоначи
- •Задача хэмминга
- •Решето Эратосфена
- •Язык типов
- •Рассмотрим алгебраические типы данных.
- •Деревья – рекурсивные типы данных
- •Сделать дерево плоским
- •Удаление элемента дерева
- •Извлечение самого правого элемента
- •Функция форматирования числа
- •Законы функциональных программ
- •Наиболее важные законы функц программ доказываются по индукции
- •Закон map через foldr
- •Закон: композиция
- •Коммутативна
- •Дистрибутивность map относительно композиции:
- •Преобразование программ
- •Пример1
- •Стратегия для композиции
- •Приведение рекурсивной формы к итеративной форме
- •Введение в лямбда исчисление
- •Синтаксис лямбда исчисления
- •Множество связанных переменных
- •Множество свободных переменных
- •Подстановка
- •Конфликт имен(захват переменных)
- •Преобразование термов
- •Вторая теорема Черча – Россера “Теорема о стандартизации”
- •Комбинатор y
- •Вычислим fact 3
- •Вычислим fact 0
- •(Рассказ про y комбинатор – сразу зачёт)
Язык типов
Он имеет очень простую грамматику, тип может задаваться переменной, обозначаемой как и переенной в хаскеле идентификатором, начин с маленькой буквы.
1) a,b,c …
Переменная обозначает любой тип
Если в определении типа встречается переменная, то такой тип будет полиморфным.
2ой вариант – тип может обозначаться конструктором типа, примененным к заданному числу аргументов.
: конструктор который опр пару – голова и хвост
Для того чтобы задать тип список нужно задать его элементов….
[a] – список (полиморфный)
И
4) Int, Bool, Float, …. (базовые типы)
5) тип картеж, (Int, a), к примеру целое и полиморфный компонент
И самый важный, функциональный тип., 6) конструктор стрелока, -> например тип a->b этоф-ия, котора преобр элементы типа А в элементы типа B
Ф-ия целочисленного сложения имеет тип Int->Int->Int
Оператор стрелка ассоциативен вправо, в соответ с механизмом карирования.
Int->(Int->Int)
Каждому выражению программы написанной на хаскеле можно поставить в соответствие его тип.
Это соответствие задается оператором ::
(это задание типов)
append:: [a]->[a]->[a]
здесь append получает 2 аргумента, однотипные списки, и результатом будет список того же типа.
foldr:: (a->b->b)->b->[a]->b
(справо налево, она в кач первого арг полу тоже функцию, она имеет тип ..нач знач типа b,список с типом а обрабатывает, рез Б)
Еще функция точка (.) это композиция функций, когда функции выстраиваются последовательно. Она получ функцию из а на б
(.):: (a->b) -> (c->a) -> (c->b)
Эти определения типов как пояснения к проге и они еще локализуют… и несоотвествие типов нужно искать уже внутри тогда.
Рассмотрим алгебраические типы данных.
Типы, определяемые пользователем
Data Конструктор_типа =
Конструктор_данных1
| Конструктор_данны2
…
| Конструктор_данныхN
Из простых типов строим новый более сложный тип. Задаются конструкцией Data.
Конструктор типа определяет совокупность вариантов данных, а каждый вариант задается конструктором данных.
Конструкторы типов и данных начиются с большой буквы и могут иметь параметры, которые задают типы компонентов
Пример алг типа
data List a = Nil | Cons a (List a)
deriving (Eq, Ord, Show, Read)
это мы заново определили список. Первый конструктор нил обознач пустой список, второй имеет 2 компонента типа a и типа List a. Это определение списка показывает что алг типы данных могут быть рекурсивными.
Eq равенство, больше меньше, преобр в строку, чтение из строки
[] эквивалентен Nil
: эквивалентно Cons
Перечисляемый тип
data Color = Red | Green | Blue
isRed:: Color->Bool
isRed Red = True
isRed _ = False
*с алгбаич типами данных можно применять сопоставление с образцом.
Конструкторы данных могут содержать значение
data Color’ = Red | Green | Blue | Grayscale Int
поговорим о том почему эти типы алгебраические. Потому что с ними можно выполнять алг операции.
Произведение типов
type дает синоним типу.
type Name = String
type Age = Int
data People = Person Name Age
p = Person “Ann” 20
type string = [Char]
name берет свои значения из множества всех строк
age – minInt .. MaxInt
конструктор Person дает множество значений который определяются декартовым произведением.
Конструкторы данных позволяют строить произведение типов.
Это первая алг операция
Сумма типов
type Pnt = (Float, Float)
data MarkType = Arrow | Cross | Aim
data Shape = Marker Pnt MarkType
| Line Pnt Pnt
| Rect Pnt Pnt
| Circ Pnt Float
area :: Shape -> Float
area (Marker _ _)= 0
area (Line _ _)=0
area(Rect (x1,y1) (x2,y2) )
= abs (x1-x2)*abs(y1-y2)
Area (Circ _ r) = pi*r*r
Тип shape это сумма возможных значений вариантов.
Рассмотрим пример рекурсивного алг типа
Типом Expr задаетяс множество ариф выражений
data Expr = Lit Int | Add Expr Expr
| Sub Expr Expr
Выражение 1+(5-3) представляется так
Add (Lit 1) (Sub (Lit 5) (Lit 3))
Функция, выч варажение
eval:: Expr -> Int
eval (Lit x) = x
eval (Add e1 e2) = eval e1 + eval e2
eval (Sub e1 e2) = eval e1 – eval e2
инфиксные конструкторы
в нашем примере Add и Sub имеют два аргумента, их можно брать в обратные кавычки и исп как операторы.
hit S `Sub` hit 3
в форме data конструкторы могут быть операторами начин двоеточием
data E = L Int | E :+: E | E:-: E
deriving Show
Выражение 1+(5-3) представляется
L 1 :+: (L 5 :-: L 3)
Ф, выч выражение
eval’:: E-> Int
eval’ (L x) = x
eval’ (e1 :+: e2) = eval’ e1 + eval’ e2
eval’ (e1 :-: e2) = eval’ e1 – eval’ e2
y = eval’ (L 1 :+: (L 5 :-: L 3))
Этот пример показывают способ вычисления выражений, семантику.