从选择信息专业开始到回炉读书为止,四舍五入码了八年代码。对于计算机科学的认知仅限于:

1)使用不同语言实现特定功能
2)实现不同算法以增进系统性能
3)搭建不同架构进行组织管理
 
但从未思考一些本质问题,比如程序中的函数是什么?系统中的进程是什么?类是什么?这些常用概念,都会使用,也会用描述加以解释,但没有想过需要进行形式化的定义。因此,其实从来没有进过计算机科学的大门。
 
上两个学期修习了Principles of Programming Language, Logic两门课程,加之浏览了一些verification,type theory 和其他演算的内容,方觉任督二脉始通。要想练得精纯内功,输出难度和效率显然远高过输入。希望在博客总结完成过后,能有透彻的理解。
 
开篇
一切计算机运算过程,都可以归约于最简单的模型,比如图灵机,比如Lambda演算。
 
Lambda演算, 出自Alonzo Church三十年代的书The Calculi of Lambda-Conversion。Alonzo设计Lambda演算的初衷,是为了以一种通用的形式化方式来表示复杂的计算过程。
 
假设有一群原始人,他们的数学系统里用+号来表示两数相加,却没有×号,那么他们想要表达乘这种运算的时候,只能用..+..+..这种表达式,或者用描述式的“十个加”,一旦他们引入了×号,就相当于有了一种形式化的方法来表达乘运算。
 
尽管现代数学系统里,除了加号和乘号之外,幂、积分、累加等等运算符号不停地被发明出来,但是想用它们组成表达式来表示一段计算机程序的运算过程,还是显得无比繁琐。
 
Lambda演算使用了一套极其简单的符号系统:{λ, ., (, )}以及变量名,就能表示一切图灵可计算的问题的计算过程,因此,它是一种通用的形式化演算。
 
Alonzo证明了Lambda演算无法解决可判定性问题(Entscheidungsproblem),它所能实现的计算复杂度是与图灵机相等的。换句话说,Lambda演算和与图灵机等价。因此,它是图灵完备的。
 
下面开始理解Lambda演算: 
 
(一) 函数
数学中的函数,可以看作一种映射。计算机科学中的函数同样是一组映射规则,这种规则会将给定的值(参数)映射到结果(返回值)上。在计算机中,这个规则具体表现为一段操作。这段操作被应用于参数的过程称作归约,归约之后,原有的参数+操作表达式被简化成一个返回值。
 
这个函数(规则、操作、anything)可以表示为 f a。表达式左边f为函数名,右边a为形参名。
 
如同数学函数有定义域和值域,一个计算机函数所能作用的参数,也有一定范围。对于超出范围的a,f a是无意义的。
 
(二)多个参数
当一个函数有两个参数a,b时,写作 f a b,情况变得复杂了一些。令一个函数 g = f a,我们可以发现,对于任意定义域内的g,都可以得出g b = f a b。因此,f a b 等价于(f a)b。左边括号里的整个表达式为一个函数(f a),右边为变量名b。
 
因此,对于有两个参数的函数,其归约过程等效于将函数f应用于第一个参数a,返回一个简化后的函数g,再将g应用于第二个参数b,返回计算结果。
 
更进一步,三个参数的函数f a b c 可拆解为单个参数(f a b)c,或两个参数(f a)b c。无论哪种拆解方式,最终都归为((f a) b) c。
 
将该结论拓展至一般情况,任意多个参数的函数,最终都可以拆解为单个参数的函数组合。
 
(三)Lambda符号
假设我们有一个函数f=x+1,在形式化的表达式中,将用具体的表达式x+1来替换f。假设这个函数是f=x,则之前的 f x, 写作 x x。我们并无法区分是在讨论变量x,还是谈论一个将参数映射到它自己的函数 x。因此,Alonzo引入符号Lambda (λ)来区分这两种情况。
x 单纯表示一个变量x,λx.x表示一个函数,点号左边的x指定这个函数的形参是x,右边表示这个函数的表达式,表达式中的所有x都是形参,在未来的归约中,都会被实参替换。
 
举例来说,λx.(x^2-1),x是参数,x^2-1是函数表达式,表示这个函数返回参数值的平方减一。
 
根据(二)中有关多个参数的讨论,λx.λy.(x+y),则等效于λx.(λy.(x+y)),其中λy.(x+y)表示一个函数,这个函数返回参数与x的和,x在此处是一个值不定的量(变量),或者说尚未绑定值的名字,加上λx.部分后,λy.(x+y)中的x就成了另一个形参,而这个函数返回的是参数x与参数y的和。
 
 

