`
fixopen
  • 浏览: 83968 次
文章分类
社区版块
存档分类
最新评论

看到一个关于lambda的非正式描述,记下来

阅读更多
在 lambda 演算中,每个表达式都代表一个只有单独参数的函数,这个函数的参数本身也是一个只有单一参数的函数,同时,函数的值是又一个只有单一参数的函数。函数是通过 lambda 表达式匿名地定义的,这个表达式说明了此函数将对其参数进行什么操作。例如,“加 2”函数 f(x) = x + 2 可以用 lambda 演算表示为 λ x. x + 2 (λ y. y + 2 也是一样的,参数的取名无关紧要) 而 f(3) 的值可以写作 (λ x. x + 2) 3。函数的作用 (application) 是左结合的:f x y = (f x) y。考虑这么一个函数:它把一个函数作为参数,这个函数将被作用在 3 上:λ x. x 3。如果把这个 (用函数作参数的) 函数作用于我们先前的“加 2”函数上:(λ x. x 3) (λ x. x+2),则明显地,下述三个表达式:

    (λ x. x 3) (λ x. x+2)   与    (λ x. x + 2) 3    与    3 + 2

是等价的。有两个参数的函数可以通过 lambda 演算这么表达:一个单一参数的函数的返回值又是一个单一参数的函数 (参见 Currying)。例如,函数 f(x, y) = x - y 可以写作 λ x. λ y. x - y。下述三个表达式:

    (λ x. λ y. x - y) 7 2    与    (λ y. 7 - y) 2    与    7 - 2

也是等价的。然而这种 lambda 表达式之间的等价性无法找到一个通用的函数来判定。

并非所有的 lambda 表达式都可以规约至上述那样的确定值,考虑

    (λ x. x x) (λ x. x x)



    (λ x. x x x) (λ x. x x x)

然后试图把第一个函数作用在它的参数上。 (λ x. x x) 被称为 ω 组合子 (combinator),((λ x. x x) (λ x. x x)) 被称为 Ω,而 ((λ x. x x x) (λ x. x x x)) 被称为 Ω2,以此类推。

若仅形式化函数作用的注记而不允许 lambda 表达式,就得到了组合子逻辑 (combinatory logic)。

α-变换

Alpha-变换规则表达的是,被绑定变量的名称是不重要的。比如说 λx.x 和 λy.y 是同一个函数。尽管如此,这条规则并非像它看起来这么简单,关于被绑定的变量能否由另一个替换有一系列的限制。

Alpha-变换规则陈述的是,若 V 与 W 均为变元,E 是一个 lambda 表达式,同时 E[V/W] 是指把表达式 E 中的所有的 V 的自由出现都替换为 W,那么在 W 不是 E 中的一个自由出现,且如果 W 替换了 V,W 不会被 E 中的 λ 绑定的情况下,有

    λ V. E == λ W. E[V/W]

这条规则告诉我们,例如 λ x. (λ x. x) x 这样的表达式和 λ y. (λ x. x) y 是一样的。

β-消解

Beta-消解规则表达的是函数作用的概念。它陈述了若所有的 E' 的自由出现在 E [V/E' ] 中仍然是自由的情况下,有

    ((λ V. E ) E' ) == E [V/E' ]

成立。

== 关系被定义为满足上述两条规则的最小等价关系 (即在这个等价关系中减去任何一个映射,它将不再是一个等价关系)。

对上述等价关系的一个更具操作性的定义可以这样获得:只允许从左至右来应用规则。不允许任何 beta 消解的 lambda 表达式被称为范式。并非所有的 lambda 表达式都存在与之等价的范式,若存在,则对于相同的形式参数命名而言是唯一的。此外,有一个算法用户计算范式,不断地把最左边的形式参数替换为实际参数,直到无法再作任何可能的消解为止。这个算法当且仅当 lambda 表达式存在一个范式时才会停止。Church-Rosser 定理 说明了,当且仅当两个表达式等价时,它们会在形式参数换名后得到同一个范式。
[编辑]

η-变换

前两条规则之后,还可以加入第三条规则,eta-变换,来形成一个新的等价关系。Eta-变换表达的是外延性的概念,在这里外延性指的是,两个函数对于所有的参数得到的结果都一致,当且仅当它们是同一个函数。Eta-变换可以令 λ x . f x 和 f 相互转换,只要 x 不是 f 中的自由出现。下面说明了为何这条规则和外延性是等价的:

若 f 与 g 外延地等价,即,f a == g a 对所有的 lambda 表达式 a 成立,则当取 a 为在 f 中不是自由出现的变量 x 时,我们有 f x == g x,因此 λ x . f x == λ x . g x,由 eta-变换 f == g。所以只要 eta-变换是有效的,会得到外延性也是有效的。

相反地,若外延性是有效的,则由 beta-消解,对所有的 y 有 (λ x . f x) y == f y,可得 λ x . f x == f,即 eta-变换也是有效的。

递归是一种以函数自身迭代自身变元的算法,一般是通过函数自身来定义函数的方式实现。表面看来 lambda 演算不允许递归,其实这是一种对递归的误解。考虑阶乘函数 f(n) 一般这样递归地定义:

    f(n) = 1, 若 n = 0; n·f(n-1), 若 n>0.

λ语言:

    FACT = λ n. n (λ u. MULT n (FACT (PRED n))) 1

用 Y-组合子 在 λ语言 中合法地定义:

    FACT = Y (λ g. λ n. n (λ u. MULT n (g (PRED n))) 1)

    Y = λ f. ((λ x. f (x x)) (λ x. f (x x)))
分享到:
评论

相关推荐

    Python-Lambdatoolkit是一个lambda命令行CLI

    Python-LambdaToolkit是一个专为Python开发者设计的命令行工具,它简化了AWS Lambda函数的开发、构建、调试、测试和部署流程。这个工具让开发者能够在本地环境中高效地操作Lambda函数,极大地提高了工作效率。 ### ...

    java8lambda表达式Demo

    在描述的Demo中,"LambdaTest"可能是一个包含各种Lambda用例的测试类。这可能包括对集合的流(Stream)操作,比如过滤、映射和归约等。例如,我们可以用以下方式过滤出列表中所有偶数: ```java List<Integer> ...

    Python-一个lambda演算的解释器实现

    一个简单的lambda表达式如λx.x,表示一个接受一个参数x并返回x本身的匿名函数。在Python中,我们可以用`lambda x: x`来创建类似的函数。 ### 应用与求值 Lambda演算中的应用是将一个函数应用到一个或多个参数上。...

    Lambda表达式.docx

    Lambda表达式本质上是一个匿名函数,允许你将函数作为一个值传递,这在处理函数式编程任务时尤其有用。下面我们将详细探讨Lambda表达式的核心概念、使用场景、对接口的要求以及函数式接口。 1. **Lambda表达式的...

    2_Lambda表达式.zip

    Lambda表达式是Java编程语言中的一个关键特性,自Java 8开始引入,它极大地简化了函数式编程,尤其是在处理集合数据时。Lambda表达式的主要目的是为了创建匿名函数,即没有名字的函数,它可以被当作一个值传递给方法...

    LAMBDA(MATLAB)

    MATLAB版本的LAMBDA算法为用户提供了一个高效且易于使用的工具,包含了源码和详细的说明手册。 **一、LAMBDA算法的核心概念** 1. **模糊度**:在GPS测量中,相位观测值是浮点数,包含一个整数部分(模糊度)和一个...

    C#lambda表达式的使用

    Lambda 表达式是 C# 编程语言中的一个重要概念,也是函数式编程的基础。Lambda 表达式可以被用作创建委托对象或表达式树类型。所有的 Lambda 表达式都使用操作符“=>“,表示“goes to (转变为)”。 Lambda 表达式...

    将字符串转换为lambda表达式

    在这个示例中,`string_to_lambda`函数接收一个字符串,解析它,找到`Lambda`节点,然后根据`Lambda`的参数和表达式构建一个实际的`lambda`函数。`eval()`函数在这里用作一个简单的工具,用于计算`lambda`表达式的值...

    Lambda教程

    这里的Lambda表达式`x => x * x`是一个接受一个整数参数`x`并返回`x`的平方的匿名函数。它被赋值给了一个委托类型`del`的实例。 2. **表达式Lambda** 当Lambda仅包含一个表达式时,称为表达式Lambda。这种Lambda...

    PS Lambda 1.0_lambda_GNSS_SDR_GNSS_computing_PSLambda_

    "PS Lambda 1.0_lambda_GNSS_SDR_GNSS_computing_PSLambda_" 这个标题揭示了我们讨论的主题是关于PS Lambda 1.0版本的一个软件或库,它专注于GNSS(全球导航卫星系统)信号处理和计算。GNSS SDR(软件定义无线电)是...

    Introduction to Lambda Calculus

    λ演算,λ(Lambda(大写Λ,小写λ)读音:lan b(m) da(兰亩达)['læ;...关于两个 lambda 演算表达式是否等价的命题无法通过一个通用的算法来解决,这是不可判定性能够证明的头一个问题,甚至还在停机问题之先。

    Lambda表达式.zip

    Lambda表达式是Java编程语言中的一个关键特性,它在Java 8中被引入,极大地简化了函数式编程。Lambda表达式本质上是匿名函数,可以被用作方法参数或局部变量,使得代码更加简洁且易于理解。这篇教程是针对初学者准备...

    C++ 11 lambda 表达式

    C++ 11引入了lambda表达式,这是一个强大的特性,极大地增强了C++的函数式编程能力。Lambda表达式允许在程序中直接定义匿名函数,并且可以直接在需要的地方使用,无需预先声明。这对于处理回调函数、简化算法实现...

    lambda演算资料集合

    Lambda演算是计算机科学中的一个核心概念,它由数学家阿隆佐·邱奇在20世纪30年代提出,主要用于研究函数定义、函数应用和函数组合。Lambda演算是一种形式化系统,它允许我们用纯函数式的方式表达计算。在这个资料...

    LAMBDA3_模糊度固定_lambda3_GPSlambda_enemyqab_源码

    标题中的"LAMBDA3"是指第三版的Lambda方法,这是一种广泛应用的模糊度固定算法,由T.J. Van Diggelen等人提出。这个方法基于双频GPS数据,通过精确的相位观测值来解决浮点模糊度,并转换为整数模糊度,从而达到高...

    C++ 中的 Lambda 表达式

    在这个例子中,Lambda表达式接收两个浮点数参数`a`和`b`,并根据它们的绝对值大小返回一个布尔值。`std::sort()`函数使用这个Lambda表达式作为比较函数,从而实现了基于绝对值大小的排序。 #### 总结 Lambda表达式...

    java8Lambda10个案例

    Java 8 是一个重要的Java平台版本,引入了许多新特性,其中最引人注目的就是Lambda表达式。Lambda表达式是函数式编程的核心元素,它使得Java语言变得更加简洁、灵活,尤其在处理集合和多线程时。这个"java8Lambda10...

    Laravel开发-lumen-lambda

    通过Composer安装Lumen,运行`composer create-project --prefer-dist laravel/lumen lumen-lambda`命令创建一个新的Lumen项目。 2. **构建Lambda函数**: Lumen默认使用内置的Swoole HTTP服务器,但Lambda不支持此...

    亚马逊 aws Lambda demo

    亚马逊AWS Lambda是一个无服务器计算平台,它允许开发者运行代码而无需预先配置或管理服务器。Lambda以其按需自动扩展和仅付费使用的特点,极大地简化了应用程序的部署和维护。在这个"亚马逊AWS Lambda demo"中,...

Global site tag (gtag.js) - Google Analytics