arrays - (Dafny) 将一个数组的元素添加到另一个 - 循环不变式

标签 arrays loop-invariant dafny

我有一个功能 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;
    }
}

我该如何解决这个错误?

最佳答案

如果 a,您的程序将不正确和 b引用同一个数组。您需要先决条件a != b . (如果您添加它,Dafny 将验证您的程序。)

鲁斯坦

关于arrays - (Dafny) 将一个数组的元素添加到另一个 - 循环不变式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44217256/

相关文章:

dafny - 将数字转换为字符串

java - 比较数组元素的代码出错

c - 如何在frama-c wp中用计算证明迭代循环?

algorithm - 我们能否使用循环不变量来证明算法的正确性,在循环不变量中我们证明它在第一次迭代之后而不是之前为真?

triggers - Dafny 没有条件可以触发谓词

compiler-errors - 处理此数组的字段时,循环不变式不够强

java - 逻辑或和模运算符在 Java 中表现奇怪

javascript - forEach 与 myArray[i] 或参数

java - 为什么我的 Java 程序只在文件中添加一半的数字列表?

algorithm - 什么是循环不变量?