Dafny-不知道为什么在调用计算数组是否包含元素的方法后断言不成立

时间:2019-10-24 10:53:34

标签: assert dafny

我正在编写一种方法“ Clean”,该方法可以查明所提供的数组是“干净”的所提供键,还是该数组中没有元素。因此,如果没有出现,则返回true,如果有多个出现之一,则返回false。这是我的代码:

method Clean(a: array<int>, key: int) returns(clean: bool)
ensures clean == false ==> exists k :: 0 <= k < a.Length && a[k]==key
ensures clean == true ==> forall k :: 0<=k<a.Length ==> a[k]!=key
{
    clean:=true;
    var i : int := 0;
    while i < a.Length
    invariant 0 <= i <= a.Length
    invariant forall k:: 0 <= k < i ==> a[k] != key
    {
        if a[i] == key 
        { 
            assert(exists k :: 0 <= k < a.Length && a[k]==key);
            clean := false;
            return; 
        }
        i:=i+1;
    }
    return;
}

method Test()
{
  var find: bool := false;
  var arr1 := new int[5];
  var key : int := 1;

  arr1[0],arr1[1],arr1[2],arr1[3],arr1[4] := 1,2,2,2,3;
  find := Clean(arr1, key);
  assert (find == false);
}

Clean方法本身不会产生任何错误。但是,当我创建一个测试函数以调用Clean时,在Clean返回true的所有情况下都必须使用assert语句,但是在Clean返回false且我不知道它来自哪里的情况下,断言将永远不成立。

我是Dafny的新手,因此非常感谢所有提示/指针!

0 个答案:

没有答案