首页 > 其他分享 >5-The Untyped Lambda Calculus

5-The Untyped Lambda Calculus

时间:2024-01-25 20:44:40浏览次数:24  
标签:Calculus Untyped redex t2 语法 归约 lambda id Lambda

引入

lambda 演算中,所有事物都是函数

lambda 演算式中有三种项:

  • 变量 x,形如 x

  • 变量 x 在另外一个项 t1 中的抽象 abstraction,形如 λx . t1

  • 将项 t1 作用于 t2,形如 t1 t2

有如下的简单的递归定义来总结上述三种项的形式:

t ::= x      (variable)
      λx.t   (abstraction)
      t t    (application)

抽象语法与具体语法

具体语法指程序员直接编写或阅读的代码,比如一段 C++ 代码 x = 1 + 2 * 3;

抽象语法则是更加本质的一种表示,采用抽象语法树 abstract syntax trees 的方式,更清楚地揭示语法中项和项之间关系,对于上面一串代码可能有如下抽象语法树 AST

    =
  /   \
x      +
     /   \
    1     *
        /   \
       2     3

lambda 项表示的是一棵语法树,即使我们写成线性形式(一行)

为了简化 lambda 演算,做出如下两个约定:

  • 左结合,意味着 x y t 等价于 (x y) t

  • 抽象 abstraction 的右部应当尽可能向右拓展(尽可能长),意味着 λx . λy . x y x 等价于 λx . (λy . ((x y) x))

作用域

还需要讨论变量 x 的作用域 scope,也就是 x 什么时候是“自由”的:对于 x,当 x 出现在 λx . tt 中时,我们认为 x 是被约束 bound 的,否则是自由的

一个不含自由变量的项成为封闭项(组合子 combinators),最简单的组合子,称为恒等函数,记作 id = λx . x

操作语义

原教旨主义纯粹的 lambda 运算中,没有内置的常数,原始运算符等等,“运算”的唯一含义是将函数应用 application 于参数(同样也是函数)上

计算(上文所说的 application)的步骤为将左侧的 abstraction 中的约束变量替换成右侧的参数,记作:

(λx . t12) t2 → [x → t2] t12

[x → t2] 意为由 t2 代换在 t12 中所有自由出现的 x

比如: (λx . x) y 经计算之后为 y

由 Church 的定义,[x → t2] t12 称为一个可归约表达式 redex,并且根据上述操作进行计算的操作称为 beta 规约

下面给出了几个求值策略,用来确定项在下一步求值中如何激活这个可归约表达式

  • beta 规约 full beta-reduction:任何时刻都可以归约任何一个 redex,比如:

对于 (λx . x)((λx . x)(λz . (λx . x) z)) ≡ id(id(λz . id (z)))

可以从内向外归约 id(id(λz . id (z))) → id(id(λz . z)) → ... → λz . z

显然从外向内归约可以得到一样的结果

  • 常规顺序策略 normal order strategy:外面的 redex 最先归约

  • 按名调用策略 call by name strategy:和常规顺序策略类似,但是不允许在 abstraction 内部进行归约,同样以上文的例子为例,λz . id z 被认为不可进行归约,演算进行到 λz . id z 就停止了

  • 按值调用策略 call by value strategy: 最常用的策略;归约外层 redex,且一个 redex 会被归约仅当它的参数已经是一个值 value,即一个计算已经完成,已经不能被归约的形式,包括 lambda abstractions,numbers,booleans 等。

本书中采用按值调用策略

多参数 multiple arguments 与柯里化 Currying

标签:Calculus,Untyped,redex,t2,语法,归约,lambda,id,Lambda
From: https://www.cnblogs.com/sysss-blogs/p/17987888

相关文章

  • lambda表达式
    1.假如有ABC等多个系统每个系统下有多个附件,每系统共两种文件类型分别为新设计文档和评审记录文档2.获取每个系统下该文件类型的上传的最新的文档(每个文件都标有最新日期duptime)3.Java代码处理逻辑和代码要实现获取每个系统下指定文件类型的最新上传文档的逻辑,可以按照以......
  • AWS ECS + CloudMap + Lambda workshop (一)
    第一篇:创建一个由ECS托管的nodejs服务一)创建拥有AdministratorAccess的IAMUser,在权限设置时,直接给予AdministratorAccess二)ECR服务注册代码仓库输入名称,完成Copy镜像库的URIXXXXXXXX.dkr.ecr.cn-northwest-1.amazonaws.com.cn/nodejs-test-app使用docker命令上传代......
  • 3-Untyped Arithmetic Expressions
    导论这一章节和下一章节构建了一套工具服务于仅含布尔值和数值的小型语言这个小型语言非常简单,但是可以承载几个非常重要的概念抽象语法abstractsyntax归纳定义和证明inductivedefinitionsandproofs求值evaluation运行时错误runtimeerror这个小型语言用到以下几......
  • C++中lambda与priority_queue一起使用
    想写这篇博客的原因是在刷力扣的347.前K个高频元素一题时,需要使用到优先队列priority_queue,其定义如下:template<classT,classContainer=std::vector<T>,classCompare=std::less<typenameContainer::value_type>>classpriority_queue;第三个参数......
  • 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象
    快速对比两个list数据集合此文引用csdn:https://blog.csdn.net/Zhu_daye/article/details/104798410小批量、快速对比两个list数据集合usingSystem.Linq.Expressions;Main();voidMain(){//对比源集合varsource=GenerateStudent(1,10000,1000);//......
  • 无涯教程-MATLAB - 微积分(Calculus)
    MATLAB提供了多种方法来解决微分和积分问题,求解任意程度的微分方程式以及计算极限,最重要的是,您可以轻松求解复杂函数的图,并通过求解原始函数及其导数来检查图上的最大值,最小值。本章将讨论微积分的问题,在本章中,我们将讨论预演算的概念,即计算函数的极限并验证极限的性质。计算极......
  • 【Java 进阶篇】使用 Stream 流和 Lambda 组装复杂父子树形结构(List 集合形式)
    目录前言一、以部门结构为例1.1实体1.2返回VO1.3具体实现1.4效果展示二、以省市县结构为例2.1实体2.2返回VO2.3具体实现2.4效果展示三、文章小结前言在最近的开发中,一星期内遇到了两个类似的需求:返回组装好的部门树、返回组装好的地区信息树,最终都需要返回List集合对象给前端......
  • Dating Java8系列之Lambda表达式和函数式接口(下)
    给我馍馍/文  使用函数式接口  函数式接口定义且只定义了一个抽象方法。函数式接口很有用,因为抽象方法的签名可以描述Lambda表达式的签名。为了应用不同的Lambda表达式,你需要一套能够描述常见函数描述符的函数式接口。Java8的库设计师帮我们在java.util.......
  • Dating Java8系列之Lambda表达式和函数式接口(上)
    给我馍馍/文  Lambda简介 我们可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式。它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。匿名:我们说匿名,是因为它不像普通的方法那样有一个明确的名称。函数:我们说它是函数,......
  • python-函数进阶:函数返回多个返回值,lambda匿名函数
    如果一个函数要有多个返回值,要怎么书写呢?deftest_return():return1,2x,y= test_return()按照返回值的顺序,写对应顺序的多个变量接收即可变量之间用逗号隔开支持不同数据类型的return  匿名函数匿名函数使用lambda关键字进行定义定义语法:lambda传入参数:函数......