Lambda演算(一)大道至简的更多相关文章

  1. [C#学习教程-委托]001.大道至简之委托(代理),匿名函数,Lambda表达式

    引言:此文翻译自CodeProject上的同名文章<C# Delegates,Anonymous Methods, and Lambda Expressions>,在此一起Mark一下,此 ...

  2. 简单易懂的程序语言入门小册子(1):基于文本替换的解释器,lambda演算

    最近比较闲,打算整理一下之前学习的关于程序语言的知识.主要的内容其实就是一边设计程序语言一边写解释器实现它.这些知识基本上来自Programming Languages and Lambda Calc ...

  3. 《大道至简》第一章读后感--JAVA语言伪代码形式

    import.java.大道至简.*; //一·愚公移山 import.java.愚公移山.*; public class YuGongYiShan { //原始需求:惩山北之塞,出入之迂 //项目沟 ...

  4. 《大道至简》第一章——编程的精义_读后感(Java伪代码形式)

    <大道至简>第一章——编程的精义_读后感(Java伪代码形式)1.愚公移山//愚公为团体的项目组织者.团体经理.编程人员.技术分析师等//子孙荷担者三人为三名技术人员//遗男为外协//目标 ...

  5. 《大道至简》第一章读后感(java语言伪代码)

    中秋放假之际读了建民老师介绍的<大道至简>的第一章,其中以愚公移山的故事形象的介绍向介绍编程的精义.愚公的出现要远远早于计算机发展的历史,甚至早于一些西方国家的文明史.但是,这个故事许是我 ...

  6. Lambda演算 - 简述Y组合子的作用

    Y组合子:\f.(\x.f(xx))(\x.f(xx)),接受一个函数,返回一个高阶函数 Y组合子用于生成匿名递归函数. 什么叫匿名递归函数,考虑以下C语言递归函数 int sum(int n) { ...

  7. 《大道至简》第三章读后感+ppt课后作业

                   大道至简读后感 ——第三章团队 古人云“三人为众”,众则是指团体或团队.对于一个团队而言,重要的是凝聚力,大家能在一起把拳头握紧那么产生的力量就不紧紧是能以1+1=2 来 ...

  8. 《大道至简》之第一章:编程的精义读后感(JAVA伪代码)

    ——大道至简之编程的精义读后感(JAVA伪代码) import.java.大道至简.*; import.java.愚公移山.*; public class YuGongYiShan{ 愚公 = {项目 ...

  9. 大道至简---软件工程实践者的思想------------java伪代码形式读后感第一章

    import.java.大道至简.*; 1.编程的精义----愚公移山 /* 原始需求的产生:惩山北之塞,出入之迂 项目沟通的基本方式:聚室而谋曰 项目的目标:毕力平险,指通豫南,达于汉阴 技术方案: ...

随机推荐

  1. 一张图搞懂Spring bean的完整生命周期

    一张图搞懂Spring bean的生命周期,从Spring容器启动到容器销毁bean的全过程,包括下面一系列的流程,了解这些流程对我们想在其中任何一个环节怎么操作bean的生成及修饰是非常有帮助的. ...

  2. js和php的时间戳和时间的转化

    js时间戳转化为时间 //时间戳转时间 function time(sj) { var now = new Date(sj*1000); var year =now.getFullYear(); va ...

  3. 【leetcode 简单】第五十题 位1的个数

    编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量). 示例 : 输入: 11 输出: 3 解释: 整数 11 的二进制表示为 00000000000 ...

  4. let块级作用域

    let是es6中新加的作用域,即块级作用域. var申明的变量要么全局,要么函数级,而let允许把变量的作用域限制在块级域中,这里的块级可以是()内,或{}内. 示例: code_1: "u ...

  5. NASA: SpaceX的猎鹰9号火箭将龙飞船发射到国际空间站

    At 5:42 a.m. EDT Friday, June 29, 2018, SpaceX’s Dragon spacecraft lifts off on a Falcon 9 rocket fr ...

  6. 【转载】WebDriver(C#)之十点使用心得

    使用Selenium WebDriver驱动浏览器测试的过程中多多少少会遇到一些折腾人的问题,总结了一部分,做下分享. 一.隐藏元素处理(element not visible) 使用WebDrive ...

  7. photoshop 安装问题

    问题:“安装程序检测到计算机重新启动操作可能处于挂起状态.建议您退出安装程序,重新启动并重试.” 解决: 1.运行 regedit 打开注册表编辑器. 2.依次展开HKEY_LOCAL_MACHINE ...

  8. Python 类的名称空间和组合

    一.Python类的名称空间 class Student(object): School = '北京大学' def __init__(self): pass stu1 = Student() stu1 ...

  9. oracle日期格式转换 to_date()

    与date操作关系最大的就是两个转换函数:to_date(),to_char()       to_date() 作用将字符类型按一定格式转化为日期类型:       具体用法:to_date(''2 ...

  10. 用dom4j操作xml文件

    XML的全称是eXtensible Markup Language,即“可扩展标记语言”.XML文件的作用主要是数据存储,文件配置,数据传输. html与xml的区别是:①html语法松散,xml语法 ...