给出
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)))))))))
有没有人对此有任何见解? 谢谢
答案 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)
的缩写,因为函数应用程序始终是二进制的,并且被视为左关联。