什么是自然数和有效的简单类型 lambda 演算项之间的映射?

What is a mapping between natural numbers and valid simply typed lambda calculus terms?

是否有任何有效的算法可以在简单类型的 lambda 演算的类型完备的闭项与自然数之间进行映射?例如,使用 bruijn 索引(可能顺序不正确):

0 → (λ 0)
1 → (λ (λ (0 1)))
2 → (λ (λ (1 0)))
3 → (λ 0 (λ 0))
4 → (λ (λ 0) 0)
5 → (λ (λ 1) 0)
6 → ... so on

相关问题:是否有一种算法可以在自然数和简单类型 lambda 演算的 规范化 项之间进行映射?此外,同样的问题也适用于无类型 lambda 演算。

Binary Lambda Calculus 为无类型 lambda 演算中的任何闭项定义了二进制编码,并且还提出了自然数和二进制字符串之间的双射,但前者不是满射。 还是论文http://arxiv.org/abs/1401.0379 "Counting Terms in the Binary Lambda Calculus" 可能会产生有效的 ranking/unranking 映射。

由于类型化 lambda 演算的高度上下文敏感性质,如果有一个有效的算法,或者更确切地说 "natural" 个有效的算法,我会感到惊讶。

This paper 有很好的公式来计算 untyped lambda 项,并且从中它们派生出一个相当简单的函数来枚举无类型项。它们还为普通形式提供了计数功能,这也应该很容易适应生成功能。不幸的是,他们只通过过滤昂贵得离谱的东西来制作类型化生成器函数(论文的一个结果就是它是多么荒谬)。

至于生成类型化术语的更有效方法,我的建议是生成类型化推导而不是术语,然后对它们进行类型检查。