ݺߣ

ݺߣShare a Scribd company logo
1
Кубенский А.А. Функциональное программирование.
Глава 5. Системы исполнения функциональных программ.
Глава 5. Системы исполнения функциональных программ
5.3. Функциональные модели последовательных процессов
Рассмотрим простой язык императивного программирования без функций,
переходов и сложных структур данных.
Выражения:
 Целые числа: 12 25 0
 Простые переменные целого типа: x myInt
 Унарные и бинарные операции с целыми результатами: (x+12) * (y-1)
 Логические константы и выражения (но не переменные): not (x < 5)
Операторы:
 Присваивание: x := x+1
 Последовательное исполнение: begin s1; s2; ... end
 Условный оператор: if b then s1 else s2
 Пустой оператор: skip
 Оператор цикла: while b do s
Программа начинает работу в состоянии, заданном совокупностью значений переменных
(например, заданных оператором ввода данных), а результат программы – конечное состояние
(например, выведенное в конце работы оператором вывода).
2
Кубенский А.А. Функциональное программирование.
Глава 5. Системы исполнения функциональных программ.
Рассмотрим программу вычисления факториала.
Пример программы.
begin f := 1;
while n > 1 do begin
f := f * n;
n := n – 1
end
end
В начальном состоянии существенно только
значение переменной n; в конце работы результат
определяется значением переменной f.
Прежде всего, переведем программу в вид, удобный для обработки.
data Expression = { представление выражений }
data Operator = { представление операторов }
data Context = { представление контекста переменных }
Два способа обработки и исполнения программы:
 Интерпретация: interpret :: Operator -> Context -> Context
 Компиляция: compile :: Operator -> (Context -> Context)
