Как уменьшить лямбда-исчисление

Я пытаюсь понять лямбда-исчисление и читаю замечательный статья.

На странице 8 есть выражение:

(λy.(x(λx.xy)))

Если я собираюсь заменить левый крайний край(λy) на t,

(λy.(x(λx.xy))) t

то результат будет?

x(λx.xy)

person softshipper    schedule 27.01.2017    source источник


Ответы (1)


Я взял на себя смелость переписать его на синтаксис haskell

(\y -> x (\x-> x y))
(\y -> x (\x-> x y)) t

x (\x -> x t)

поскольку y уже привязан к входу \y, все y будут заменены на t.

Изменить: как отмечено в комментарии ниже, если t содержит свободный x, было бы важно переименовать связанный x в этой области на «свежее» имя. Это имя в настоящее время не имеет никакого значения. Если мы скажем

let t = \t -> x t

Тогда правильная замена будет выглядеть так

x (\z -> z (\t -> x t))

Где, как указано в pigworker, некоторый z выбран для свежести в качестве нового идентификатора, чтобы заменить наш связанный x, чтобы предотвратить скрытие свободного x в t.

person prof1990    schedule 27.01.2017
comment
Любые свободные вхождения x в t будут неправильно захвачены приведенной выше редукцией. \x -> x t может быть безопаснее стать \z -> z t, где z выбран из-за свежести. - person pigworker; 27.01.2017