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快速入门

  • 简单例子

    • 寻找最大和最小数
    • 斐波那契数列
    • 线性查询
    • 引理-计算序列中非负元素的个数
    • 集合
    • 终止
  • 指南
  • 简单例子
lijiahai
2022-04-06

线性查询

# 线性查询

输入一个整型数组和一个整数key,返回该数组中等于key的元素所在的位置,显然数组的下标从0开始。

算法上,直接遍历该数组,判断当前元素是否等于key即可,若等于则程序返回,所得的n就是要求的位置,若不等于则往后寻找。

method LinearSearch(a: array<int>, key: int) returns (n: nat)   
ensures 0 <= n <= a.Length
ensures n == a.Length || a[n] == key
{
    n := 0;
    while n < a.Length
    invariant n <= a.Length
    decreases a.Length - n      //需保证该表达式递减且不小于0
    {
        if a[n] == key 
        {
            return;
        }
        n := n + 1;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

容易想到,n的数值是大于等于0的整数,且不能超过数组的长度,否则产生越界问题,所以要有ensures 0 <= n <= a.Length。

其次,程序返回的条件要么是找到了对应的位置,查找成功;要么是n的值达到了数组的长度还没有找到相应元素,查找失败。因此要有ensures n == a.Length || a[n] == key

函数主体部分,我们在遍历时使用的是while语句,这里涉及到循环不变体invariant的使用,Dafny在执行循环时每次都会判断循环不变体是否满足条件,以判断循环内是否有错误,因此我们加上invariant n <= a.Length是更严谨的做法。同时,由于每次循环后n增大,需要加上decreases a.Length - n保证数组长度 - n是减小的,同时不会比0小。

编辑 (opens new window)
#教学例子
上次更新: 2022/04/06, 20:36:17
斐波那契数列
引理-计算序列中非负元素的个数

← 斐波那契数列 引理-计算序列中非负元素的个数→

最近更新
01
寻找最大和最小数
04-06
02
斐波那契数列
04-06
03
引理-计算序列中非负元素的个数
04-06
更多文章>
Theme by Vdoing | Copyright © 2022-2022 Li Jiahai | Dafny Community | 2022
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式