Dafny语言中的属性系统详解

Dafny语言中的属性系统详解

dafny Dafny is a verification-aware programming language dafny 项目地址: https://gitcode.com/gh_mirrors/da/dafny

概述

Dafny语言提供了一套强大的属性系统,允许开发者为各种语言实体添加元数据注解。这些属性以{:}包裹,可以包含属性名称和可选参数列表。属性系统是Dafny元编程能力的重要组成部分,能够影响代码的验证、编译和行为。

属性语法基础

属性声明遵循以下基本语法格式:

{:attributeName "参数1", "参数2" + "参数3", 57}

关键特点:

  • 属性名后可以跟逗号分隔的表达式列表
  • 表达式会在属性出现的上下文中进行解析和类型检查
  • 任何Dafny实体都可以附加属性列表
  • Dafny不会检查属性是否适合其所修饰的实体(拼写错误可能被静默忽略)

属性分类与应用

1. 顶层声明属性

1.1 {:autocontracts} 自动合约

动态帧(Dynamic frames)是可以在程序执行期间动态变化的帧表达式。{:autocontracts}是一个实验性特性,能够自动为类填充动态帧的样板代码。

使用方式:

  1. {:autocontracts}标记类
  2. 声明一个名为Valid()的函数或谓词

系统会自动:

  • 添加ghost var Repr: set<object>声明
  • Valid()函数插入reads子句
  • Valid()函数体中插入各种验证条件
  • 为构造函数和方法添加规范的修改和确保条款
1.2 {:nativeType} 原生类型

仅适用于基于整型或实型的newtype声明,用于指定底层原生类型。支持多种形式:

newtype {:nativeType "byte"} ubyte = x : int | 0 <= x < 256

可用类型包括:"byte"、"sbyte"、"ushort"、"short"、"uint"、"int"、"number"、"ulong"、"long"等。

1.3 {:extern} 外部声明

用于修改编译名称和引用名称,处理外部抽象类型定义。常见用途是避免与现有库函数名称冲突。

格式:

  • {:extern}:使用Dafny名称
  • {:extern s1}:使用s1作为编译名称
  • {:extern s1, s2}:使用s2作为编译名称,s1.s2作为引用名称

2. 函数和方法属性

2.1 {:abstemious} 节制函数

适用于共数据类型(codatatype)上的函数,有助于证明函数是"productive"的。

2.2 {:autoReq} 自动需求

自动强化函数的requires子句,使其能够调用所需的其他函数。

2.3 {:axiom} 公理

标记函数或方法,表示可以无需证明就假设其后置条件为真。函数体可以省略。

2.4 {:fuel} 燃料控制

控制验证器展开函数定义的次数。格式:

{:fuel 函数名,最低燃料,最高燃料}

递归函数默认燃料设置为1,2。增加燃料值可以使某些证明更容易通过,但会延长验证时间。

2.5 {:induction} 归纳法

控制归纳证明的应用,可用于方法和量词表达式。支持多种形式:

{:induction}          // 对所有绑定变量应用归纳
{:induction false}    // 禁用归纳
{:induction x,y}      // 对指定变量应用归纳
2.6 {:print} 打印效果

声明方法可能有打印效果(使用print语句或调用有打印效果的方法)。仅在启用--track-print-effects时强制执行。

2.7 {:resource_limit} 资源限制

限制验证方法或函数时使用的资源量。等效于命令行选项--resource-limit N

特殊用途属性

{:only} 独占验证

临时禁用文件中所有其他非{:only}成员的验证,专注于特定成员。会发出警告,因为它应该是临时构造。

{:concurrent} 并发标记

表示编译后的函数或方法可以并发执行。目前要求规格中包含等效的reads {}modifies {},确保不读写任何共享可变状态。

{:verify} 验证控制

控制是否验证声明。{:verify false}会完全跳过验证,而{:axiom}仍会验证前置条件、后置条件和函数体的良构性。

最佳实践

  1. 谨慎使用{:axiom}:虽然可以跳过验证,但可能导致不一致的规范
  2. 合理设置{:fuel}:过高的燃料值会延长验证时间
  3. 善用{:only}调试:专注于当前开发的功能模块
  4. {:extern}命名规范:遵循目标语言的命名约定
  5. {:autocontracts}实验性:了解其自动生成的合约内容

总结

Dafny的属性系统提供了丰富的元编程能力,从验证控制到编译行为调整,再到特殊语言特性的支持。理解并合理使用这些属性,可以显著提高开发效率和验证成功率。每种属性都有其特定的应用场景和注意事项,开发者应根据具体需求选择适当的属性组合。

dafny Dafny is a verification-aware programming language dafny 项目地址: https://gitcode.com/gh_mirrors/da/dafny

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

俞淑瑜Sally

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值