Dafny 3是否存在最大/最小int常量?如何编写序列最小值程序?
Dafny 3整数极值常量及序列最小值实现
整数极值常量
Dafny 3内置了整数类型的最大、最小值常量,用法和你提到的int.MaxValue形式完全一致:
- 整数最大值:
int.MaxValue - 整数最小值:
int.MinValue
这些是语言原生支持的常量,可直接在代码中引用,无需额外定义。
计算序列最小值的程序
以下是借助int.MaxValue实现的序列最小值计算代码,包含确保正确性的规约逻辑:
method Main() { let testSequence := [5, -3, 8, 0, -10, 4]; let minResult := FindSequenceMin(testSequence); print "序列的最小值为: ", minResult, "\n"; } function FindSequenceMin(s: seq<int>): int requires s != [] // 约束输入序列非空 ensures forall idx: nat :: idx < |s| ==> result <= s[idx] // 返回值小于等于所有元素 ensures exists idx: nat :: idx < |s| && result == s[idx] // 返回值是序列中的某一元素 { var currentMin := int.MaxValue; var i := 0; while i < |s| invariant 0 <= i <= |s| invariant forall j: nat :: j < i ==> currentMin <= s[j] { if s[i] < currentMin { currentMin := s[i]; } i := i + 1; } currentMin }
代码说明
- 前置条件:
requires s != []避免处理空序列的无意义场景,Dafny会在编译阶段检查调用该函数的输入是否符合要求。 - 初始化逻辑:用
int.MaxValue作为初始最小值,保证序列的第一个元素必然会更新这个值,后续迭代逐步筛选出更小的元素。 - 循环不变式:用于辅助Dafny验证循环的正确性,确保每次迭代后
currentMin始终是已遍历部分的最小值。 - 后置条件:明确函数的输出特性,让Dafny自动验证返回值确实是序列的最小值。
内容的提问来源于stack exchange,提问作者Montserrat Hermo
相关产品推荐
相关产品推荐

