我是Lambda Calculus的新手。 我读过definition of lambda expression on Wikipedia。
lambda表达式集合Λ可以归纳定义:
- 如果x是变量,则x∈Λ
- 如果x是变量且M∈Λ,那么(λx.M)∈Λ
- 如果M,N∈Λ,则(M N)∈Λ
醇>规则2的实例称为抽象,规则3的实例称为应用程序。
当 M 是一个函数抽象时,我知道规则2 的含义,即(λx.E)
但 M 不是函数时的含义是什么?例如,只是变量 x 或非函数表达式 x + y
答案 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
,并且M
和N
都处于正常状态,那么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演算只是一个核心演算,其功能(直接)可表达。