
- •Аппликативные вычисления в теории алгоритмов
- •Содержание
- •Введение
- •Построение λ- теории Основы теории формальных систем.
- •Понятие λ-исчисления.
- •Построение бестипового λ-исчисления.
- •Свободные и связанные переменные.
- •Подстановка.
- •Коллизия имен переменных.
- •Редукция
- •Погружение классических вычислений в λ-исчисление.
- •Нумералы.
- •Рекурсия
- •Рекурсия в λ-исчислении.
- •Контрольные вопросы
- •Бестиповая комбинаторная логика. Комбинаторы.
- •Построение комбинаторной логики
- •Базис k, s.
- •Базис I,b,c,s
- •Преимущества комбинаторов
- •Контрольные вопросы
- •Типизированные системы. Использование типов.
- •Расширенное λ-исчисление
- •Редукция графа
- •Алгоритм редукции графа (рг)
- •Суперкомбинаторы.
- •Алгоритм приведения λ-выражения к суперкомбинаторному виду
- •Упорядочивание параметров.
- •Способы реализации рекурсии.
- •Контрольные вопросы
- •Компиляция в коды абстрактных машин.
- •Кодирование по де Брейну.
- •Алгоритм преобразования λ-выражений по де Брейну.
- •Семантические равенства для кодов де Брейна:
- •Категориальная комбинаторная логика (ккл).
- •Общие свойства абстрактных машин.
- •Категориальная абстрактная машина (кам).
- •Цикл работы кам
- •Оптимизация кода кам
- •Дополнительные функциональные инструкции
- •Рекурсия в кам
- •Пример вычисления выражений на кам
- •Контрольные вопросы
- •Смешанные вычисления Процедура смешанных вычислений
- •Трансформационные семантики
- •Проекции Футамуры
- •Контрольные вопросы
- •Литература
Оптимизация кода кам
Два вида оптимизации:
переход к многоместным операциям, т.е. вместо функции “+”, которая будет брать аргументы по очереди, рассмотрим двуместный “+”.
а) App○< App○<’+,x>,y> = +<x,y>
б) Воспользуемся категориальным равенством для β-редукции.
App○<Λ(х)○у, z> = x○<y,z>
{(λx.y)z→[z/x]y – соответствующее категориальное равенство.}
Дополнительные функциональные инструкции
Терм |
Код |
Стек |
Терм |
Код |
Стек |
True |
If a b c |
sm |
S |
a c |
m |
False |
If a b c |
sm |
S |
b c |
m |
(a,b) |
add c |
S |
{a+b}н. число |
C |
S |
(a,b) |
eq C |
S |
True/False |
C |
S |
Пример. push quote 2 swap quote 3 cons add(пример сложения 2 и 3).
Рекурсия в кам
Две инструкции: dum c,wind c.
Терм |
Код |
Стек |
Терм |
Код |
Стек |
t |
dum c |
S |
$Y |
C |
S |
[a:b] |
wind c |
(t$Y)S |
(t.[a:b]) |
C |
S |
wind – аппликация для работы с объектами (вида ) – рекурсивными
Схема трансляции терма расширенного λ-исчисления в код КАМ
lambda x M→(cur[M](ρ,x))
(λx.M) M транслируется в среде ρ, расширенной переменной х.
app AB→(push)|[A]ρ|(swap)|[B] ρ|(cons app)
| - слияние списков
(ab)|(cde) → (abcde)
[ ] - транслирование в среде.
↓подстановка
let x=M in N →(push)|[M]ρ|(cons)|[N]( ρ,x)
↓рекурсивная
letrec x=M in N→(push dum cons push)|[M]( ρ,x)|(wind)|[N]( ρ,x)
quote c→( quote c)
cons AB→(push)|[A]ρ|(swap)|[B]ρ|(cons)
Fst A→[A]ρ|(Fst)
Snd A→[A]ρ|(Snd)
If C A B→(push)|[C]ρ|(if [A]ρ[B]ρ)
eq A B→(push)|[A] ρ|(swap)|[B]ρ|(cons eq)
+AB→(push)|[A] ρ|(swap)|[B]ρ|(cons add)
*AB→(push)|[A] ρ|(swap)|[B]ρ|(cons mult)
Переменные получаются из среды с помощью композиции операций Fst и Snd.
Пример. ((lambda x(+x1))3)]()
Начинаем транслировать в пустой среде:
[((lambda x (+x1))3)]()
Транслируем аппликацию:
(push)|[lambda x (+x1))]( )|(swap)|[3]( )|(cons app)
трансляция [3]( ) → quote 3
(push)|[(lambda x (+x1))]( )|(swap quote 3 cons app)
среда для трансляции (+х1) расширилась до (( ),x):
(push)|(cur [+x1](( ),x))|(swap quote 3 cons app)
(push cur [+x1](( ),x)swap quote 3 cons app )
транслируем сложение
(push cur(push|[x](( ),x)|(swap)|[1](( ),x)|(cons add))swap quote 3 cons app
(push cur(push Snd swap quote 1 cons add)swap quote 3 cons app)
App○<x,y>=<x,y>App
Пример вычисления выражений на кам
Пример. (λх.х4((λх.х)3))+
App○< Λ(App○<App○<App<Snd,'4>,App○< Λ(Snd),'3>>),'+>
Терм |
Код |
Стек |
( ) |
<Λ(<<Snd,'4>app,<Λ(Snd),'3>app>app),'+>app |
[ ] |
( ) |
Λ(<<Snd,'4>app,<Λ(Snd),'3> └──A────┘└──B─── app >app),'+>app |
( ) |
[<A,B>app:( )] |
, Λ(Snd'+)>app |
( ) |
( ) |
Λ(Snd'+)>app |
[<A,B>app:( )] |
[Snd'+;( )] |
>app |
[<A,B>app:( )] |
[<A,B>app:( )], [Snd'+;( )] |
app |
[ ] |
(( ),[Snd'+:( )] ) |
<A,B>app |
[ ] |
(( ),[Snd'+:( )] ) |
A,B>app |
(( ),[Snd'+:( )] ) |
(( ),[Snd'+:( )] ) |
Snd,'4>app,B>app |
(( ),[Snd'+:( )] );(( ),[Snd'+:( )] ) |
[Snd'+:()] |
,'4>app,B>app |
(( ),[Snd'+:( )] );(( ),[Snd'+:( )] ) |
(( ),[Snd'+:( )] ) |
'4>app,B>app |
[Snd'+:( )];(( ),[Snd'+:( )] ) |
4 |
>app,B>app |
[Snd'+:( )];(( ),[Snd'+:( )] ) |
([Snd'+:( )],4) |
app,B>app |
(( ),[Snd'+:( )] ) |
(( ),4) |
Snd'+,B>app |
(( ),[Snd'+:( )] ) |
4 |
+,B>app |
(( ),[Snd'+:( )] ) |
{+ 4} |
,B>app |
(( ),[Snd'+:( )] ) |
(( ),[Snd'+:( )] ) |
B>app |
{+ 4};(( ),[Snd'+:( )] ) |
(( ),[Snd'+:( )] ) |
Λ(Snd),'3>app>app |
(( ),[Snd'+:( )] );{+ 4} |
(Snd:( ),[Snd'+:( )] )) |
,'3>app>app |
(( ),[Snd'+:( )] );{+ 4} |
(( ),[Snd'+:( )] ) |
'3>app>app |
(Snd:( ),[Snd'+:( )] )) + 4 |
3 |
>app>app |
(Snd:( ),[Snd'+:( )] )) + 4 |
[(Snd: (( ),[ ])),3] |
app>app |
+ 4 |
[(( ),[Snd'+: ( )] ),3] |
Snd>app |
|
Вычислим факториал на КАМ
ƒact 1
ƒact x: if x=0 then 1 else x* ƒact(x-1)
ƒact 1:[letrec [ ƒac=λx.if(eq x’0)’1(*x(app ƒac(-x’1)))] in (app ƒac’1) ] ( )
( push dum cons push)|[ λx. if(eq x’0)’1 (*x(app ƒac(-x’1)))](( ).ƒac)|(wind)|[(app ƒac’1)] ( ( ).ƒac)
( push dum cons push)|(cur[if(eq x’0)’1 (*x(app ƒac(-x’1)))](( ).ƒac)|(wind)|
|(push)|[ ƒac](( ). ƒac)|(swap)|[‘1](( ). ƒac)|(cons app)
↓начало каррирования
( push dum cons push cur((push)|[(eq x'0)]((( ).ƒac).x)|(if [1’]((( ) .ƒac).x)[(*x(app
ƒac (-x’1)))]((( ).ƒac)x.)) wind push snd swap quote 1 cons app)
↑закончилось каррирование
( push dum cons push cur|((push)|(push) Snd swap quote 0 cons eq )|
|(if (quote 1)(push snd swap)|[app ƒac(-x’1))]((( ).ƒac).x)|(cons mult)))| wind push
s
nd
swap quote 1 cons app)
Оттранслируем аппликацию :
(push)|[ ƒac]((( ). ƒac).x)|(swap)|[(-x’1)]((( ). ƒac).x)|(cons app)→(push Fst Snd swap push Snd swap push Snd swap quote 1 cons sub cons app)
Подставляем это выражение и получаем окончательный результат:
( push dum cons push cur|(push push snd swap quote 0 cons eq if (quote 1)(push Snd swap push Fst Snd swap push Snd swap quote 1 cons sub cons app cons mult))|
wind push Snd swap quote 1 cons app)
В сокращенном виде:
↓wind
<Y><Λ|(<<S,’0>=if(‘1)(<S,<FS,<S,’1>->app>*))|appY<S,’1>app)
↑cпециальная аппликация для Y
На каждом этапе транслировались самые внешние выражения.