【问题标题】:What wrong with my dafny method. simple method postcondition might not hold我的愚蠢方法有什么问题。简单方法后置条件可能不成立
【发布时间】:2019-11-30 16:12:47
【问题描述】:

我是 Dafny 的新手,我正在尝试在不使用 *.

谁能告诉我我的代码有什么问题?我认为是不变量和减少。

method CalcTerm(m: int, n: nat) returns (res: int)
  ensures res == 5*m-3*n;
{
  var m1: nat := abs(m);
  var n1: nat := n;
  res := 0;

  while (m1!=0)
    invariant m1>=0
    decreases m1
  {
    res := res+5;
    m1 := m1-1;
  }

  if (m<0) { res := -res; }

  while (n1!=0)
    invariant n1 >= 0
    decreases n1
  {
    res := res-3;
    n1 := n1-1;
  }
}

但它一直在说:

A postcondition might not hold on this return path. 29  2

【问题讨论】:

    标签: dafny


    【解决方案1】:

    您说得对,问题与循环不变量有关。我建议阅读Guide 中关于断言和循环不变量的两个部分。

    Dafny使用它的不变量来“总结”循环的效果。所以在你的方法中的第二个循环之后,Dafny 只会知道n1 &gt;= 0 并且循环已经终止,所以实际上是n1 == 0。这不足以证明你的后置条件:你需要一个更强的不变量。这是一个可以帮助您取得进步的方法

    invariant res == 5 * m - 3 * (n - n1)
    

    这个不变量计算res 的值,根据循环到目前为止执行了多少次迭代 (n - n1)。如果您将此不变量添加到第二个循环,您将收到一个新错误(进度!),表示它可能无法进入。这意味着 Dafny 能够证明您的后置条件,但无法在第一个循环完成后确定新的不变量为真。这又是因为第一个循环的不变量太弱了。

    也许这为您提供了足够的信息来尝试自己为第一个循环提出另一个不变量。如果您遇到困难,请随时在此处提出更多问题。

    【讨论】:

    • 谢谢。我了解了不变量的定义,并且在您的帮助下已经解决了。
    • 鉴于此问题的数字性质,您可能会从验证角的以下情节中获得帮助,其中示例是类似的问题:youtube.com/watch?v=spcfzbisBv4
    猜你喜欢
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2021-01-23
    • 2015-02-12
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多