
programming language
文章平均质量分 83
Fala Oviara
ultimate full-stack
展开
-
【Programming Languages And Lambda calculi】5.2 ISWIM 约化
5.2 ISWIM 约化由于ISWIM的函数只接收值参数,我们必须首先定义 值 集。 值集 V (或 U 及 W)是表达式集合的子集。特别是,一个应用表达式永远不是一个值,而抽象(例如函数)则永远是一个值,不管它的body的格式如何。ISWIM 最核心的约化关系为 βv ,类似于 β,但是它的参数必须从属 V 而不是 M:将参数限制为 V 的成员,再一定程度上强行规定了赋值的顺序。例如, ((λx.1) (sub1λy.y)) 无法用 βv 约化为 1,由于 (sub1λy.y) 并非 V 的成原创 2021-02-28 21:30:29 · 274 阅读 · 0 评论 -
【Programming Languages And Lambda calculi】现实语言模型 5.1 ISWIM表达式
第二部分 现实语言模型第五章 ISWIMChurch 发展了Lambda 演算作为机械计算的互补,成为学习数学的一种方法。在20世纪60年代 Landin 证明了 Church 的Lambda演算并不能作为大多数编程语言的适合模型。举例来说,Lambda表达式约化为 1 的编码,尽管大部分语言会对 (sub1 λy.y) 颇有言辞。问题并不止于 sub1和 λy.y 的编码,对整个表达式进行 β 约化后,(sub1 λy.y) 参数将会完全被忽略。这种 名称调用 的特点是否可取,仍有待商榷。无论如原创 2021-02-21 22:54:22 · 464 阅读 · 0 评论 -
【Programming Languages And Lambda calculi】4.7~4.8 关于Lambda演算的一些事实 范式 历史 第四章完
文章目录4.7 关于Lambda演算的一些事实练习 4.15题解4.8 历史4.7 关于Lambda演算的一些事实什么时候一个表达式是完全还原的?几乎所有的表达式可以用 →nα 将变量名重命名来约化,所以 →nα 不能被算在定义内。因此,一个完全还原的表达式是无法再由 →nβ →nη 约化的表达式。概念:如果一个表达式无法再由 →nβ →nη 约化,则它被称为范式。M 有范式 N 如果 M =n N 并且 N 是范式。范式的作用与Lambda演算表达式的结果一样。如果一个表达式有范式原创 2021-02-19 22:08:42 · 195 阅读 · 0 评论 -
【Programming Languages And Lambda calculi】4.6 Lambda表达式 递归 (重要,建议彻底弄懂)
4.6 递归上一小节的练习要求你用实现 add 的方法实现 mult 。类似的实现体现了数字是由函数编码的信息。给定函数 iszero,add和 sub1,我们同样可以在不知道任何数值如何被编码的前提下实现 mult 。我们必须定义一个递归程序来检查第一个参数是否为0,如果不是,将第二个参数添加到递归调用,并递减第一个参数。上述定义 mult 宏的问题为,它调用了自身,所以没有方法将 mult 展开为一个纯 lambda表达式。因此,缩写是违法的。4.6.1 自应用递归乘法器函数如何获得自己的句原创 2021-02-17 22:48:50 · 483 阅读 · 2 评论 -
【Programming Languages And Lambda calculi】4.5 Lambda 表达式 数值编码
4.5 数值编码在Lambda演算中,又很多给数值编码的方法,但是最流行的方法来自于Church,因此数值编码又被称为 Church 数。它的思想是一个自然数 n 被编码成一个有两个参数的函数,参数分别为 f 与 x,函数将f应用于x n遍。因此,0的函数接收一个 f 和 x,返回 x(相当于应用 f 0次)。1 的函数应用 f 一次,以此类推。方法 add1 需要接收数值 n 的代表,并且生产出数值 n + 1的代表。换言之,它接收一个含有两个参数的函数并且返回另一个含有两个参数的函数;新的函数将应原创 2021-02-16 01:01:14 · 222 阅读 · 0 评论 -
【Programming Languages And Lambda calculi】4.4 Lambda 表达式 对值编码
文章目录4.4 对编码练习 4.5题解4.4 对编码实行对编码,我们需要三类操作:结合两个值提取第一个值的操作提取第二个值的操作话句话说,我们需要 mkpair, fst, snd 满足下述等式:fst(mkpair M N)=nMsnd(mkpair M N)=nNfst(mkpair\ M\ N) =_n M\\snd(mkpair \ M\ N) =_n Nfst(mkpair M N)=nMsnd(mkpair&n原创 2021-02-15 00:11:44 · 259 阅读 · 0 评论 -
【Programming Languages And Lambda calculi】4.3 Lambda 表达式中给布尔值编码
文章目录4.3 布尔值编码练习 4.3题解练习题解4.3 布尔值编码在 B 语言中,我们选择了 f 和 t 去“代表” “false” 和 “true”, 在Lambda演算中,我们将会做出不同的选择 —— 虽然在原则上是随机的,但是事实证明这样很方便:≐ 符号表示我们正在对表达式速记异或“宏”。“true” “false” 和 “if” 的宏如果表现有用的话将会非常有帮助。比如,我们会认为对于任何M和N:if true M N=nMif \ true \ M\ N原创 2021-02-14 23:17:11 · 288 阅读 · 0 评论 -
【Programming Languages And Lambda calculi】4.2 Lambda演算的语法与约化
文章目录4.2 Lambda演算的语法与约化练习 4.1题解练习 4.2题解4.2 Lambda演算的语法与约化Lambda演算中表达式的一般语法由M(或别名N和L)定义:下述为 M 成员的例子:第一个例子,x,没有特别的直观意义,因为x是未定义的。类似, (x y) 表示“x应用到y”,但是我们没法得知更多,因为x和y也都是未定义的。作为对比,(λx.x)表示恒等函数。前两个例子和后一个例子的区别为在前两个例子中,在表达式中的 x 是 自由 的,在后一个例子中 x 是被约束的。在关系 FV原创 2021-02-14 21:54:15 · 211 阅读 · 0 评论 -
【Programming Languages And Lambda calculi】第四章 Lambda演算 / Lambda表达式 4.1 演算中的函数 柯里化
第四章 Lambda演算 / Lambda表达式B语言的限制性太强,对任何实际的编程任务都用处不大。因为它没有抽象能力,也就是说,没有定义功能的能力,这使它远不如现实的编程语言。在这个章节,我们将会学习一种叫做 Lambda演算 的语言,它由Church发明。尽管 Lambda演算的语法和规约关系很小,但它与Scheme和ML等十分有用的语言密切相关。在这些语言中,函数不仅操纵布尔、整数和对,也操纵其他函数。换句话说,函数就是值。例如,map函数使用函数和元素列表,并应用函数应用列表中的每个元素。类似的原创 2021-02-13 22:47:38 · 309 阅读 · 0 评论 -
【Programming Languages And Lambda calculi】第三章 求值一致性 Church-Rosser 关系 (本章仅一节)
第三章 求值一致性现在我们学会了结构归纳法,现在已经准备好讨论 evalr 求值机的一致性了。换句话说,我们需要证明 evalr 是一个函数。更正式地说,给定结果 R 的概念:R=t ∣ fR = t \\\ \ \ \ \ \ |\ fR=t ∣ f我们需要证明下述定理:定理 3.1 如果 evalr(B0) = R1 且 evalr原创 2021-02-13 00:05:25 · 445 阅读 · 2 评论 -
【Programming Languages And Lambda calculi】2.4 ~ 2.5 多重结构,更多的定义与证明 第二章结束
文章目录2.4 多重结构练习 2.3题解2.5 更多的定义以及更多的证明练习2.4题解练习 2.5题解练习 2.6题解2.4 多重结构许多关于递归定义的集合的证明都涉及到两个不同集合之间的连接。比如,考虑以下的论证:定理 2.6 对于所有 ΔP,P 都不包含 β。这个证明应该对 P 或是 ΔP 用结构归纳法吗?我们可以仔细观察一下定理。定理以“对于所有 ΔP”开头,意味着证明必须包含所有可能的 ΔP。因此,证明必须以 ΔP 结构归纳进行。接着,在 ΔP 的每个要素中,我们的目标是展示一个特定的 P原创 2021-02-12 20:44:04 · 350 阅读 · 0 评论 -
【Programming Languages And Lambda calculi】2.2 ~ 2.3 定义中的省略,证明树中的归纳
2.2 定义中的省略要注意包含省略(或是星号)的定义,因为它们包含着隐含的递归。例如,在第二个要素中,任意数量的W都是被允许的。如下是更加精确的定义:像这样扩展后,我们可以发现证明W实例的时,必须相互证明Y的归纳要素。在实践中,Y的归纳要素通常很明显以至于我们经常省略,并专注于原始定义的证明。定理 2.3 每一个W都包含 α证明:基本要素:要素 α论证成立归纳要素:要素 (βW0W1 . . . Wn)每一个Wi 都包含 α ,每一个W都包含至少一个 Wi ,原创 2021-02-11 23:06:53 · 219 阅读 · 0 评论 -
【Programming Languages And Lambda calculi】第二章 结构归纳法 2.1 基础
文章目录章节2 结构归纳法2.1 结构归纳法的要素练习 2.2题解章节2 结构归纳法上一章定义的r关系是一个函数,但我们如何证明?这里有一个半正式的证明:r关系由一对约束定义。第一个约束为以 f 开头的•表达式,结果由表达式的右侧部分唯一确定。第二个约束为以 f 开头的•表达式,结果被唯一确定为 t 。因为一个表达式仅可以以f或者t开头,所以只有一个约束会被应用,因此结果也是唯一的。上述的论点是相当有说服力的,因为它以来于一个表达式直接可观察的性质:这个表达式由 f 还是 t 开头。其他关于 B 的原创 2021-02-10 23:23:50 · 772 阅读 · 1 评论 -
【Programming Languages And Lambda calculi】 1.5 ~ 1.7 上下文规约 赋值函数 符号摘要
文章目录1.5 上下文中的赋值练习 1.3题解:练习 1.4题解:1.6 赋值函数练习 1.5题解:1.7 符号摘要1.5 上下文中的赋值如何减少表达式 ((f • t) • f) ?根据 r 关系或者 ↝↝r 关系,这个表达式并不能规约!直观上看,通过将第一个子表达式根据 (f • t) r t 的规则, ((f • t) • f) 应该被规约到 (t•f) 。但是在r关系的定义中,没有一项是满足 ((f • t) • f) 的。我们只能将类似于 (f • B) 或 (t • B) 格式的表达式规原创 2021-02-09 23:53:05 · 342 阅读 · 0 评论 -
【Programming Languages And Lambda calculi】 1.4 有向赋值
1.4 有向赋值“赋值”规则 ≈r 看上去并不特别像赋值。它允许我们证明某些表达式是相等的,但是它没有确切地告诉我们如何从一个随意的B集合元素到 t 或是 f 。更加简单的关系 r 事实上显得更加有用。在r关系的定义中,两个给定的条件都将一个表达式转化成另一个更简的表达式。并且,对于任何集合B的表达式中,B集合元素要么是t或者f,要么关系r将B集合元素与至多一个的其他表达式相关联。作为结论来说,我们可以将 r 视为 单步减少(single-step reduction)行为,从而帮助我们理解一个解释器可原创 2021-02-08 13:52:38 · 217 阅读 · 0 评论 -
【Programming Languages And Lambda calculi】 1.2 ~ 1.3 关系、赋值与关系
1.2 关系关系是一种集合,其元素由有序对组成。例如,我们可以定义 ≡ 关系,使每个元素与其自身相匹配:对于 ≡ 这种二元关系,我们通常将〈a, a〉∈≡ 写作 a ≡ a:或者更加简单:一旦理解 ≡ 的定义,就会发现,这种关系是自反、对称和传递的。如果一个关系是自反(reflexive)、对称(symmetric)和传递(transitive)的,那么它就是一个等价(equivalence)的关系。如下定义了一个 r 关系,它既不自反,也不对称、传递。我们可以定义一个新的关系 )(原创 2021-02-07 23:13:42 · 288 阅读 · 0 评论 -
Programming Languages And Lambda calculi 1.1 定义集合
Programming Languages And Lambda calculi第一章 用文字计算在本书中,我们将会研究如何用一种人们容易理解的方式去定义一种编程语言以及进行形式分析。定义语言的其中一种方法是用整段整段的文字去定义,解释语言中的表达方式以及如何去分析它们。这种方法能够让读者很快在整体上大致理解一种语言,但是有关这种语言的细节将会变得非常难以提取。更加糟糕的是,段落文本不适合正式的分析。另一种定义语言的方法是引入一个叫元语言(meta-language)的解释器。假设读者对元语言非常熟原创 2021-02-06 23:05:14 · 455 阅读 · 0 评论