Dafny学习

本文介绍Dafny语言及其程序验证工具,通过实例演示如何确保代码功能正确性。从基本验证方法到复杂冒泡排序算法的验证,展示了Dafny在软件正确性验证中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Dafny

​ Dafny: A Language and Program Verifier for Functional Correctness

​ Dafny是用来更好的写出正确代码的语言

​ 最简单的方法是在 这里 在线的进行程序验证

​ 下边看几个例子

  • 简单的验证

    method Add(x:int,y:int) returns (r:int)
      requires 0 <= x && 0 <= y
      ensures r == 2*x+y
      {
        r:=x;
        var n:=y;
        while n != 0
            invariant r == x+y-n && 0 <= n
              {
                r := r + 1;
                n := n - 1;
              }
      }

    显然ensures r == 2 * x + y 这里不成立,rise4fun 报出这样的错误

    Error BP5003: A postcondition might not hold on this return path

    Related location: This is the postcondition that might not hold.

    证明程序不正确

    给他修改过后,则显示

    Dafny program verifier finished with 1 verified, 0 errors

    这证明程序是正确的。

  • 简单的例子

  • method Abs(x:int) returns (y:int)
      {
          if x < 0
          {return -x;}
          else
          {return x;}
      }
method MultipleReturns(x:int,y:int) returns (more:int,less:int)
    {
        more:=x+y;
        less:=x-y;
    }
  • /*导师发的验证冒泡排序的例子*/
    predicate sorted_range(a: array<int>,l:nat,u:nat)
      requires a != null
      requires 0 <= l <= u <= a.Length;
      reads a;
    {
      forall i,j :: l <= i < j < u ==> a[i] <= a[j]
    }
    predicate pivot(a: array<int>, pv: nat,l:nat,up:nat)
      requires a!=null
      reauires 0 <= l <= pv <= up <= a.Length;
    reads a;
    {
      forall u,v :: l <= u < pv < v < up ==> a[u] <= a[v]
    }
    
    method bubbleSort(a:array<int>)
      requires a != null && a.Length > 1;
    ensures sorted_range(a,0,a.Length);
    ensures multiset(a[..]) == multiset(old(a[..]));
    modifies a;
    {
      var i:nat:=1;
      while(i < a.Length)
          invariant i <= a.Length;
        invariant sorted_range(a,0,i);
          invariant multiset(a[..]) == multiset(old(a[..]));
      {
          var j:nat:=1;
          var swapped::bool:=a[j-1]>a[j];
          while(j>0&&swapped == true)
              invariant 0 <= j <= i;
            invariant sorted_range(a,0,j);
            invariant sorted_range(a,j,i+1);
            invariant pivot(a,j,0,i+1);
              invariant multiset(a[..]) == mulitset(old(a[..]));
            invariant swapped == true && j>0==>a[j-1] > a[j];
            invariant swapped == false && j>0==>a[j-1] <= a[j];
          {
              var temp:int:=a[j-1];
              a[j-1]:=a[j];
              a[j]:=tmp;
              j:=j-1;
              if j > 0{
                  if(a[j-1]>a[j]){
                      swapped := true;
                  }
                  else{
                    swapped := false;
                  }
              }
          }
          i:=i+1;
      }
    }
    

    这个冒泡排序验证看得不是太懂, 很懵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值