На самом деле оба способа представлены одной и той же карринговой функцией!
3
Кубенский А.А. Функциональное программирование.
Глава 5. Системы исполнения функциональных программ.
Представление выражений и программ.
data Expression = Integral Int | Logical Bool
| Variable String
| Unary String Expression
| Binary Expression String Expression
data Operator = Skip
| Assignment String Expression
| Sequence [Operator]
| If Expression Operator Operator
| While Expression Operator
type Context = [(String, Expression)]
interpret :: Operator -> Context -> Context
eval :: Expression -> Context -> Expression
eval v@(Integral n) _ = v
eval v@(Logical b) _ = v
eval (Variable x) ctx = assoc x ctx
eval (Unary op ex) ctx = intrinsic op [eval ex ctx]
eval (Binary e1 op e2) ctx = intrinsic op [eval e1 ctx, eval e2 ctx]
intrinsic "+" [(Integral a), (Integral b)] = Integral (a+b)
intrinsic "-" [(Integral a)] = Integral (-a)
intrinsic "and" [(Logical a), (Logical b)] = Logical (a && b)
intrinsic :: String -> [Expression] -> Expression
4
Кубенский А.А. Функциональное программирование.
Глава 5. Системы исполнения функциональных программ.
Исполнение операторов.
replace :: String -> Expression -> Context -> Context
replace x val = map ((y,v) -> (y,if x == y then val else v))
replace "f" (Integral 20) [("n", (Integral 4)), ("f", (Integral 5))]
Например:
даст в результате [("n", (Integral 4)), ("f", (Integral 20))]
interpret :: Operator -> Context -> Context
interpret Skip ctx = ctx
interpret (Assignment x expr) ctx = replace x (eval expr ctx) ctx
interpret (Sequence []) ctx = ctx
interpret (Sequence (s:seq)) ctx = interpret (Sequence seq) (interpret s ctx)
interpret (If expr s1 s2) ctx = case (eval expr ctx) of
(Logical True) -> interpret s1 ctx
(Logical False) -> interpret s2 ctx
interpret oper@(While expr s) ctx = case (eval expr ctx) of
(Logical True) -> interpret oper (interpret s ctx)
(Logical False) -> ctx
5
Кубенский А.А. Функциональное программирование.
Глава 5. Системы исполнения функциональных программ.
Пример компиляции и исполнения программы
begin f := 1;
while n > 1 do begin
f := f * n;
n := n – 1
end
end
program =
Sequence
[(Assignment "f" (Integral 1)),
(While
(Binary (Variable "n") ">" (Integral 1))
(Sequence
[(Assignment "f" (Binary (Variable "f") "*" (Variable "n"))),
(Assignment "n" (Binary (Variable "n") "-" (Integral 1)))]))
]
compile program - функция преобразования контекстов
interpret program [("f", (Integral 0)), ("n", (Integral 3))]
[("f", (Integral 6)), ("n", (Integral 0))]
6
Кубенский А.А. Функциональное программирование.
Глава 6. Введение в редукцию графов.
Глава 6. Введение в редукцию графов
6.1. Представление лямбда-выражений в виде графов
Будем исходить из представления программ в виде структур данных расширенного лямбда-
исчисления. Наша основная задача – корректно представить концепцию разделения переменных.
Константа c. c
Примитивная функция f. f
Лямбда-выражение λx.E.
λ
x E
Применение функции E1 E2.
@
E1 E2
Применение конструктора C x y z.
C
x zy
7
Кубенский А.А. Функциональное программирование.
Особенности представления некоторых типов выражений.
Представление лямбда-выражений в виде графов (продолжение).
Глава 6. Введение в редукцию графов.
Частичное применений примитивных функций и конструкторов.
1+2 + 1 2 + 1
@
+ 1
@
2
@
+ 1
1 : lst : 1 lst
:
1 lst
: 1
@
: 1
или :
1 t
λ
t
8
Кубенский А.А. Функциональное программирование.
Представление лямбда-выражений в виде графов (продолжение).
Глава 6. Введение в редукцию графов.
Блоки let x = E1 in E2 и letrec x1 = E1;... xk = Ek in E.
let x = E1 in E2 (λx.E2) E1
E2
λ
x
@
E1
letrec x1 = E1;... xk = Ek in E – моделируется с помощью циклических графов.
9
Кубенский А.А. Функциональное программирование.
let twice = λf.λx.f (f x) in twice (λx.+ x 1) 2
Пример представления выражения в виде графа.
Глава 6. Введение в редукцию графов.
(λf.λx.f (f x)) (λx.+ x 1) 2
2
λ
x
λ
f
f
@
x
@
f
λ
@
@
x @
@
+ x
1
10
Кубенский А.А. Функциональное программирование.
• Нахождение самого левого из самых внешних редексов: проход по «левому гребню» графа.
Правила редукции графов.
Глава 6. Введение в редукцию графов.
2
x
x
@
succ
λ
@
• Копирование тела лямбда-выражения.
x
@
succ
• Подстановка аргумента вместо свободных вхождений переменной лямбда-выражения в тело.
• Замещение в дереве @-узла результатом «вычислений».
Некоторые особенности этой процедуры:
• Тело лямбда-выражения копируется, чтобы его можно было переиспользовать; «мусор»
удаляется
• Подстановка аргументов производится с помощью установки ссылок; тем самым
производится эффективное разделение переменных
• Результат редукции замещает редуцируемое выражение, тем самым все ссылки на этот
результат будут иметь новое значение
11
Кубенский А.А. Функциональное программирование.
Пример редукции графов.
Глава 6. Введение в редукцию графов.
(λf.λx.f (f x)) (λx.+ x 1) 2
2
λ
x
λ
f
f
@
x
@
f
λ
@
@
x @
@
+ x
1
12
Кубенский А.А. Функциональное программирование.
Глава 6. Введение в редукцию графов.
2
λ
@
@
x @
@
+ x
1
Пример редукции графов.
(λf.λx.f (f x)) (λx.+ x 1) 2
@
@
+
1
3
4
13
Кубенский А.А. Функциональное программирование.
δ-редукция в графовом представлении
Глава 6. Введение в редукцию графов.
Если при проходе по левому гребню находим константу, то это – примитивная функция
2
+
@
3
@
- сначала выполняем редукцию всех строгих аргументов;
- потом формируем результат в соответствии с правилами этой примитивной функции;
- результат замещает собой корень редекса.
@
@
*
6
12
14
Кубенский А.А. Функциональное программирование.
Общий алгоритм редукции графов (пока без учета рекурсии)
Глава 6. Введение в редукцию графов.
while (выражение не находится в СЗНФ) {
спуск от корня по левому гребню до первой вершины, отличной от @-вершины;
switch (тип вершины) {
case (примитивная функция):
if (число аргументов k > числа пройденных @-вершин)
выражение находится в СЗНФ;
else {
редуцировать все строгие аргументы;
сформировать результат согласно правилам примитивной функции;
заменить k-ю @-вершину этим результатом;
}
break;
case (λ-вершина):
if (выше нет @-вершин)
выражение находится в СЗНФ;
else {
создать копию тела с подстановкой (разделяемого) аргумента
вместо свободных вхождений переменной λ-выражения;
подставить результат вместо вершины редекса (первая @-вершина вверх по гребню);
}
break;
default: // константа-значение или конструктор
if (выше нет @-вершин)
выражение находится в СЗНФ;
else
ошибка типа !
break;
}
}
15
Кубенский А.А. Функциональное программирование.
Использование вершин-синонимов
Глава 6. Введение в редукцию графов.
При выполнении редукций есть одна проблема, связанная с копированием: в теле функции
переменная может быть в корне. Тогда вместо подстановки ссылки на аргумент придется делать
копию вершины, представляющей аргумент.
+
@
λ
@
x
1
2
x
@
x
@
Можно вместо копирования вершины создавать «вершину-синоним» - «прозрачную» по ссылкам.
Θ
При прохождении вершины-синонима можно оптимизировать их количество, убирать двойные
синонимы, заменять ссылки на синоним ссылками на саму вершину.
16
Кубенский А.А. Функциональное программирование.
Использование вершин-синонимов (продолжение)
Глава 6. Введение в редукцию графов.
Аналогичная проблема возникает при применении примитивных функций-селекторов, которые
не преобразуют, а просто выдают аргумент или его часть (например, head или tail).
head
head
@
@
:
:
1 nil
nil
head (cons (head (cons 1 nil)) nil)
Θ
Θ

