Dafny 上下文修改子句错误

Dafny context modifies clause error

我很难摆脱 Dafny 程序中的最后一个错误。有人能指出我正确的方向吗? 这是代码:http://rise4fun.com/Dafny/2FPo

我收到此错误:赋值可能会更新不在封闭上下文的修改子句中的数组元素

我尝试在 merge 方法中添加修改矩形(即使我很确定它已经包含在 modifies this 中)但这只会在 merge 方法调用中产生类似的错误。

我真的迷失在这一点上。感谢帮助

问题是 "modifies this" 允许修改 this 的 字段 ,而不是修改那些字段指向的内容。换句话说,如果该方法正在做:

this.rectangles := new_rectangle_array;

但如果它正在做就不会:

this.rectangles[3] := new_rect;

所以,在你有 "modifies this" 的地方你应该有 "modifies rectangles".

同理,Test需要注解"modifies c.rectangles",而不是"modifies c"。

最后,为了让 Dafny 相信可以调用 Test,您需要为 Couverture 的构造函数提供一个 post 条件来约束矩形字段。否则,验证者无法确定是否可以调用 Test:据验证者所知,couv 可能包含一些 Main 不允许修改的随机数组。

有关完整代码,请参阅 http://rise4fun.com/Dafny/Skrg