dafny中的指数方法:可能无法保留不变量

时间:2017-08-18 02:01:59

标签: loop-invariant dafny

我开始学习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;
  }
}

给定的错误如下:&#34;循环可能无法维护此循环不变量。&#34;我想我可能需要另一个不变量,但我认为我的代码是正确的(我猜)。任何帮助表示赞赏。提前谢谢。

1 个答案:

答案 0 :(得分:2)

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

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

之后,您仍然需要做一些工作才能完成正确的方法验证。如果你遇到困难,请随时提出进一步的问题。