在lambda演算中,如果将表达式应用于非函数表达式会怎么样?

时间:2017-04-02 08:13:27

标签: lambda lambda-calculus

我是Lambda Calculus的新手。 我读过definition of lambda expression on Wikipedia

  

lambda表达式集合Λ可以归纳定义:

     
      
  1. 如果x是变量,则x∈Λ
  2.   
  3. 如果x是变量且M∈Λ,那么(λx.M)∈Λ
  4.   
  5. 如果M,N∈Λ,则(M N)∈Λ
  6.         

    规则2的实例称为抽象,规则3的实例称为应用程序。

M 是一个函数抽象时,我知道规则2 的含义,即(λx.E)

M 不是函数时的含义是什么?例如,只是变量 x 或非函数表达式 x + y

2 个答案:

答案 0 :(得分:1)

Lambda演算包含无上下文语法

E ::= v        Variable
   |  λ v. E   Abstraction
   |  E E      Application

其中v范围与变量以及β和eta减少规则一致

(λ x. B) E  ->  B   where every occurrence of x in B in substituted by E
  λ x. E x  ->  E   if x doesn't occur free in E

aλ b. b a免费,但在λ a. λ b. b a中则不行。两个缩减规则都不适用的表达式为 normal form

因此,如果M N不是beta-redex (λ x. B) E,并且MN都处于正常状态,那么M N整个就是不可简约的正常形式。

答案 1 :(得分:1)

因此,当M是函数时,(M N)的含义很清楚。 为简单起见,让我们考虑身份的情况,即M = I = \ x.x。

                          (*)    (\x.x) N 

减少到N. 假设您现在想要使您的程序更通用。您 不想只将身份应用于N,而是应用通用函数 f你作为输入。所以,你用f替换\ x.x并抽象出来 整个任期w.r.t. F:

                                 \f.f N

必须理解为\ f。(f N)。很简单。

您现在可以将身份作为参数提供给前一个术语,以获取 等同于(*)的术语:

                       (\f.f N) \x.x = \x.x N

为了使事情变得更加复杂,您可以想象处理您的输入 函数f在应用于N之前。例如,如果您期望二进制 (currified)函数作为输入,你可能希望将f应用于"对"参数(N,N),因为f被柠檬化,相当于将N作为参数传递两次:

                        (**)    \f. f N N

被理解为\ f。 ((f N)N)。因此,您清楚地看到应用程序处于其他应用程序的功能位置。

要查看上一个示例,请使用术语K = \ x。\ y.x,而不是标识。 K吃了两个论点 广告返回第一个。如果您将K作为上一学期的输入,则仍会得到等同于(*)

的术语
                       (\f.f N N) K = K N N = N

通常,编程语言是提供抽象的一种方式。 要抽象出一个概念,首先需要给出一个方法 这个概念的实例的名称。例如,在命令式语言中,变量本质上是存储器单元的抽象。 要根据功能进行抽象,您需要使用它 功能名称。 第二步,它允许概念是"表达",即 提供允许动态合成的表达式语言 给定概念的新实例(在我们的例子中,是新函数)。 lambda演算只是一个核心演算,其功能(直接)可表达。