排序后置条件不成立

时间:2017-12-06 15:43:58

标签: dafny

我想在这个方法中做的只是覆盖以前的数组,并用编号的数字填充它,但是dafny说后置条件不成立,我不能为我的生活做好准备找出原因。 我猜我需要在循环中添加一些不变量,但由于在进入循环之前检查它们,我不知道如何设置有效的不变量。

method sort2(a : array<int>)
modifies a;
requires a != null && a.Length >= 2;
ensures sorted2(a[..]);
{
  var i := a.Length - 1;
  while (i >= 0)
  decreases i
 {
     a[i] := i;
     i := i - 1;
 }
}

predicate sorted2(s: seq<int>)
{
    forall i :: 1 <= i < |s| ==> s[i] >= s[i-1]
}

我以前的尝试只是为了重新初始化但是dafny显然不允许内部方法。

1 个答案:

答案 0 :(得分:1)

你需要一个循环不变量来证明这个程序是正确的。

参见Dafny Tutorial的第6节,了解循环不变量的一般介绍以及如何提出它们。

在这种情况下,一个好的循环不变量就像sorted(a[i+1..]),它表示索引i之后的数组部分已经排序。这样,当循环终止并且i为零时,您将知道整个数组已排序。

您还需要一个或两个循环不变量来描述i上的边界以及数组本身的元素。