修改已更改对象的子句错误
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
.
之前分配的任何对象都不相同
我如何声明(在 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
.