Binary Lambda Calculus如何编码括号?

时间:2013-08-03 15:11:53

标签: encoding lambda functional-programming lambda-calculus

BLC如何编码括号?例如,这将是怎样的:

λa.λb.λc.(a ((b c) d))

以BLC编码?

注意:维基百科的文章不是很有用,因为它使用了一种不熟悉的符号,只提供了一个不涉及括号的简单示例,以及一个很难分析的非常复杂的示例。该论文在这方面是相似的。

1 个答案:

答案 0 :(得分:9)

如果您的意思是基于维基百科中讨论的De Bruijn索引的二进制编码,那实际上非常简单。首先需要进行De Bruijn编码,这意味着用自然数替换变量,表示变量与其λBinder之间的λ结合数。用这种表示法,

λa.λb.λc.(a ((b c) d))

变为

λλλ 3 ((2 1) d)

其中 d 是一些自然数> = 4。由于表达式中没有绑定,我们无法确定它应该是哪个数字。

然后编码本身,递归地定义为

enc(λM) = 00 + enc(M)
enc(MN) = 01 + enc(M) + enc(N)
enc(i) = 1*i + 0

其中+表示字符串连接,*表示重复。系统地应用这个,我们得到

  enc(λλλ 3 ((2 1) d))
= 00 + enc(λλ 3 ((2 1) d))
= 00 + 00 + enc(λ 3 ((2 1) d))
= 00 + 00 + 00 + enc(3 ((2 1) d))
= 00 + 00 + 00 + 01 + enc(3) + enc((2 1) d)
= 00 + 00 + 00 + 01 + enc(3) + 01 + enc(2 1) + enc(d)
= 00 + 00 + 00 + 01 + enc(3) + 01 + 01 + enc(2) + enc(1) + enc(d)
= 000000011110010111010 + enc(d)

正如您所看到的,开括号编码为01,而此编码中不需要关闭的parens。