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

方法

# 方法

Dafny在许多方面类似于典型的命令式编程语言。有方法、变量、类型、循环、if语句、数组、整数等等。任何Dafny程序的基本单元之一就是方法。方法是一段命令式的、可执行的代码。在其他语言中,它们可能被称为过程或函数,但在Dafny中,函数这个术语是为一个不同的概念保留的,我们稍后将讨论这个概念。方法的声明方式如下:

method Abs(x: int) returns (y: int)
{
   ...
}
1
2
3
4

它声明了一个名为Abs的方法,它接受一个名为x的整数参数,并返回一个名为y的整数。请注意,每个参数和返回值都需要类型,并在每个名称后面跟一个冒号(:)。同样,返回值是命名的,并且可以有多个返回值,如下所示:

method MultipleReturns(x: int, y: int) returns (more: int, less: int)
{
   ...
}
1
2
3
4

方法主体是包含在大括号中的代码,到目前为止,它被简明地表示为 ... (这不是Dafny的语法). 主体由一系列语句组成,例如熟悉的命令式赋值, if语句, 循环,其他方法调用, return语句等等。例如, MultipleReturns方法可以声明为:

method MultipleReturns(x: int, y: int) returns (more: int, less: int)
{
   more := x + y;
   less := x - y;
   // comments: are not strictly necessary.
   /* unless you want to keep your sanity. */
}
method MultipleReturns(x: int, y: int) returns (more: int, less: int)
{
   more := x + y;
   less := x - y;
   // comments: are not strictly necessary.
}
1
2
3
4
5
6
7
8
9
10
11
12
13

赋值不使用=, 而是使用:=. (事实上Dafny使用 == 表示相等, Dafny的表达式中没有使用单个的等号。) 简单语句后面必须有分号,空格和注释 (//和 /**/) 将会被忽略. 为了从方法中返回值, 该值在return语句之前的某个时间被分配给一个指定的返回值。实际上,返回值的行为非常类似于局部变量,并且可以被赋值不止一次。但是,输入参数是只读的。return语句用于在到达方法的主体块结束之前返回。return语句可以只是return关键字 (其中使用了out参数的当前值), 也可以获取要返回的值列表。也有复合语句,如if语句。if语句不需要在布尔条件周围加上括号,其作用正如人们所期望的那样:

method Abs(x: int) returns (y: int)
{
   if x < 0 {
      return -x;
   } else {
      return x;
   }
}
1
2
3
4
5
6
7
8

需要注意的是,它们总是需要在分支周围使用大括号,即使分支只包含一个语句(复合语句或其他语句)。这里的if语句使用熟悉的比较运算符语法检查x是否小于零,并返回适当的绝对值。(其他比较运算符 <=, >, >=, !=和==, 具有预期的含义。有关操作符的更多信息,请参见参考资料。)

编辑 (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
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式