如何解决对于Dafny中的数组,olda [0]和olda[0]之间有什么区别
对于Dafny中的数组,old(a[0])
和old(a)[0]
有什么区别?
一种方法通过将1添加到第一个元素来修改数组'a'。在该方法结束时,old(a[0])
和old(a)[0]
的值是什么?
解决方法
好问题!是的,它们是不同的。
在old
内对表达式求值时,其所有堆取消引用都在方法开始时引用堆。不是堆取消引用的所有内容都不会受到old
的影响。
在您的示例中,a[0]
是堆的解除引用,因此old(a[0])
获取旧堆中a
“指向”的数组的第0个值。
但是,a
本身并不是堆取消引用,它只是值永远不变的局部函数的参数。 old(a) == a
这样。考虑这一点的一种方法是a
存储数组的“地址”,并且该地址在方法的整个生命周期内都不会改变。
现在我们知道old(a) == a
,紧随其后的是old(a)[0] == a[0]
。换句话说,old
在第二个示例中无效。
这是一个演示的小例子:
method M(a: array<int>)
requires a.Length >= 2
requires a[0] == 1
modifies a
ensures a[1] == old(a[0]) // so far so good
ensures old(a) == a // perhaps surprising: Dafny proves this!
ensures a[1] == old(a)[0] // but this is not necessarily true,// because old(a)[0] actually means the same thing as a[0]
{
a[1] := 1;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。