函数式程序设计语言ppt课件.ppt
《函数式程序设计语言ppt课件.ppt》由会员分享,可在线阅读,更多相关《函数式程序设计语言ppt课件.ppt(68页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第五章 函数式程序设计语言过程式程序设计语言由于数据的名值分离,变量的时空特性导致程序难于查错、难于修改命令式语言天生带来的三个问题只解决了一半滥用goto已经完全解决悬挂指针没有完全解决函数副作用不可能消除问题是程序状态的易变性(Mutability)和顺序性(Sequencing)Backus在图灵奖的一篇演说程序设计能从冯诺依曼风格下解放出来吗?中极力鼓吹发展与数学连系更密切的函数式程序设计语言5.1 5.1 过程式语言存在的问题过程式语言存在的问题(1 1)易变性难于数学模型易变性难于数学模型代数中的变量是未知的确定值,而程序设计语言的变量是对存储的抽象根本解决:能不能不要程序意义的“
2、变量”只保留数学意义的“变量”?能不能消除函数的副作用?例例:有副作用的函数有副作用的函数 int sf_fun(int x)int sf_fun(int x)static int z=0 static int z=0;/第一次装入赋初值第一次装入赋初值 return x+(z+)return x+(z+);sf_fun(3)=3|4|5|6|7 sf_fun(3)=3|4|5|6|7 /随调用次数而异随调用次数而异,不是数学意义的确定函数。不是数学意义的确定函数。(2)顺序性更难数学模型顺序性更难数学模型顺序性影响计算结果,例如,前述急求值、正规求值、懒求值同一表达式就会有不同的结果。有副作
3、用更甚,因而难于为程序建立统一的符号数学理论。应寻求与求值顺序无关的表达方式理想的改变途径没有变量,就没有破坏性赋值,也不会有引起副作用的全局量和局部量之分。调用通过引用就没有意义。循环也没有意义,因为只有每次执行循环改变了控制变量的值,循环才能得到不同的结果。那么程序结构只剩下表达式、条件表达式、递归表达式。5.2 演算演算是符号的逻辑演算系统,它正好只有这三种机制,它就成为函数式程序设计语言的模型演算是一个符号、逻辑系统,其公式就是符号串并按逻辑规则操纵Church的理论证明,演算是个完备的系统,可以表示任何计算函数,所以任何可用演算仿真实现的语言也是完备的。演算使函数概念形式化,是涉及变
4、量、函数、函数组合规则的演算。演算基于最简单的定义函数的思想:一为函数抽象x.E,一为函数应用(x.E)(a)。一切变量、标识符、表达式都是函数或(复合)高阶函数。如x.C(C为常量)是常函数。5.2.1 5.2.1 术语和表示法术语和表示法(1)(1)演算有两类符号演算有两类符号:小写单字符用以命名参数,也叫变量。外加四个符号:(、)、。、。大写单字符、特殊字符(如+、-、*、/)、大小写组成的标识符代替一个表达式。(2 2)公式公式 变量是公式,如y。如y是变量F是公式,则y.F也是公式。如F和G都是公式,则(FG)也是公式。(3 3)表达式表达式 形如y.Fy.F为函数表达式,以关键字开
5、始,变量y为参数。形如(FG)FG)为应用表达式为了清晰,表达式可以任加成对括号。演算公式举例x x 变量、公式、表达式。(x.(y)x)x.(y)x)函数,体内嵌入应用。(z.(y(z.x)z.(y(z.x)函数,体内嵌入应用,再次嵌入函数。(z.(z y)x)z.(z y)x)应用表达式。x.y.z.(x x.(u v)w)x.y.z.(x x.(u v)w)复杂表达式(4)(4)简略表示简略表示 缩写与变形表达 下例各表达均等效:a.b.c.z.E=abcz.E =(abcz).E =(a,b,c,z).E =a.(b.(c.(z.E)命名:以大写单字符或标识符命名其表达式 G=(x.(
6、y(yx)(x.(y(yx)(x.(y(yx)=(G G)=H由于演算中一切语义概念均用表达式表达。为了清晰采用命名替换使之更易读。T=x.y.x /逻辑真值F=x.y.y /逻辑假值1=x.y.x y /数12=x.y.x(x y)/数2zerop=n.n(x.F)T /判零函数注:zerop中的F、T可以用表达式展开形式语法形式语法核心的演算没有类型,没有顺序控制等概念,程序和数据没有区分。语法极简单::=|.|()|():=5.2.2 5.2.2 约束变量和自由变量约束变量和自由变量(x.(b x)x)x.(b x)x)自由变量 约束变量(x.y.(a x y)(b(y.(x y)表达式
7、中的作用域复盖(x.(x.(x x.(.(x x a)(a)(x x b)(b)(x x c)c))PMNROQ第1个x约束于P第2个x x约束于O第3个x x在M中自由,约束于O,P第4个x x在N中自由,约束于P第5个x x在R中自由,在Q中这5个x均约束出现,b,c自由出现。基本函数基本函数TRUE 和FALSE的表达式 T=x.y.x T=x.y.x F=x.y.y F=x.y.y整数的表达式:0=x.y.y 1=x.y.x y 2=x.y.x(x y)n=x.y.x(x(x y)n个基本操作函数 not=z.(zF)T)=z.(zx.y.y)(x.y.x)not=z.(zF)T)=z
8、.(zx.y.y)(x.y.x)and=a.b.(ab)F)=a.b.(ab)x.y.y)and=a.b.(ab)F)=a.b.(ab)x.y.y)or=a.b.(aT)b)=a.b.(a x.y.x)b)or=a.b.(aT)b)=a.b.(a x.y.x)b)以下是算术操作函数举例:+=+=add=x.y.a.b.(xa)(ya)b)add=x.y.a.b.(xa)(ya)b)*=multiply=x.y.a.(x(ya)*=multiply=x.y.a.(x(ya)*=sqr=x.y.(yx)*=sqr=x.y.(yx)identity=x.x /identity=x.x /同一函数同一
9、函数 succ=n.(x.y.nx(x y)/succ=n.(x.y.nx(x y)/后继函数后继函数zerop=n.n(x.F)T zerop=n.n(x.F)T =n.n(z.x.y.y)(x.y.y)/=n.n(z.x.y.y)(x.y.y)/判零判零 函数函数 例:例:3+43+4就写就写add 3 4add 3 4,add 3 add 3返回返回“加加3 3函数函数”应用到应用到4 4上当然就是上当然就是7 7。写全了是:。写全了是:(x.y.a.b.(x a)(y a)b)x.y.a.b.(x a)(y a)b))(p.q.(p(p(p q)(s.t.(s(s(s(s t)(p.q
10、.(p(p(p q)(s.t.(s(s(s(s t)a.b.(a(a(a(a(a(a(a b)a.b.(a(a(a(a(a(a(a b)归约与范式归约与范式归约将复杂的表达式化成简单形式,归约将复杂的表达式化成简单形式,即按一定的即按一定的规则对符号表达式进行置换。规则对符号表达式进行置换。例例:归约数归约数1 1的后继的后继 (succ 1)=(succ 1)=(nn.(x.y.n x(x y).(x.y.n x(x y)1 1)=(=(x.y.1 x(x y)x.y.1 x(x y)=(x.y.(=(x.y.(pp.q.p q).q.p q)x x(x y)(x y)=(=(x.y.(q.
11、x q)(x y)x.y.(q.x q)(x y)=(x.y.x(x y)=2 =(x.y.x(x y)=2注:注:succsucc和和1 1都是函数都是函数(1(1是常函数是常函数),第一步是,第一步是nn束定的束定的n n被被1 1置换。置换。展开后,展开后,x x置换置换p p,(xy)(xy)置换置换q q,最后一行不能再置换了,最后一行不能再置换了,它就是范式,它就是范式,语义语义为为2 2。(1 1)归约归约:归约的表达式是一个归约的表达式是一个应用表应用表达式达式(x.M N)x.M N),其左边子表达式是其左边子表达式是函数表函数表达式,右边是任意达式,右边是任意表达式。表达式
12、。归约以右边的归约以右边的表达式置换函数体表达式置换函数体M M中中指明的那个形参变量。指明的那个形参变量。形式地,我们用形式地,我们用 N/X,MN/X,M表示对(表示对(x.M Nx.M N)的的置换置换(规则(规则略)。略)。关键的问题是注意函数体中要置换的变量是否关键的问题是注意函数体中要置换的变量是否自由出现,如:自由出现,如:(x.x(x.(xy)(zz)x.x(x.(xy)(zz)=(zz)(x.(zz)y)=(zz)(x.(zz)y)/错误,第二错误,第二x x个非自由出现。个非自由出现。=(=(zz)(x.(xy)/zz)(x.(xy)/正确例例11-5 11-5 高层表示的
13、高层表示的归约归约(n.add n n)3n.add n n)3 =add 3 3 /3 =add 3 3 /3置换置换n n后取消后取消nn =6 =6(f.x.f(f x)(f.x.f(f x)succsucc 7 7 =x.succx.succ(succsucc x)7 x)7 =succsucc(succsucc 7)7)=succsucc(8)=9(8)=9注注:addadd,3 3,succsucc,7 7,9 9是为了清晰没进是为了清晰没进 一步展开为一步展开为表达式。表达式。但但归约有时并不能简化归约有时并不能简化,如如:(x.xx)(x.xx)x.xx)(x.xx),归约后仍
14、是原公式,归约后仍是原公式,这种这种表达式称为不可归约的。表达式称为不可归约的。对应为程序设对应为程序设计语言中的无限递归。计语言中的无限递归。(2)(2)归约是消除一层约束的归约归约是消除一层约束的归约:x.Fx=Fx.Fx=F (3)(3)换名换名:归约中如发生改变束定性质,归约中如发生改变束定性质,则允则允许换名许换名(后跟的变量名后跟的变量名),以保证原有束定以保证原有束定关系。关系。例如:例如:(x.(y.x)(z y)/(zy)x.(y.x)(z y)/(zy)中中y y是自由变量是自由变量 =y.(zy)/y.(zy)/此时此时(zy)zy)中中y y被束定了,被束定了,错误!错
15、误!=(=(x.(w.x)(zy)/x.(w.x)(zy)/因因(y.x)y.x)中函数体中函数体 无无y y,可换名可换名 =w.(zy)/w.(zy)/正确!正确!(4)(4)归约约定归约约定顺序顺序:每次归约只要找到可归约的子公式即可归每次归约只要找到可归约的子公式即可归约,约,演算没有规定顺序。演算没有规定顺序。范式范式:符号归约当施行(除符号归约当施行(除规则外)所有变换规则外)所有变换规则后没有新形式出现,则这种规则后没有新形式出现,则这种表达式叫范式。表达式叫范式。解释解释:范式即范式即演算的语义解释,演算的语义解释,形如形如 x xx x,(y(x.z)(y(x.z)就只能解释
16、为数据了就只能解释为数据了。上述基本函数均为范式,上述基本函数均为范式,在它的上面取上有意义在它的上面取上有意义的名字可以构成上一层的函数,的名字可以构成上一层的函数,如:如:pred=n.(subtract n 1)pred=n.(subtract n 1)(5)综合规约例题综合规约例题:以以演算规约演算规约3*23*2 3*2=*(3)(2)3*2=*(3)(2)=x.y.(y x)(3)(2)x.y.(y x)(3)(2)(y.(y 3)(2)(y.(y 3)(2)(2)3)(2)3)=(f.c.f(f c)(3)(f.c.f(f c)(3)c.(3(3 c)c.(3(3 c)=c.(f
17、.c.(f(f(f(c)(3 c)c.(f.c.(f(f(f(c)(3 c)/有有c c不能置换不能置换c c c.(f.z.(f(f(f(z)(3 c)c.(f.z.(f(f(f(z)(3 c)c.(z.(3 c)(3 c)(3 c)(z)c.(z.(3 c)(3 c)(3 c)(z)/再展再展3 3=c.z.(f.c.(f(f(f(c)c)(3c)(3c)(z)c.z.(f.c.(f(f(f(c)c)(3c)(3c)(z)c.z.(c.z.(f.w.(f(f(f(w)c)(3c)(3c)(z)f.w.(f(f(f(w)c)(3c)(3c)(z)c.z.(w.(c(c(c(w)(3c)(3c
18、)(z)c.z.(w.(c(c(c(w)(3c)(3c)(z)/同理展开第二个同理展开第二个c,c,第三个第三个c c=c.z.(w.(c(c(c(w)(p.(c(c(c(p)(c.z.(w.(c(c(c(w)(p.(c(c(c(p)(q.(c(c(c(q)(z)q.(c(c(c(q)(z)c.z.(w.(c(c(c(w)(c.z.(w.(c(c(c(w)(p.(c(c(c(p)(c(c(c(z)p.(c(c(c(p)(c(c(c(z)c.z.(w.(c(c(c(w)(c.z.(w.(c(c(c(w)(c(c(c(c(c(c(z)(c(c(c(c(c(c(z)c.z.(c(c(c(c(c(c(
19、c(c(c(z)=9 c.z.(c(c(c(c(c(c(c(c(c(z)=9增强增强演算演算只用最底层只用最底层演算是极其复杂的。用高层命名函数,语义演算是极其复杂的。用高层命名函数,语义清晰。不仅如此,保留一些常见关键字,语义更清晰。例清晰。不仅如此,保留一些常见关键字,语义更清晰。例如,我们可以定义一个如,我们可以定义一个if_then_elseif_then_else为名的函数:为名的函数:if_then_else=p.m.n.p m nif_then_else=p.m.n.p m n,当当p p为为 真真 时,时,执执行行m m否则为否则为n n。我们先验证其真伪。我们先验证其真伪。例
20、例:当条件表达式为真时当条件表达式为真时if_then_elseif_then_else函数的归约函数的归约(if_then_else)T M Nif_then_else)T M N=(p.m.n.p m n)T M N=(p.m.n.p m n)T M N=(m.n.(T m n)M N=(m.n.(T m n)M N=(m.n.(x.y.x)m n)M N=(m.n.(x.y.x)m n)M N=(m.n.(y.m)n)M N=(m.n.(y.m)n)M N=(m.n.m)M N=(m.n.m)M N=(n.M)N=(n.M)N=M=Mifif表达式表达式 可保留显式if-then-els
21、e形式:(if_then_else)E1 E2 E3=if E1 then E2 else E3 其中E1,E2,E3为表达式。Let/whereLet/where表达式表达式 如果有高阶函数:如果有高阶函数:(n.multiply n(n.multiply n(succsucc n)(add i 2)n)(add i 2)=multiply(add i 2)(multiply(add i 2)(succsucc(add i 2)(add i 2)/n n 和和 add i 2add i 2置换变元得置换变元得=multiply n(multiply n(succsucc n)/let n=a
22、dd i 2 in n)/let n=add i 2 in let a=b in E (a.E)b E where a=b let a=b in E (a.E)b E where a=b (f.E2)(x.E1)=let f=x.E1 in E2f.E2)(x.E1)=let f=x.E1 in E2 =let f x=E1 in E2 =let f x=E1 in E2其中形如其中形如f=x.E1f=x.E1的的x.x.可移向左边为可移向左边为f x=E1 f x=E1。如如:sqrsqr=n.multiply n n /=n.multiply n n /整个是整个是函数表达式函数表达式 s
23、qrsqr n=multiply n n /n=multiply n n /两应用表达式也相等两应用表达式也相等 letlet表达式在表达式在ML.LISPML.LISP中直接采用,中直接采用,MirandaMiranda用用wherewhere关键字使程序更好读,关键字使程序更好读,letlet直到直到E E完结构成一个程序块。完结构成一个程序块。MirandaMiranda只不过把只不过把wherewhere块放在块放在E E之后之后.元组表达式元组表达式一般情况下一般情况下n n元组是元组是p=(xp=(x1 1,x,x2 2,x xn n),),建立在建立在p p上上函数有:函数有:l
24、et f(xlet f(x1 1,x,x2 2,x xn n)=E1 in E2)=E1 in E2 let let fpfp=E1 in=E1 in let x let x1 1=first p in=first p in let x let x2 2=second p in=second p in .let let x xn n=n_thn_th p in E2 p in E2LambdaLambda演算演算关于关于LambdaLambda演算演算l 表达式表达式l自由变量(计算一个自由变量(计算一个 表达式的自由变量表达式的自由变量集合集合)l替换(计算)替换(计算)l变换规则变换规则
25、(三种变换)(三种变换)l归约归约 l范式(性质及其计算)范式(性质及其计算)关于关于LambdaLambda演算演算l 表达式表达式 一个一个 表达式表达式由变量名、抽象符号由变量名、抽象符号,.以及括号等符号以及括号等符号构成,构成,其语法为:其语法为::=|.|()关于关于LambdaLambda演算演算l变换规则变换规则 (三种变换)(三种变换)l 变换:设变换:设E是是 表达式,表达式,x是变量,则称下面变换为是变量,则称下面变换为变换变换(其中(其中y不在不在 FV(x.E)中)中)x.E-y.y/x E l 变换:设变换:设(x.E)和和E0为为 表达式,则称下面变换为表达式,则
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 程序设计语言 ppt 课件
限制150内