为什么lambda演算中的变量集通常被定义为可数无限?

时间:2017-01-05 19:29:12

标签: logic lambda-calculus formal-languages formal-methods

当阅读lambda演算的正式描述时,变量集似乎总是被定义为可数无限。为什么这套不能有限似乎很清楚;将变量集定义为有限将以不可接受的方式限制术语构造。但是,为什么不允许这个集合无数无限呢?

目前,我收到的这个问题的最明智的答案是,选择一组可数无限的变量意味着我们可以枚举变量来描述如何选择新的变量,比如对于alpha重写,自然。

我正在寻找这个问题的明确答案。

3 个答案:

答案 0 :(得分:1)

数学和逻辑中的大多数定义和构造仅包括实现所需结束所需的最小装置。如您所知,可能需要多于有限数量的变量。但是,由于只需要一个可数的无穷大,为什么还要允许更多呢?

答案 1 :(得分:0)

这个集合需要可数的原因非常简单。想象一下,你有一个装满变量的包。除非该集合是可数的,否则无法计算此包中的变量数量。

请注意,袋子与麻袋同构。

答案 2 :(得分:0)

拥有可数数量的变量,以及它们与ℕ之间的可计算的双射,让我们在Λ和ℕ之间创建一个双射:

  1. #v =⟨0,f(v)⟩,其中f是和ℕ之间的可计算双射(因为是可数的而存在)而⟨m,n⟩是ℕ 2 之间的可计算双射和ℕ。
  2. #(L M)=⟨1,⟨#L,#M⟩⟩
  3. #(λv.L)=⟨2,⟨#v,#L⟩⟩
  4. 符号⌜L⌝代表c _ {#L},教堂数字代表L的编码。对于所有集合S,#S代表集合{#L | L∈S}。

    这使我们能够证明lambda演算不可判定:

    设A是在α和β相等下闭合的非平凡(非∅或Λ)集合(如果L∈A且Lβ= M,M∈A)。设B为集合{L | L⌜L⌝∈A}。假设#A集合为recursive。那么f,如果x∈A则f(x)= 1,如果x∉A则为0,必须是μ-recursive function。所有μ递归函数都是λ可定义的*,因此必须有一个F:

    F⌜L⌝=c_1⇔⌜L⌝∈A
    F⌜L⌝=c_0⇔⌜L⌝⌝A

    让G≡λn。 iszero(F⟨1,⟨n,#n⟩⟩)M_0 M_1,其中M_0是B中的任何λ项,M_1是不在B中的任何λ项。注意#n是可计算的,因此是λ可定义的。 / p>

    现在问问题是“G⌜G⌝在B中吗?”。如果是,那么G⌜G⌝=M_1∉B,所以G⌜G⌝不能在B中(记住B在β=下是关闭的)。如果不是,那么G⌜G⌝=M_0∈B,所以它必须在B中。

    这是一个矛盾,所以A不可能是递归的,因此没有封闭的β=非平凡集是递归的。

    请注意{L | Lβ= true}在β=和非平凡下关闭,因此它不是递归的。这意味着lambda演算不可判定。

    *证明所有可计算函数都是λ可定义的(我们可以得到一个λ项F,使得F c_ {n1} c_ {n2} ... = c_ {f(n1,n2,...) } {以及此答案中的证明,可以在"Lambda Calculi With Types" by Henk Barendregt(第2.2节)中找到。