我如何(在Dafny中)说明" 确保"保证方法返回的对象是" new",即与其他地方(尚未)使用的对象不一样?
以下代码显示了一个最小的示例:
method newArray(a:array<int>) returns (b:array<int>)
requires a != null
ensures b != null
ensures a != b
ensures b.Length == a.Length+1
{
b := new int[a.Length+1];
}
class Testing {
var test : array<int>;
method doesnotwork()
requires this.test!=null
requires this.test.Length > 10;
modifies this
{
this.test := newArray(this.test); //change array a with b
this.test[3] := 9; //error modifies clause
}
method doeswork()
requires this.test!=null
requires this.test.Length > 10;
modifies this
{
this.test := new int[this.test.Length+1];
this.test[3] := 9;
}
}
&#34; 做工作&#34;函数正确编译(和验证),但另一个没有,因为Dafny编译器无法知道&#34; newArray &#34;返回的对象。功能是新的,即,不需要在&#34;要求&#34;中列出可修改的功能。 &#34; 的声明
您可以在https://rise4fun.com/Dafny/hHWwr下找到上面的示例,也可以在线运行。
谢谢!
答案 0 :(得分:3)
您可以在ensures fresh(b)
上说newArray
。
fresh
表示您所描述的内容:该对象与调用newArray
之前分配的任何对象不同。