使用Haskell进行λ演算的β减少

时间:2013-05-09 13:40:51

标签: haskell lambda-calculus

我已经为beta缩减定义了以下函数,但我不确定如何考虑自由变量受限的情况。

data Term = Variable Char | Lambda Char Term | Pair Term Term deriving (Show,Eq)
--substition
s[M:x]= if (s=x) then M else s
AB[M:x]= (A[M:x] B [x:M])
Lambda x B[M:x] = Lambda x B 
Lambda y P[M:x]= if x=y then Lambda y P else Lambda y P (M:x) 



--beta reduction
Reduce [s]= s
Reduce[Lambda x B]M = B[M:x]
Reduce[L1 L2] = (Reduce [L1] Reduce [L2])

1 个答案:

答案 0 :(得分:2)

评论中提供的链接 hammar 详细描述了解决方案。

我想提供一个不同的解决方案。荷兰数学家Nicolaas Govert de Bruijn发明了alternative notation for lambda terms。我们的想法是,不使用变量符号,而是使用数字。我们用代表我们需要交叉多少lambda的数字替换每个变量,直到找到绑定变量的抽象。抽象则根本不需要任何信息。例如:

λx. λy. x

转换为

λ λ 2

λx. λy. λz. (x z) (y z)

转换为

λ λ λ 3 1 (2 1)

这种符号具有几个相当大的优点。值得注意的是,由于没有变量,因此没有重命名变量,也没有α变换。虽然我们在替换时必须相应地重新编号索引,但我们不必检查名称冲突并进行任何重命名。上面的维基百科文章给出了一个例子,说明β减少如何与这种表示法一起使用。