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

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

  • 指南
  • Dafny快速入门
lijiahai
2022-03-26

函数 Function

# 函数 function

函数具有以下形式:

function F(a: A, b: B, c: C): T
  requires Pre  //前置条件pre
  reads Frame	//框架frame
  ensures Post //后置条件post
  decreases TerminationMetric //变体函数
{
  Body	//函数体
}
1
2
3
4
5
6
7
8
  • a, b, c : 输入的形参,
  • T : 返回结果的类型,
  • Pre: 表示函数前提条件的布尔表达式,
  • Frame: 函数体body需要的对象列表
  • Post: 函数的后置条件布尔表达式
  • TerminationMetric: 变体函数
  • Body: 定义函数的表达式。

前置条件允许函数是部分的(只用前置就行不用写后置),即前置条件表示函数何时定义,并且 Dafny 会验证函数的每次使用都满足前置条件。

通常不需要后置条件,因为函数在函数体内已经给出了完整的定义。

例如:

(写个后置加个保险也行,一般后置就是声明该函数的基本属性,比如Factorial这个函数所有数字都≥1)

function Factorial(n: int): int
 requires 0 <= n //前置条件pre

 ensures 1 <= Factorial(n) //后置条件post

{
 if n == 0 then 1 else Factorial(n-1) * n //函数体body
}
1
2
3
4
5
6
7
8

要在后置条件中引用函数的结果,请使用函数本身的名称,如示例中所示。

默认情况下,函数是ghost,不能从可执行(非ghost)代码中调用。

为了使它从ghost变成非ghost,用关键字function method替换 function.

一个返回布尔值的函数可以用关键字声明,然后省略冒号和返回类型。

如果函数或方法被声明为类class成员,则它具有隐式接收器参数 this。可以通过在声明之前加上关键字 static 来删除此参数。

类 C 中的静态函数 F 可以被 C.F(...) 调用。

编辑 (opens new window)
上次更新: 2022/03/26, 14:38:56
关键字 Keyword
类 Class

← 关键字 Keyword 类 Class→

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