You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
}

代码说明

  1. 前置条件:requires s != []避免处理空序列的无意义场景,Dafny会在编译阶段检查调用该函数的输入是否符合要求。
  2. 初始化逻辑:用int.MaxValue作为初始最小值,保证序列的第一个元素必然会更新这个值,后续迭代逐步筛选出更小的元素。
  3. 循环不变式:用于辅助Dafny验证循环的正确性,确保每次迭代后currentMin始终是已遍历部分的最小值。
  4. 后置条件:明确函数的输出特性,让Dafny自动验证返回值确实是序列的最小值。

内容的提问来源于stack exchange,提问作者Montserrat Hermo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:27:52