【问题标题】:Modifying an array in Dafny with postconditions使用后置条件修改 Dafny 中的数组
【发布时间】:2019-12-16 17:50:02
【问题描述】:

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

代码运行良好,但一个应该在我脑海中传递的简单后置条件却给我带来了错误。

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

【问题讨论】:

    标签: dafny


    【解决方案1】:

    你需要告诉 Dafny 循环维护的不变量。

    添加后

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

    证明通过了。

    【讨论】:

    • 如果您愿意,也可以省略前置条件 a.Length &gt; 0,因为您的 initialise 方法也适用于空数组。
    • 为此干杯!一个问题 - 我认为在循环执行之前需要保持不变量,在这种情况下,我不会认为它会正确验证。不变量是否仅在循环迭代后检查?
    • 它必须在循环之前保持,并且确实如此。 i 在循环之前为 0,因此蕴涵的前件为假,所有 j 的蕴涵为真。
    猜你喜欢
    • 1970-01-01
    • 2020-04-07
    • 2018-11-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 2021-02-23
    相关资源
    最近更新 更多