Encoding 二进制Lambda演算如何编码括号?

Encoding 二进制Lambda演算如何编码括号?,encoding,lambda,functional-programming,lambda-calculus,Encoding,Lambda,Functional Programming,Lambda Calculus,BLC如何对括号进行编码?例如,这将如何: λa.λb.λc.(a ((b c) d)) 是否用BLC编码 注意:维基百科的文章没有太大帮助,因为它使用了一个不熟悉的符号,并且只提供了一个简单的例子,不包含括号,还有一个非常复杂的例子,很难分析。这篇论文在这方面是相似的 如果你指的是基于维基百科中讨论的De Bruijn索引的二进制编码,那实际上相当简单。首先需要进行De Bruijn编码,这意味着用表示变量与其λ绑定器之间λ绑定器数量的自然数替换变量。在这个符号中 λa.λb.λc.(a (

BLC如何对括号进行编码?例如,这将如何:

λa.λb.λc.(a ((b c) d))
是否用BLC编码


注意:维基百科的文章没有太大帮助,因为它使用了一个不熟悉的符号,并且只提供了一个简单的例子,不包含括号,还有一个非常复杂的例子,很难分析。这篇论文在这方面是相似的

如果你指的是基于维基百科中讨论的De Bruijn索引的二进制编码,那实际上相当简单。首先需要进行De Bruijn编码,这意味着用表示变量与其λ绑定器之间λ绑定器数量的自然数替换变量。在这个符号中

λ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
,而在这种编码中不需要右括号。

回答得很好,谢谢。所以括号是不必要的,因为01已经表示二进制应用程序。只是一个问题,这是最优的吗?因为这种编码数字的方式似乎很浪费。@Viclib:你说得对,这是使用一元数字表示法(计数标记),而二进制编码可能更适合复杂的公式。但是,定义它会更难,我现在不打算尝试——您需要确保它不会与表示λ和应用程序的位字符串冲突。