Функциональное программирование — различия между версиями
Shersh (обсуждение | вклад) |
Shersh (обсуждение | вклад) (→Выписать систему уравнений типизации) |
||
Строка 50: | Строка 50: | ||
==Выписать систему уравнений типизации== | ==Выписать систему уравнений типизации== | ||
(λ a . a a) (λ b c . c) | (λ a . a a) (λ b c . c) | ||
+ | |||
+ | === Решение === | ||
+ | Сначала надо дать типы всем термам и подтермам, раздавая каждый раз новые буквы новым переменным и термам. А потом связать эти буквы по следующим правилам: | ||
+ | * если у нас абстракция (λ x . M) :: T0, x :: T1, M :: T2, то добавляем в систему T0 = T1 -> T2, | ||
+ | * если имеет аппликацию (M N) :: T0, M :: T1, N :: T2, то добавляем T1 = T2 -> T0 | ||
+ | * если у нас переменная в теле абстракции встречается несколько раз и мы раздаём каждый раз ей новые буквы, то надо будет потом приравнять типы в аргументе абстракции и внутри её тела. | ||
+ | |||
+ | Итого: | ||
+ | |||
+ | (λ a . a a) (λ b c . c) :: A | ||
+ | |||
+ | (λ a . a a) :: B, (λ b c . c) :: C | ||
+ | |||
+ | a :: D, (a a) :: E | ||
+ | |||
+ | первая и вторая буквы "a" в E {{---}} a :: F, a :: G | ||
+ | |||
+ | Можем сразу расписать часть системы уравнений: | ||
+ | |||
+ | B = C -> A | ||
+ | |||
+ | B = D -> E | ||
+ | |||
+ | F = G -> E | ||
+ | |||
+ | D = F | ||
+ | |||
+ | D = G | ||
+ | |||
+ | Теперь расписываем терм с типом C (раскрыв сокращения для начала): (λ b . (λ c . c)) :: С | ||
+ | |||
+ | b :: H, (λ c . c) :: I | ||
+ | |||
+ | c :: J, c :: K | ||
+ | |||
+ | И добавляем уравнения: | ||
+ | |||
+ | C = H -> I | ||
+ | |||
+ | I = J -> K | ||
+ | |||
+ | J = K | ||
==Кодирование по Чёрчу== | ==Кодирование по Чёрчу== |
Версия 11:17, 26 апреля 2015
Содержание
Кр1
Убрать все сокращения и расставить все скобки
(λ a b . (λ c d e . e) a) (x y) y (λ f . x) y
Решение
Скобки ставятся по следующим правилам:
- тело абстракции заключается в скобки: λ x . M λ x . (M)
- аппликация левоассоциативна: a b c d ((a b) c) d
- сокращения раскрываются во вложенные лямбды (сразу с расставлением скобок): λ a b c . M λ a . (λ b . (λ c . (M)))
Важно: тело абстракции забирает всё до конца то скобки, в которую заключено
Итого: ((((λ a . (λ b . ((λ c . (λ d . (λ e . (e)))) a))) (x y)) y) (λ f . (x))) y
Привести в нормальную форму
λ a b . a (λ c . b c) a (λ d . d) a
λ a . (λ b . y) (λ c . y (y (λ d . a a a)) (x x) a)
Решение
В нормальной форме нет редукций. Если нормальная форма существует, то её можно достичь при помощи редукций нормальным порядком, а аппликативным можно и достичь.
- Уже в нормальное форме, как ни странно
- λ b . y
Нормальный порядок редукции
(λ a . y (y (y (λ b . a))) y) (x (x (x (λ c d . d) y)) x)
Здесь про стратегии редуцирования с примерами и определениями.
Нормальный порядок редуцирования — самым первым делом раскрывается самый левый самый внешний редекс. Пример не очень удачный, так в нём всего одна редукция, после которой получится: y (y (y (λ b . (x (x (x (λ c d . d) y)) x)))) y
Более показательные и содержательные примеры (во всех случаях одна редукция будет произведена):
- (λ a . a) ((λ x . x) y) (λ x . x) y
- x (λ a . ((λ x . x) y) ((λ z . z) y)) x (λ a . y ((λ z . z) y))
Аппликативный порядок редукции
Здесь ещё про стратегии редуцирования, но немного другим языком (может быть, кому-то более понятным).
Аппликативный порядок редуцирования — первым делом редуцирования самый правый самый глубокий терм. То есть сначала упрощаем "аргументы" аппликации.
Те же примеры (во всех случаях одна редукция будет произведена):
- (λ a . a) ((λ x . x) y) (λ a . a) y
- x (λ a . ((λ x . x) y) ((λ z . z) y)) x (λ a . ((λ x . x) y) y)
Ещё один для разнообразия: ((λ x . y) (λ z . t)) ((λ a b c . a b c ((λ s . t) y) (λ t . x) u) (λ x . x)) ((λ x . x x) z)
((λ x . y) (λ z . t)) ((λ a b c . a b c ((λ s . t) y) (λ t . x) u) (λ x . x)) (z z)Выписать систему уравнений типизации
(λ a . a a) (λ b c . c)
Решение
Сначала надо дать типы всем термам и подтермам, раздавая каждый раз новые буквы новым переменным и термам. А потом связать эти буквы по следующим правилам:
- если у нас абстракция (λ x . M) :: T0, x :: T1, M :: T2, то добавляем в систему T0 = T1 -> T2,
- если имеет аппликацию (M N) :: T0, M :: T1, N :: T2, то добавляем T1 = T2 -> T0
- если у нас переменная в теле абстракции встречается несколько раз и мы раздаём каждый раз ей новые буквы, то надо будет потом приравнять типы в аргументе абстракции и внутри её тела.
Итого:
(λ a . a a) (λ b c . c) :: A
(λ a . a a) :: B, (λ b c . c) :: C
a :: D, (a a) :: E
первая и вторая буквы "a" в E — a :: F, a :: G
Можем сразу расписать часть системы уравнений:
B = C -> A
B = D -> E
F = G -> E
D = F
D = G
Теперь расписываем терм с типом C (раскрыв сокращения для начала): (λ b . (λ c . c)) :: С
b :: H, (λ c . c) :: I
c :: J, c :: K
И добавляем уравнения:
C = H -> I
I = J -> K
J = K
Кодирование по Чёрчу
Выписать кайнды конструкторов типов, выписать типы конструкторов, закодировать по Чёрчу:
data Policeman a = Doctor a | Mice
data Tree a b c = Frog c | Pip (Tree a b c)