Dafny Dafny
首页
  • 入门介绍

    • 什么是dafny?
  • 用起来吧!

    • 安装
    • 快速上手
    • 可能遇到的问题?
  • Dafny快速入门

    • 基础学习 Basic
    • 方法 Method
    • 关键字 Keyword
    • 函数 Function
    • 类 Class
    • 泛型 Generics
    • 声明 Statement
    • 表达式 Expression
  • Dafny简单例子

    • 寻找最大最小数和
    • 斐波那契数列
    • 线性查询
    • 引理-计算序列非负元素个数
    • 集合
    • 终止
  • Dafny指导

    • 介绍
    • 方法 Methods
    • 前置/后置条件 Pre/Postconditions
    • 断言 Assertions
    • 函数 Functions
    • 循环不变体 Loop Invariants
    • 数组 Arrays
    • 量词(函数) Quantifiers
    • 谓词(函数) Predicates
    • 框架 Framing
    • 二分搜索 Binary Search
    • 总结
  • Dafny进阶语法

    • 引理和归纳 Lemmas and Induction
    • 模块 Modules
    • 集合 sets
    • 序列 sequence
    • 终止 Terminal
    • 值类型 Values Types
  • 实践探索

    • 自动归纳
    • 自动调用引理
    • 定义、证明、算法正确性
    • 各种推导式
    • 不同类型的证明
    • 集合元素上的函数
    • 在集合上的迭代
  • 常用工具

    • Type System
    • Style Guide
    • Cheet Sheet
✨收藏
  • 简体中文
  • English
💬社区留言板
GitHub (opens new window)

Dafny

新一代验证语言
首页
  • 入门介绍

    • 什么是dafny?
  • 用起来吧!

    • 安装
    • 快速上手
    • 可能遇到的问题?
  • Dafny快速入门

    • 基础学习 Basic
    • 方法 Method
    • 关键字 Keyword
    • 函数 Function
    • 类 Class
    • 泛型 Generics
    • 声明 Statement
    • 表达式 Expression
  • Dafny简单例子

    • 寻找最大最小数和
    • 斐波那契数列
    • 线性查询
    • 引理-计算序列非负元素个数
    • 集合
    • 终止
  • Dafny指导

    • 介绍
    • 方法 Methods
    • 前置/后置条件 Pre/Postconditions
    • 断言 Assertions
    • 函数 Functions
    • 循环不变体 Loop Invariants
    • 数组 Arrays
    • 量词(函数) Quantifiers
    • 谓词(函数) Predicates
    • 框架 Framing
    • 二分搜索 Binary Search
    • 总结
  • Dafny进阶语法

    • 引理和归纳 Lemmas and Induction
    • 模块 Modules
    • 集合 sets
    • 序列 sequence
    • 终止 Terminal
    • 值类型 Values Types
  • 实践探索

    • 自动归纳
    • 自动调用引理
    • 定义、证明、算法正确性
    • 各种推导式
    • 不同类型的证明
    • 集合元素上的函数
    • 在集合上的迭代
  • 常用工具

    • Type System
    • Style Guide
    • Cheet Sheet
✨收藏
  • 简体中文
  • English
💬社区留言板
GitHub (opens new window)
  • Dafny教程

    • 介绍
    • 方法
    • 前置和后置条件
    • 断言
    • 函数
    • 循环不变式
    • 终止
    • 数组
    • 量词
    • 谓词
    • 框架
    • 二分查找
    • 结论
  • Dafny进阶语法

  • 教程
  • Dafny教程
lijiahai
2022-03-25

数组

# 数组

我们所考虑的一切对于简单的函数和少量的数学练习来说都很好,但是对于真正的程序来说却毫无帮助。到目前为止,我们一次只考虑了局部变量中的几个值。现在我们把注意力转向数据数组。数组是语言的内置部分,有自己的类型array<T>,其中T是另一种类型。现在我们只考虑整数数组,array<int>。数组可以为null,并有一个内置的长度字段a. length。元素访问使用标准的括号语法,并从0开始索引,所以a[3]前面是3个元素 a[0],a[1]和a[2],按这个顺序。所有的数组访问必须被证明在边界内,这是Dafny无运行时错误安全保证的一部分。因为边界检查是在验证时验证的,所以不需要进行运行时检查。要创建一个新数组,它必须使用new关键字进行分配,但目前我们只使用以先前分配的数组为参数的方法。(有关分配的更多信息,请参阅内存教程。) 对于一个数组,我们可能想要做的最基本的事情之一是在数组中搜索一个特定的键,并返回一个位置的索引,如果键存在,我们可以找到它。我们有两个搜索结果,每个结果都有不同的正确性条件。如果算法返回一个索引(即非负整数),那么该键应该存在于该索引处。这可以表示为:

method Find(a: array<int>, key: int) returns (index: int)
   ensures 0 <= index ==> index < a.Length && a[index] == key
{
   // Can you write code that satisfies the postcondition?
   // Hint: you can do it with one statement.
}
method Find(a: array<int>, key: int) returns (index: int)
   ensures 0 <= index ==> index < a.Length && a[index] == key
{
   // Open in editor for a challenge...
}
1
2
3
4
5
6
7
8
9
10
11

这里的数组索引是安全的,因为隐含操作符是短路。短路意味着如果左部分为假,那么不管第二部分的真值是多少,暗示已经为真,因此不需要求值。使用隐含运算符的短路特性,以及布尔值and(&&),这也是一种短路,是Dafny的常见实践。条件index < a. length是必要的,否则该方法可能返回一个大整数,而不是数组的下标。总之,短路行为意味着当时间控制到达数组访问时,index必须是一个有效的索引。 如果该键不在数组中,那么我们希望方法返回一个负数。在这个例子中,我们想说这个方法没有丢失一个键的出现;换句话说,这个键不在数组中。为了表达这个属性,我们求助于另一个常用的Dafny工具:量词。

编辑 (opens new window)
上次更新: 2022/03/26, 19:35:15
终止
量词

← 终止 量词→

最近更新
01
寻找最大和最小数
04-06
02
斐波那契数列
04-06
03
线性查询
04-06
更多文章>
Theme by Vdoing | Copyright © 2022-2022 Li Jiahai | Dafny Community | 2022
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式