【问题标题】:(Dafny) Adding elements of an array into another - loop invariant(Dafny) 将数组的元素添加到另一个 - 循环不变量
【发布时间】:2017-10-28 06:33:33
【问题描述】:

我有一个函数sum,它接受两个数组ab 作为输入并修改b 使得b[i] = a[0] + a[1] + ... + a[i]。我写了这个函数,想用 Dafny 验证它。但是,Dafny 告诉我,循环可能不会维护我的循环不变量。这是代码:

function sumTo(a:array<int>, n:int) : int
  requires a != null;
  requires 0 <= n < a.Length;
  decreases n;
  reads a;
{
    if (n == 0) then a[0] else sumTo(a, n-1) + a[n]
}

method sum(a:array<int>, b:array<int>)
    requires a != null && b != null
    requires a.Length >= 1
    requires a.Length == b.Length
    modifies b
    ensures forall x | 0 <= x < b.Length :: b[x] == sumTo(a,x)
{
    b[0] := a[0];
    var i := 1;

    while i < b.Length
        invariant b[0] == sumTo(a,0)
        invariant 1 <= i <= b.Length

        //ERROR : invariant might not be maintained by the loop.
        invariant forall x | 1 <= x < i :: b[x] == sumTo(a,x)

        decreases b.Length - i
    {
        b[i] := a[i] + b[i-1];
        i := i + 1;
    }
}

我该如何解决这个错误?

【问题讨论】:

    标签: arrays loop-invariant dafny


    【解决方案1】:

    如果ab 引用同一个数组,您的程序将不正确。您需要前置条件a != b。 (如果你添加它,Dafny 会验证你的程序。)

    鲁斯坦

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      相关资源
      最近更新 更多