网站大量收购闲置独家精品文档,联系QQ:2885784924

函数式编程语言编程与程序验证.ppt

  1. 1、本文档共33页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
函数式编程语言编程与程序验证

* * * * * * * * * * * * * * * 函数式语言SML及编程简介 例6(表类型)插入排序 fun insert(x, [ ]) : real list = [ x ] | insert(x, y :: ys) = if x = y then x :: y :: ys else y :: insert(x, ys); val insert = fn : real ? real list - real list 排序需要用到两个变元的比较运算,关系运算“=”不是多态的,因此insert不是多态函数 在第1行上给出函数的结果类型就是为了避免类型推断出现错误 函数式语言SML及编程简介 例7(表类型)基于表的一个高阶函数 fun map f [ ] = [ ] | map f (x :: xs) = (f x) :: map f xs; val map = fn : (?a - ?b) - (?a list - ?b list) 算子map把函数 f 应用到表的每个元素上,即 map f [x1, …, xn] = [f x1, …, f xn] map f的结果是一个新函数 函数式语言SML及编程简介 例8 静态作用域(静态绑定) let val x = 2 fun f y = x + y /* x是函数f的非局部变量*/ fun F (g, x) = g 2 in F(f, 1) 按静态作用域和动态作用域,结果分别为4和3 f函数所引用的x绑定到2,这样的绑定成为f的环境 在计算F(f, 1)时,必须把f和它的环境ef一起传递,以保证f不管在何处计算都有正确的计算环境 二元组(f, ef) 称为闭包,是语言实现中的概念 函数式语言SML的模块系统 模块化关心的是程序的组织,而不是计算本身,模块 化结构使得程序易于理解、编写和维护等 SML模块所涉及的主要构造是结构、基调和函子 结构:由一组类型、值和结构的声明组成 基调:是结构的“类型”或“界面”,规范结构必须包含的声明 函子:从结构到结构的函数 类比:(模块化) 结构 ~(核心语言) 值 基调 ~ 类型 函子 ~ 函数 函数式语言SML的模块系统 例9:使用模块系统的一个简单例子 signature SIG = /* 描述有类型t和值x的结构类 */ sig type t val x : t end; structure S : SIG = /* 符合上述基调的一个结构*/ struct type t = int val x : t = 3 end; 可以用基调来规范结构的部分成员 函数式语言SML的模块系统 例9:使用模块系统的一个简单例子 structure S : SIG = /* 符合上页基调的一个结构*/ struct type t = int val x : t = 3 end; functor F(S : SIG) : SIG = struct type t = S.t ? S.t val x : t = (S.x, S.x) end 函数式程序的验证 程序验证就是证明程序具有所期望的性质,它是提高软件可信程度的重要方法 1、模型检测 通过遍历系统所有状态空间,能够对有穷状态系统进行自动验证,并自动构造不满足验证性质的反例 问题:难以解决状态空间爆炸问题,不能输出显式的证据 2、形式程序验证(formal program verification) 命令式语言的程序验证起源于Hoare逻辑 函数式程序验证因不涉及程序状态,要简单得多 函数式程序的验证 例10:用数学归纳法验证计算阶乘的函数 fun facti(n, p) = if n = 0 then p else facti(n -1, n * p); 要证明的性质是?p. facti(n, p) = n! ? p 1、基本情况,要证?p. facti(0, p) = 0! ? p 因为facti(0, p) = p = 1 ? p = 0! ? p,成立 2、归纳步骤,要证?p. facti(n+1, p) = (n+1)! ? p facti(n+1, p) = facti(n, (n+1) * p) [facti] = n! ? ((n+1) ? p) [归纳假设] = (n! ? (n+1)) ? p [结合律] = (n+1)! ? p [阶乘] 和已经熟悉的证明方式没

您可能关注的文档

文档评论(0)

haowendangqw + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档