我正在编写一种方法“ 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的新手,因此非常感谢所有提示/指针!