Вы можете выполнить следующие шаги, чтобы уменьшить лямбда-выражения:
- Полностью заключите в скобки выражение, чтобы избежать ошибок и сделать более очевидным, где происходит применение функции.
- Найти приложение-функцию, то есть найти вхождение шаблона
(λX. e1) e2
, где X
может быть любым допустимым идентификатором, а e1
и e2
могут быть любыми допустимыми выражениями.
- Примените функцию, заменив
(λx. e1) e2
на e1'
, где e1'
- результат замены каждого свободного вхождения x
в e1
на e2
.
- Повторяйте 2 и 3, пока шаблон больше не встречается. Обратите внимание, что это может привести к бесконечному циклу для ненормализующих выражений, поэтому вы должны остановиться после 1000 итераций или около того; -)
Итак, для вашего примера мы начнем с выражения
((λm. (λn. (λa. (λb. (m ((n a) b)) b)))) (λf. (λx. x))) (λf. (λx. (f x)))
Здесь подвыражение (λm. (λn. (λa. (λb. (m ((n a) b)) b)))) (λf. (λx. x))
соответствует нашему шаблону с X = m
, e1 = (λn. (λa. (λb. (m ((n a) b)) b))))
и e2 = (λf. (λx. x))
. Таким образом, после подстановки мы получаем (λn. (λa. (λb. ((λf. (λx. x)) ((n a) b)) b)))
, что делает все наше выражение:
(λn. (λa. (λb. ((λf. (λx. x)) ((n a) b)) b))) (λf. (λx. (f x)))
Теперь мы можем применить шаблон ко всему выражению с помощью X = n
, e1 = (λa. (λb. ((λf. (λx. x)) ((n a) b)) b))
и e2 = (λf. (λx. (f x)))
. Итак, после замены получаем:
(λa. (λb. ((λf. (λx. x)) (((λf. (λx. (f x))) a) b)) b))
Теперь ((λf. (λx. (f x))) a)
соответствует нашему шаблону и становится (λx. (a x))
, что приводит к:
(λa. (λb. ((λf. (λx. x)) ((λx. (a x)) b)) b))
На этот раз мы можем применить шаблон к ((λx. (a x)) b)
, который уменьшится до (a b)
, что приведет к:
(λa. (λb. ((λf. (λx. x)) (a b)) b))
Теперь примените шаблон к ((λf. (λx. x)) (a b))
, который уменьшится до (λx. x)
и получите:
(λa. (λb. b))
Теперь мы закончили.