【问题标题】:Exponential method in dafny: invariant might not be maintaineddafny 中的指数方法:可能无法保持不变量
【发布时间】:2018-01-26 14:15:22
【问题描述】:

我开始学习 Dafny,我刚刚学习了不变量。我有这个代码:

function pot(m:int, n:nat): int
{
  if n==0 then 1
  else if n==1 then m
  else if m==0 then 0
  else pot(m,n-1) * m
} 
method Pot(m:int, n:nat) returns (x:int)
ensures x == pot(m,n)
{
  x:=1;
  var i:=0;
  if n==0 {x:=1;}
  while i<=n
  invariant i<=n;
  {
    x:=m*x;
    i:=i+1;
  }
}

给定的错误如下:“这个循环不变量可能不会被循环维护。”我想我可能需要另一个不变量,但我认为我的代码除此之外是正确的(我猜)。任何帮助表示赞赏。提前致谢。

【问题讨论】:

    标签: loop-invariant dafny


    【解决方案1】:

    每当评估循环分支条件时,必须保持循环不变量。但是在循环的最后一次迭代中,i 实际上将是n+1,因此循环不变量不成立。

    将循环不变量更改为i &lt;= n + 1 或将循环分支条件更改为i &lt; n 将解决此特定问题。

    在那之后,您仍然需要做一些工作来完成证明该方法正确的工作。如果您遇到困难,请随时提出更多问题。

    【讨论】:

    • 首先,谢谢你再次回答我,詹姆斯!但是,是的,我尝试了你之前所说的但它没有用,所以我认为问题没有解决。我稍后会尝试。谢谢。
    • 修复此问题后,您将收到不同错误,您仍需要修复该错误才能完成验证方法。
    • 是的,我注意到了哈哈。我正在尝试修复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    相关资源
    最近更新 更多