如何在 bubblesort 示例中调用 dafny 中的引理?

How to invoke lemma in dafny in bubblesort example?

如何调用引理作为相等为真的推理。考虑以下 dafny 中的示例,其中我创建了一个引理来表示从 0 到 n 的总和是 n 选择 2。Dafny 似乎可以毫无问题地证明这个引理。我想用那个引理说 bubblesort 中的交换次数有一个从 0 到 n 的总和的上限,这相当于 n 选择 2。在这种情况下,我目前在尝试说它是引理为真。为什么会发生这种情况,我怎么能在给定引理的情况下说相等性为真?

method BubbleSort(a: array?<int>) returns (n: nat) 
  modifies a
  requires a != null
  ensures n <= (a.Length * (a.Length - 1))/2
{
    var i := a.Length - 1;
    n := 0;
    while (i > 0)
      invariant 0 <= i < a.Length
       {
        var j := 0;
        while (j < i)
          invariant j <= i
          invariant n <= SumRange(i, a.Length)
          {
            if(a[j] > a[j+1])
              {
                a[j], a[j+1] := a[j+1], a[j];
                n := n + 1;
              }
              j := j + 1;
          }
          i := i -1;
      }
    assert n <= SumRange(i, a.Length) == (a.Length * (a.Length - 1))/2 by {SumRangeNChoose2(a.Length)};
    assert n <= (a.Length * (a.Length - 1))/2
}

function SumRange(lo: int, hi: int): int
  decreases hi - lo
{
  if lo == hi then hi
  else if lo >= hi then 0
  else SumRange(lo, hi - 1) + hi
}

lemma SumRangeNChoose2(n: nat)
  ensures SumRange(0, n) == (n * (n - 1))/2
{}

您只是遇到了语法错误。在 BubbleSort 的倒数第二行 } 之后不应有分号。此外,应该在下一行的断言之后有一个分号。

修复语法错误后,代码中还有一些更深层次的错误,如缺少不变量等。但它们都可以使用 中对你的其他问题的注释来修复。