dafny : 微软推出的形式化验证语言
dafny是一种可验证的编程语言,由微软推出,现已经开源。
dafny能够自我验证,可以在VS Code中进行开发,在编辑算法时,写好前置条件和后置条件,dafny验证器就能实时验证算法是否正确。
在官方的例子中,以Abs绝对值函数来进行说明,代码如下:
点击查看代码
method Abs(x: int) returns(y: int)
ensures y >= 0 && (|| y == x || y == -x)
{
return if x > 0 then x else -x;
}
Abs是方法名,x为形参,类型为int, y为返回值,类型为int。
Abs没有前置条件,只有一个后置条件ensures y >= 0 && (|| y == x || y == -x),这样Abs返回值必须非负且y = x 或者 y = -x,定义了Abs的规约条件。
方法内就是具体的算法,根据x与0的比较,返回不同的值。
dafny语言里面有一个非常重要的后置条件写法,那就是loop。
下面举一个例子:
Verify the program in Algorithm 1. Note that you cannot change the existing implementation.
Algorithm 1 Find an element in array
点击查看代码
method Find(a: array<int>, v: int) returns(index: int)
ensures 0 <= index ==> index < a.Length && a[index] == v
ensures index < 0 ==> forall k :: 0 <= k < a.Length ==> a[k] != v
{
var i : int := 0;
while i < a.Length
invariant 0 <= i <= a.Length
invariant forall k :: 0 <= k < i ==> a[k] != v
{
if a[i] == v {
return i;
}
i := i + 1;
}
return -1;
}
这个算法是要找数组里面的某个数,找到了就返回下标,否则返回-1。
这个算法有两个后置条件,分比对应找到了目标值和没有找到目标值,
找到了目标值,返回为非负值,返回值必须小于数组长度且数组对应值与目标值相等。
ensures 0 <= index ==> index < a.Length && a[index] == v
没有找到目标值,返回为负值,这就意味着数组里的所有值与目标值都不相等。
ensures index < 0 ==> forall k :: 0 <= k < a.Length ==> a[k] != v
这种写法用了形式化语言进行了规约。
算法实现很简单,while循环需要增加后置条件,
一个是i的范围,i的初值为0,循环退出时,i的值为数组长度。
invariant 0 <= i <= a.Length
while循环的另外一个后置条件,对于i,数组i前面的数字都与目标值不相等。
invariant forall k :: 0 <= k < i ==> a[k] != v
while循环第二个后置条件,保障了Find函数第二个后置条件。
vscode的编辑器能实时验证算法是否正确,这对于编写dafny代码十分有利。
dafny : 微软推出的形式化验证语言的更多相关文章
- RChain的一键形式化验证:关于RCast 33 – LADL话题的讨论摘要
作者/Atticbee 在这一集,Greg和RChain的研究人员Isaac,Christian讨论了TLA(Temporal Logic of Actions)和RChain的LADL(Logic ...
- 微软推出中文学习AI助手Microsoft Learn Chinese
编者按:美国总统特朗普访华期间,他6岁的外孙女阿拉贝拉用中文普通话演唱和背诵传统诗歌的视频在中国社交媒体上引起广泛关注,可以感受得到,越来越多的人对中文学习充满了兴趣.智能私教微软小英帮助很多中国 ...
- 微软推出的免费新书《Introducing Microsoft SQL Server 2012》
微软推出的免费新书<Introducing Microsoft SQL Server 2012>,该书详细介绍微软SQL 2012数据库服务最新功能以及功能应用和使用技巧. 该书适合SQL ...
- 微软推出ASP.NET Core 2.0,并支持更新Visual Studio 2017
微软推出ASP.NET Core 2.0的一般可用性,并发布.NET Core 2.0.该公司还推出了其旗舰集成开发环境(IDE)的更新:Visual Studio 2017版本15.3和Visual ...
- 谷歌推出全新Android开发语言Sky:让App更流畅
土豆网同步更新:http://www.tudou.com/plcover/VHNh6ZopQ4E/ 使用HTML 创建Mac OS App 视频教程. 官方QQ群: (1)App实践出真知 434 ...
- 微软推出了Cloud Native Application Bundles和开源ONNX Runtime
微软的Microsoft Connect(); 2018年的开发者大会 对Azure和IoT Edge服务进行了大量更新; Windows Presentation Foundation,Window ...
- 微软推出首个Microsoft Azure Stack技术预览版
Mike Neil,微软公司企业云副总裁 怀着对于提高业务灵活性.加速创新的期待,很多企业正在向云平台迅速迁移.伴随着这样的趋势,我们也见证了微软智能云Azure业务在全球市场的快速增长--每个月近1 ...
- Needham-Schroeder协议的形式化描述语言
1.对TLS1.3协议形式化描述过程 第一步: Needham-Schroeder 过程的分析 常量和变量的定义: /* * Needham-Schroeder过程的形式化描述 */ // THE ...
- 微软云计算 Massive Data 处理语言Scope 1
Massive Data处理一直是云计算中很重要的一个环节.目前像Google,Yahoo在相关方面都有自己专有的技术.例如Google的基于MapReduce的Sawzall语言.和Yahoo基于H ...
- 微软推出全新的Windows终端应用程序
微软正推出一款名为Windows Terminal的新命令行应用程序.它被设计为访问PowerShell,cmd.exe和Windows子系统Linux(WSL)等环境的中心位置.微软正在为想要调整终 ...
随机推荐
- KingbaseES应对表年龄增长过快导致事务回卷
背景 前几天碰到这样一个场景,在KingbaseES数据库当作数据同步节点.其特点是接收过来的数据量巨大,其更新超级频繁,最大的数据库达到6TB.这还不是主要的,主要导致问题发生原因是同步数据库有很多 ...
- 全局索引与分区索引对于SQL性能影响的比较
KingbaseES 提供了对于分区表 global index 的支持.global index 不仅提供了对于唯一索引功能的改进(无需包含分区键),而且在性能上相比非global index (l ...
- KingbaseES R6 主备流复制集群创建级联复制案例
案例环境: 数据库: test=# select version(); version -------------------------------------------------------- ...
- android 逆向 smali手写helloworld
编写Hello.smali文件 .class public LHelloWorld; .super Ljava/lang/Object; .method public static main([Lja ...
- day36-IO流03
JavaIO流03 4.常用的类02 4.4节点流和处理流 4.4.1基本介绍 节点流可以从一个特定的数据源读写数据,如FileReader.FileWriter 数据源就是存放数据的地方,比如文件. ...
- 一文学会Spring JDBC 使用
Spring JDBC 1.JDBC JDBC 就是 数据库开发 操作的 代名词,因为只要是现代商业项目的开发那么一定是离不开 数据库 的,不管你搞的是什么,只要是想使用动态的开发结构,那么一定就是 ...
- WinForm完美实现Cefsharp-v49控件C#与JS交互,并且可加载运行flash
https://blog.csdn.net/zhao331863874/article/details/117328415
- DFS文件夹无法访问
最近DFS的文件服务器出现了部分文件和文件夹无法访问的情况.客户端直接访问DFS成员的共享文件夹时有是会出现Element not found的错误.有时打开文件的时候会出现文件不存在,或者你没有权限 ...
- Redis 的大 Key 对持久化有什么影响?
作者:小林coding 图解计算机基础(操作系统.计算机网络.计算机组成.数据库等)网站:https://xiaolincoding.com 大家好,我是小林. 上周有位读者字节一二面时,被问到:Re ...
- Alertmanager篇
报一直是整个监控系统中的重要组成部分,Prometheus监控系统中,采集与警报是分离的.警报规则在 Prometheus 定义,警报规则触发以后,才会将信息转发到给独立的组件 Alertmanage ...