Dafny验证 - 参考后期条件下的原始变量

时间:2017-01-27 14:19:24

标签: dafny

我正在尝试在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。

1 个答案:

答案 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.fa[i]。特别是,对局部变量或out-parameters返回的值没有影响。