lambda演算,扩展和压缩形式有不同的β减少?

时间:2011-12-07 16:56:04

标签: lambda-calculus

给出

S=\x.\y.\z.x z (y z)

K=\x.\y.x

如果我从(S K K)形式或等效的扩展形式开始,我无法理解同一表达式(S K K)的两个β等价形式如何在无类型lambda演算中产生不同的结果:

(S K K) = ((S K) K) -> ((\y.(\z.((K z) (y z)))) K) -> (\z.((K z) (K z))) ->
(\z.((\y.z) (K z))) -> (\z.z) -> 4 reductions!

(S K K) = \x.\y.\z.x z (y z) \x.\y.x \x.\y.x -> 0 reductions!

看起来压缩和扩展形式有不同的括号,实际上第一个是父母化的:

(S K K) = ((S K) K)

而第二个为:

\x.\y.\z.x z (y z) \x.\y.x \x.\y.x =
(\x.(\y.(\z.(((x z) (y z)) (\x.(\y.(x (\x.(\y.x)))))))))

有没有人对此有任何见解? 谢谢

2 个答案:

答案 0 :(得分:4)

查看formal definition of lambda calculus on Wikipedia。抽象和应用程序总是有一组括起来的括号。 这意味着更正确的S和K定义是:

S = (\x.\y.\z.x z (y z))

K = (\x.\y.x)

(S K K)中替换这些内容会得到正确的结果。

答案 1 :(得分:1)

(S K K)中,有些括号是隐含的。此表单是((S K) K)的缩写,因为函数应用程序始终是二进制的,并且被视为左关联。