使用后置条件在Dafny中修改数组

时间:2019-08-09 01:18:57

标签: dafny

尝试实现一个相当简单的方法,在此方法中,您传递一个空数组并将值放入其中(自然数)。

代码运行良好,但是我应该想到的一个简单的后置条件就是抛出错误。

method Main() {
  var a := new int[5];
  initialise(a);

}

method initialise(a: array<int>) 
modifies a
requires a.Length > 0
ensures forall i :: 0 <= i < a.Length ==> a[i] == i
{
    var i := 0;
    while i < a.Length
    invariant 0 <= i <= a.Length
    decreases  a.Length - i
  {
        a[i] := i;
        i := i + 1;
    }
}

错误:

A postcondition might not hold on this return path. Related location 1: Line: 10, Col: 8

1 个答案:

答案 0 :(得分:1)

您需要告诉Dafny有关循环所保持的不变性。

添加后

invariant forall j :: 0 <= j < i ==> a[j] == j

证据通过。