loop-invariant - dafny 中的指数方法 : invariant might not be maintained

标签 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;
  }
}

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

最佳答案

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

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

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

关于loop-invariant - dafny 中的指数方法 : invariant might not be maintained,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45747395/

相关文章:

c - 什么循环不变量用于整数对数?

insert - Dafny 插入方法,后置条件可能不会在此返回路径上成立

algorithm - 立方求和算法的循环不变量是什么?

dafny - 显示两个位向量的等价性

automated-tests - 修改已更改对象的子句错误

algorithm - 何时使用 low < high 或 low + 1 < high for loop invariant

Java循环不变量

dafny - 在 dafny 中实现链表的追加操作,复杂度为 O(1)

dafny - 将一个 Dafny 文件包含在另一个文件中

arrays - 为什么这个涉及数组的 Dafny 断言会失败?