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

在lambda演算中,若将表达式应用于非函数表达式会怎么样?,lambda,lambda-calculus,Lambda,Lambda Calculus,我不熟悉Lambda微积分。 我已经读到了 lambda表达式集∧可归纳定义为: 如果x是一个变量,那么x∈ ∧ 如果x是一个变量,M∈ ∧,那么(λx.M)∈ ∧ 如果M,N∈ ∧,那么(mn)∈ ∧ 规则2的实例称为抽象,规则3的实例称为应用程序 当M是一个函数抽象时,我知道规则2的含义,即(λx.E)的形式 但是当M不是一个函数时,它的含义是什么?例如,只有变量x或非函数表达式x+yLambda演算包含在上下文无关语法中 E ::= v Variable | λ v.

我不熟悉Lambda微积分。 我已经读到了

lambda表达式集∧可归纳定义为:

  • 如果x是一个变量,那么x∈ ∧
  • 如果x是一个变量,M∈ ∧,那么(λx.M)∈ ∧
  • 如果M,N∈ ∧,那么(mn)∈ ∧
  • 规则2的实例称为抽象,规则3的实例称为应用程序

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


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

    Lambda演算包含在上下文无关语法中

    E ::= v        Variable
       |  λ v. E   Abstraction
       |  E E      Application
    
    式中,
    v
    在变量范围内,以及beta和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
    。两种归约规则均不适用的表达式为标准形式

    因此,如果
    mn
    不是beta-redex
    (λx.B)E
    ,并且
    M
    N
    都是正规形式,那么
    mn
    整体是不可约正规形式。

    因此,当M是函数时,(mn)的含义对你来说是清楚的。 让我们考虑身份的情况,为简单起见,即m=i= \x.x.

                              (*)    (\x.x) N 
    
    这减少到N。 假设现在您希望使程序更通用一些。你 不希望仅将标识应用于N,而是应用泛型函数 f作为输入。因此,将\x.x替换为f并抽象 全期水渍险:

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

    现在可以将标识作为参数提供给上一个术语,以获得 相当于(*)的术语:

    为了使事情更加复杂,您可以想象处理您的输入 函数f,然后再将其应用于N。例如,如果您希望使用二进制 (currified)函数作为输入,您可能希望将f应用于“对”参数(N,N),因为f是currified的,所以等于将N作为参数传递两次:

                            (**)    \f. f N N
    
    要理解为\f。((f N)N)。因此,您清楚地看到了让应用程序处于其他应用程序的功能位置的意义

    要查看前面的示例,请使用术语K=\x.\y.x,而不是标识。K接受两个论点 ad返回第一个。如果将K作为前一个术语的输入,则仍然会得到一个与(*)等价的术语

    一般来说,编程语言是提供抽象的一种方式。 对一个概念进行抽象,首先需要一种给出的方法 概念实例的名称。例如,在命令式语言中,变量本质上是存储单元的抽象。 要对函数进行抽象,您需要使用 函数的名称。 第二步,允许概念“可表达”,即 提供一种允许动态合成的表达式语言
    给定概念的新实例(在本例中为新函数)。lambda演算只是一个核心演算,其中函数是(直接)可表达的

    x+y
    不是lambda表达式,因此不会发生这种情况。请参阅。如果M是一个变量,则表达式不能进一步缩减(除非另一个beta缩减用抽象替换该变量)。
                            (**)    \f. f N N
    
                           (\f.f N N) K = K N N = N