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。
我很难摆脱 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。