More Related Content

What's hot (20)

8 3-3
8 3-38 3-3
8 3-3
natanikonenko19
алгоритмы stl
алгоритмы stlалгоритмы stl
алгоритмы stl
mcroitor
Урок 1. Что такое функциональное программирование
Урок 1. Что такое функциональное программированиеУрок 1. Что такое функциональное программирование
Урок 1. Что такое функциональное программирование
Система дистанционного обучения MyDLS
2014.12.06 04 Евгений Тюменцев — Откуда появились s.o.l.i.d. принципы
2014.12.06 04 Евгений Тюменцев — Откуда появились s.o.l.i.d. принципы2014.12.06 04 Евгений Тюменцев — Откуда появились s.o.l.i.d. принципы
2014.12.06 04 Евгений Тюменцев — Откуда появились s.o.l.i.d. принципы
HappyDev
Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
Dev2Dev
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
etyumentcev
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Positive Hack Days
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Nikolay Grebenshikov
Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.
Система дистанционного обучения MyDLS
теория рекурсивных функций
теория рекурсивных функцийтеория рекурсивных функций
теория рекурсивных функций
Mariya_Lastochkina
A System of Deductive Verification of Predicate Programs
A System of Deductive Verification of Predicate ProgramsA System of Deductive Verification of Predicate Programs
A System of Deductive Verification of Predicate Programs
Iosif Itkin
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
mcroitor
Python: Модули и пакеты
Python: Модули и пакетыPython: Модули и пакеты
Python: Модули и пакеты
Theoretical mechanics department
Математическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принциповМатематическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принципов
etyumentcev
стандартная библиотека с++: введение
стандартная библиотека с++: введениестандартная библиотека с++: введение
стандартная библиотека с++: введение
mcroitor
Java8. Innovations
Java8. InnovationsJava8. Innovations
Java8. Innovations
Nakraynikov Oleg
алгоритмы stl
алгоритмы stlалгоритмы stl
алгоритмы stl
mcroitor
2014.12.06 04 Евгений Тюменцев — Откуда появились s.o.l.i.d. принципы
2014.12.06 04 Евгений Тюменцев — Откуда появились s.o.l.i.d. принципы2014.12.06 04 Евгений Тюменцев — Откуда появились s.o.l.i.d. принципы
2014.12.06 04 Евгений Тюменцев — Откуда появились s.o.l.i.d. принципы
HappyDev
Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
Математическое обоснование SOLID принципов - Евгений Тюменцев Dev2Dev v2.0 30...
Dev2Dev
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
математическое обоснование Solid принципов. Конференция dotnetconf (Челябинск...
etyumentcev
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Алгоритмы решения задачи о булевой выполнимости (SAT) и их применение в крипт...
Positive Hack Days
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Nikolay Grebenshikov
теория рекурсивных функций
теория рекурсивных функцийтеория рекурсивных функций
теория рекурсивных функций
Mariya_Lastochkina
A System of Deductive Verification of Predicate Programs
A System of Deductive Verification of Predicate ProgramsA System of Deductive Verification of Predicate Programs
A System of Deductive Verification of Predicate Programs
Iosif Itkin
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
mcroitor
Математическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принциповМатематическое обоснование S.O.L.I.D принципов
Математическое обоснование S.O.L.I.D принципов
etyumentcev
стандартная библиотека с++: введение
стандартная библиотека с++: введениестандартная библиотека с++: введение
стандартная библиотека с++: введение
mcroitor

Viewers also liked (17)

Урок 3. Карринг и ленивые вычисления.
Урок 3. Карринг и ленивые вычисления.Урок 3. Карринг и ленивые вычисления.
Урок 3. Карринг и ленивые вычисления.
Система дистанционного обучения MyDLS
Fifty Years of Global LNG, Trafigura White Paper
Fifty Years of Global LNG, Trafigura White PaperFifty Years of Global LNG, Trafigura White Paper
Fifty Years of Global LNG, Trafigura White Paper
Trafigura
World wonders - Learning new words
World wonders - Learning new wordsWorld wonders - Learning new words
World wonders - Learning new words
YazeedLanka
Функциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядковФункциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядков
Система дистанционного обучения MyDLS
Foundations for Growth: Infrastructure Investment in Emerging Markets
Foundations for Growth: Infrastructure Investment in Emerging MarketsFoundations for Growth: Infrastructure Investment in Emerging Markets
Foundations for Growth: Infrastructure Investment in Emerging Markets
Trafigura
The Economics of Commodity Trading Firms - White Paper
The Economics of Commodity Trading Firms - White PaperThe Economics of Commodity Trading Firms - White Paper
The Economics of Commodity Trading Firms - White Paper
Trafigura
Not Too Big To Fail – Systemic Risk, Regulation, and the Economics of Commodi...
Not Too Big To Fail – Systemic Risk, Regulation, and the Economics of Commodi...Not Too Big To Fail – Systemic Risk, Regulation, and the Economics of Commodi...
Not Too Big To Fail – Systemic Risk, Regulation, and the Economics of Commodi...
Trafigura
The economics of commodity trading firms in english (abridged)
The economics of commodity trading firms in english (abridged)The economics of commodity trading firms in english (abridged)
The economics of commodity trading firms in english (abridged)
Trafigura
Trafigura 2015 Interim Report
Trafigura 2015 Interim ReportTrafigura 2015 Interim Report
Trafigura 2015 Interim Report
Trafigura
Trafigura 2013 Full Annual Report
Trafigura 2013 Full Annual ReportTrafigura 2013 Full Annual Report
Trafigura 2013 Full Annual Report
Trafigura
Урок 9. Комбинаторная редукция
Урок 9. Комбинаторная редукцияУрок 9. Комбинаторная редукция
Урок 9. Комбинаторная редукция
Система дистанционного обучения MyDLS
Trafigura 2014 Full Annual Report
Trafigura 2014 Full Annual ReportTrafigura 2014 Full Annual Report
Trafigura 2014 Full Annual Report
Trafigura
2015 Trafigura Responsibility Report
2015 Trafigura Responsibility Report 2015 Trafigura Responsibility Report
2015 Trafigura Responsibility Report
Trafigura
2-Epidemiological studies
2-Epidemiological studies2-Epidemiological studies
2-Epidemiological studies
ResearchGuru
Trafigura 2014 Interim Report
Trafigura 2014 Interim ReportTrafigura 2014 Interim Report
Trafigura 2014 Interim Report
Trafigura
project ppt
project pptproject ppt
project ppt
Parwinder Singh
Fifty Years of Global LNG, Trafigura White Paper
Fifty Years of Global LNG, Trafigura White PaperFifty Years of Global LNG, Trafigura White Paper
Fifty Years of Global LNG, Trafigura White Paper
Trafigura
World wonders - Learning new words
World wonders - Learning new wordsWorld wonders - Learning new words
World wonders - Learning new words
YazeedLanka
Foundations for Growth: Infrastructure Investment in Emerging Markets
Foundations for Growth: Infrastructure Investment in Emerging MarketsFoundations for Growth: Infrastructure Investment in Emerging Markets
Foundations for Growth: Infrastructure Investment in Emerging Markets
Trafigura
The Economics of Commodity Trading Firms - White Paper
The Economics of Commodity Trading Firms - White PaperThe Economics of Commodity Trading Firms - White Paper
The Economics of Commodity Trading Firms - White Paper
Trafigura
Not Too Big To Fail – Systemic Risk, Regulation, and the Economics of Commodi...
Not Too Big To Fail – Systemic Risk, Regulation, and the Economics of Commodi...Not Too Big To Fail – Systemic Risk, Regulation, and the Economics of Commodi...
Not Too Big To Fail – Systemic Risk, Regulation, and the Economics of Commodi...
Trafigura
The economics of commodity trading firms in english (abridged)
The economics of commodity trading firms in english (abridged)The economics of commodity trading firms in english (abridged)
The economics of commodity trading firms in english (abridged)
Trafigura
Trafigura 2015 Interim Report
Trafigura 2015 Interim ReportTrafigura 2015 Interim Report
Trafigura 2015 Interim Report
Trafigura
Trafigura 2013 Full Annual Report
Trafigura 2013 Full Annual ReportTrafigura 2013 Full Annual Report
Trafigura 2013 Full Annual Report
Trafigura
Trafigura 2014 Full Annual Report
Trafigura 2014 Full Annual ReportTrafigura 2014 Full Annual Report
Trafigura 2014 Full Annual Report
Trafigura
2015 Trafigura Responsibility Report
2015 Trafigura Responsibility Report 2015 Trafigura Responsibility Report
2015 Trafigura Responsibility Report
Trafigura
2-Epidemiological studies
2-Epidemiological studies2-Epidemiological studies
2-Epidemiological studies
ResearchGuru
Trafigura 2014 Interim Report
Trafigura 2014 Interim ReportTrafigura 2014 Interim Report
Trafigura 2014 Interim Report
Trafigura

Similar to Урок 8. Введение в редукцию графов (20)

Clojure #1
Clojure #1Clojure #1
Clojure #1
Alexander Podkhalyuzin
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8
Technopark
Программирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмовПрограммирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмов
Andrey Dolinin
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
Python Meetup
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskell
husniyarova
СИМПЛЕКС-МЕТОД
СИМПЛЕКС-МЕТОДСИМПЛЕКС-МЕТОД
СИМПЛЕКС-МЕТОД
IT_1315
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
Zheka Kozlov
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
Транслируем.бел
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
akrakovetsky
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
Дмитрий Золотов
Основы Python. Функции
Основы Python. ФункцииОсновы Python. Функции
Основы Python. Функции
Theoretical mechanics department
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
Fwdays
Reactive extensions
Reactive extensionsReactive extensions
Reactive extensions
Sergey Teplyakov
Lisp8
Lisp8Lisp8
Lisp8
obukhov.ps41.nirs
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
Tech Talks @NSU
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Nikolay Grebenshikov
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки Python
Python Meetup
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8
Technopark
Программирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмовПрограммирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмов
Andrey Dolinin
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
Python Meetup
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskell
husniyarova
СИМПЛЕКС-МЕТОД
СИМПЛЕКС-МЕТОДСИМПЛЕКС-МЕТОД
СИМПЛЕКС-МЕТОД
IT_1315
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
Zheka Kozlov
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
Транслируем.бел
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
akrakovetsky
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
Fwdays
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
Tech Talks @NSU
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Лекция №2. Алгоритмические проблемы. Стандартные схемы программ. Предмет "Тео...
Nikolay Grebenshikov
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки Python
Python Meetup

Урок 8. Введение в редукцию графов

  • 1. 1 Кубенский А.А. Функциональное программирование. Глава 5. Системы исполнения функциональных программ. Глава 5. Системы исполнения функциональных программ 5.3. Функциональные модели последовательных процессов Рассмотрим простой язык императивного программирования без функций, переходов и сложных структур данных. Выражения:  Целые числа: 12 25 0  Простые переменные целого типа: x myInt  Унарные и бинарные операции с целыми результатами: (x+12) * (y-1)  Логические константы и выражения (но не переменные): not (x < 5) Операторы:  Присваивание: x := x+1  Последовательное исполнение: begin s1; s2; ... end  Условный оператор: if b then s1 else s2  Пустой оператор: skip  Оператор цикла: while b do s Программа начинает работу в состоянии, заданном совокупностью значений переменных (например, заданных оператором ввода данных), а результат программы – конечное состояние (например, выведенное в конце работы оператором вывода).
  • 2. 2 Кубенский А.А. Функциональное программирование. Глава 5. Системы исполнения функциональных программ. Рассмотрим программу вычисления факториала. Пример программы. begin f := 1; while n > 1 do begin f := f * n; n := n – 1 end end В начальном состоянии существенно только значение переменной n; в конце работы результат определяется значением переменной f. Прежде всего, переведем программу в вид, удобный для обработки. data Expression = { представление выражений } data Operator = { представление операторов } data Context = { представление контекста переменных } Два способа обработки и исполнения программы:  Интерпретация: interpret :: Operator -> Context -> Context  Компиляция: compile :: Operator -> (Context -> Context) На самом деле оба способа представлены одной и той же карринговой функцией!
  • 3. 3 Кубенский А.А. Функциональное программирование. Глава 5. Системы исполнения функциональных программ. Представление выражений и программ. data Expression = Integral Int | Logical Bool | Variable String | Unary String Expression | Binary Expression String Expression data Operator = Skip | Assignment String Expression | Sequence [Operator] | If Expression Operator Operator | While Expression Operator type Context = [(String, Expression)] interpret :: Operator -> Context -> Context eval :: Expression -> Context -> Expression eval v@(Integral n) _ = v eval v@(Logical b) _ = v eval (Variable x) ctx = assoc x ctx eval (Unary op ex) ctx = intrinsic op [eval ex ctx] eval (Binary e1 op e2) ctx = intrinsic op [eval e1 ctx, eval e2 ctx] intrinsic "+" [(Integral a), (Integral b)] = Integral (a+b) intrinsic "-" [(Integral a)] = Integral (-a) intrinsic "and" [(Logical a), (Logical b)] = Logical (a && b) intrinsic :: String -> [Expression] -> Expression
  • 4. 4 Кубенский А.А. Функциональное программирование. Глава 5. Системы исполнения функциональных программ. Исполнение операторов. replace :: String -> Expression -> Context -> Context replace x val = map ((y,v) -> (y,if x == y then val else v)) replace "f" (Integral 20) [("n", (Integral 4)), ("f", (Integral 5))] Например: даст в результате [("n", (Integral 4)), ("f", (Integral 20))] interpret :: Operator -> Context -> Context interpret Skip ctx = ctx interpret (Assignment x expr) ctx = replace x (eval expr ctx) ctx interpret (Sequence []) ctx = ctx interpret (Sequence (s:seq)) ctx = interpret (Sequence seq) (interpret s ctx) interpret (If expr s1 s2) ctx = case (eval expr ctx) of (Logical True) -> interpret s1 ctx (Logical False) -> interpret s2 ctx interpret oper@(While expr s) ctx = case (eval expr ctx) of (Logical True) -> interpret oper (interpret s ctx) (Logical False) -> ctx
  • 5. 5 Кубенский А.А. Функциональное программирование. Глава 5. Системы исполнения функциональных программ. Пример компиляции и исполнения программы begin f := 1; while n > 1 do begin f := f * n; n := n – 1 end end program = Sequence [(Assignment "f" (Integral 1)), (While (Binary (Variable "n") ">" (Integral 1)) (Sequence [(Assignment "f" (Binary (Variable "f") "*" (Variable "n"))), (Assignment "n" (Binary (Variable "n") "-" (Integral 1)))])) ] compile program - функция преобразования контекстов interpret program [("f", (Integral 0)), ("n", (Integral 3))] [("f", (Integral 6)), ("n", (Integral 0))]
  • 6. 6 Кубенский А.А. Функциональное программирование. Глава 6. Введение в редукцию графов. Глава 6. Введение в редукцию графов 6.1. Представление лямбда-выражений в виде графов Будем исходить из представления программ в виде структур данных расширенного лямбда- исчисления. Наша основная задача – корректно представить концепцию разделения переменных. Константа c. c Примитивная функция f. f Лямбда-выражение λx.E. λ x E Применение функции E1 E2. @ E1 E2 Применение конструктора C x y z. C x zy
  • 7. 7 Кубенский А.А. Функциональное программирование. Особенности представления некоторых типов выражений. Представление лямбда-выражений в виде графов (продолжение). Глава 6. Введение в редукцию графов. Частичное применений примитивных функций и конструкторов. 1+2 + 1 2 + 1 @ + 1 @ 2 @ + 1 1 : lst : 1 lst : 1 lst : 1 @ : 1 или : 1 t λ t
  • 8. 8 Кубенский А.А. Функциональное программирование. Представление лямбда-выражений в виде графов (продолжение). Глава 6. Введение в редукцию графов. Блоки let x = E1 in E2 и letrec x1 = E1;... xk = Ek in E. let x = E1 in E2 (λx.E2) E1 E2 λ x @ E1 letrec x1 = E1;... xk = Ek in E – моделируется с помощью циклических графов.
  • 9. 9 Кубенский А.А. Функциональное программирование. let twice = λf.λx.f (f x) in twice (λx.+ x 1) 2 Пример представления выражения в виде графа. Глава 6. Введение в редукцию графов. (λf.λx.f (f x)) (λx.+ x 1) 2 2 λ x λ f f @ x @ f λ @ @ x @ @ + x 1
  • 10. 10 Кубенский А.А. Функциональное программирование. • Нахождение самого левого из самых внешних редексов: проход по «левому гребню» графа. Правила редукции графов. Глава 6. Введение в редукцию графов. 2 x x @ succ λ @ • Копирование тела лямбда-выражения. x @ succ • Подстановка аргумента вместо свободных вхождений переменной лямбда-выражения в тело. • Замещение в дереве @-узла результатом «вычислений». Некоторые особенности этой процедуры: • Тело лямбда-выражения копируется, чтобы его можно было переиспользовать; «мусор» удаляется • Подстановка аргументов производится с помощью установки ссылок; тем самым производится эффективное разделение переменных • Результат редукции замещает редуцируемое выражение, тем самым все ссылки на этот результат будут иметь новое значение
  • 11. 11 Кубенский А.А. Функциональное программирование. Пример редукции графов. Глава 6. Введение в редукцию графов. (λf.λx.f (f x)) (λx.+ x 1) 2 2 λ x λ f f @ x @ f λ @ @ x @ @ + x 1
  • 12. 12 Кубенский А.А. Функциональное программирование. Глава 6. Введение в редукцию графов. 2 λ @ @ x @ @ + x 1 Пример редукции графов. (λf.λx.f (f x)) (λx.+ x 1) 2 @ @ + 1 3 4
  • 13. 13 Кубенский А.А. Функциональное программирование. δ-редукция в графовом представлении Глава 6. Введение в редукцию графов. Если при проходе по левому гребню находим константу, то это – примитивная функция 2 + @ 3 @ - сначала выполняем редукцию всех строгих аргументов; - потом формируем результат в соответствии с правилами этой примитивной функции; - результат замещает собой корень редекса. @ @ * 6 12
  • 14. 14 Кубенский А.А. Функциональное программирование. Общий алгоритм редукции графов (пока без учета рекурсии) Глава 6. Введение в редукцию графов. while (выражение не находится в СЗНФ) { спуск от корня по левому гребню до первой вершины, отличной от @-вершины; switch (тип вершины) { case (примитивная функция): if (число аргументов k > числа пройденных @-вершин) выражение находится в СЗНФ; else { редуцировать все строгие аргументы; сформировать результат согласно правилам примитивной функции; заменить k-ю @-вершину этим результатом; } break; case (λ-вершина): if (выше нет @-вершин) выражение находится в СЗНФ; else { создать копию тела с подстановкой (разделяемого) аргумента вместо свободных вхождений переменной λ-выражения; подставить результат вместо вершины редекса (первая @-вершина вверх по гребню); } break; default: // константа-значение или конструктор if (выше нет @-вершин) выражение находится в СЗНФ; else ошибка типа ! break; } }
  • 15. 15 Кубенский А.А. Функциональное программирование. Использование вершин-синонимов Глава 6. Введение в редукцию графов. При выполнении редукций есть одна проблема, связанная с копированием: в теле функции переменная может быть в корне. Тогда вместо подстановки ссылки на аргумент придется делать копию вершины, представляющей аргумент. + @ λ @ x 1 2 x @ x @ Можно вместо копирования вершины создавать «вершину-синоним» - «прозрачную» по ссылкам. Θ При прохождении вершины-синонима можно оптимизировать их количество, убирать двойные синонимы, заменять ссылки на синоним ссылками на саму вершину.
  • 16. 16 Кубенский А.А. Функциональное программирование. Использование вершин-синонимов (продолжение) Глава 6. Введение в редукцию графов. Аналогичная проблема возникает при применении примитивных функций-селекторов, которые не преобразуют, а просто выдают аргумент или его часть (например, head или tail). head head @ @ : : 1 nil nil head (cons (head (cons 1 nil)) nil) Θ Θ