修改已更改对象的子句错误

Modifies clause error on a changed object

我如何声明(在 Dafny 中)一个“确保”gua运行tee 方法返回的对象将是 "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;
  }


}

doeswork”函数编译(并验证)正确,但另一个函数不正确,因为 Dafny 编译器无法知道“newArray”函数是新函数,即不需要在“doesnotwork”函数的 "require" 语句中列为可修改的,以便该函数满足仅修改“this”的要求。在“doeswork”函数中,我简单地插入了“newArray”函数的定义,然后它就起作用了

上面的例子可以在https://rise4fun.com/Dafny/hHWwr下找到,也可以在运行网上找到。

谢谢!

你可以在 newArray 上说 ensures fresh(b)

fresh 的意思正是您所描述的:该对象与调用 newArray.

之前分配的任何对象都不相同