在lambda演算中,若将表达式应用于非函数表达式会怎么样?
我不熟悉Lambda微积分。 我已经读到了 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.
但是当M不是一个函数时,它的含义是什么?例如,只有变量x或非函数表达式x+yLambda演算包含在上下文无关语法中
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