Понимание лямбда-исчисления через перевод на Python? - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь понять, как работает лямбда-исчисление и как упростить или расширить различные утверждения.

Учитывая пример утверждения (λz.z) (λy.y y) (λx.x a) Правильно ли я перевожу и упрощаю это утверждение?


Вот мое решение:

# (λz.z) (λy.y y) (λx.x a) 
#    F      G        H
# statement translates to -> F( G( H(x) ) )

f = lambda z: z
g = lambda y: (y, y)
h = lambda x: (x, 'a')

print(f(g(h('x')))) # -> (('x', 'a'), ('x', 'a'))

# so simplified statement = lambda x: (xa)(xa)

1 Ответ

0 голосов
/ 10 октября 2019

Сначала мы переведем каждую лямбду -

  • (λz.z) становится lambda z: z
  • (λy.y y) становится lambda y: y(y)
  • (λx.x a) становитсяlambda x: x(a)

Далее мы полностью оценим выражение. === выделяет замену, которая происходит на каждом шаге -

# (λz.z) (λy.y y) (λx.x a)
(lambda z: z) (lambda y: y(y)) (lambda x: x(a))
              ================     /     
          ___________/            /
         /                       /
(lambda z: z)          _________/
           =          /
     _____/          /
    /               /       
(lambda y: y(y)) (lambda x: x(a))
                 ================
         ________________/
        /
(lambda y: y(y)) 
           = =
    ______/   \______
   /                 \
(lambda x: x(a))((lambda x: x(a)))
                 ================
         _______________/
        /
(lambda x: x(a))
           =  \
     _____/    \
    /           \
(lambda x: x(a))(a)
                 =
         _______/
        /
(lambda x: x(a))
           = /
   _______/ /
  / _______/
 / /
a(a)
...