我正在尝试在Dafny中验证我的代码,但我遇到了一个问题: 我有一个迭代序列并更改它的方法。该方法根据序列中的元素改变序列。我想添加一个像这样的帖子条件:“如果序列中的元素是X,那么应该发生一些事情”。问题是该方法改变了集合(添加元素等),我想检查原始序列的条件。在达菲尼有这种优雅的方式吗? (我现在能想到的唯一方法是保持序列原始状态的全局变量,但我正在寻找正确的方法)。
代码示例:
method changeSeq(p: class1, s: seq<class1>)
ensures |s| == 10 ==> p in s
{
if (|s| == 10){
s := s + [p];
}
}
在代码中,我希望post条件检查原始s stat,而不是我们更改后的stat。
答案 0 :(得分:2)
您可以将old
用于s == old(s)
等变量的旧值。
以下是一个示例:http://rise4fun.com/Dafny/fhQgD
来自Dafny Documentation 22.18. Old Expressions
OldExpression_ = "old" "(" Expression(allowLemma: true, allowLambda: true) ")"
在后置条件中使用旧表达式。
old(e)
计算表达式e
在进入当前方法时的值。请注意,旧仅影响堆取消引用,例如o.f
和a[i]
。特别是,旧对局部变量或out-parameters返回的值没有影响。