确定循环不变量的最佳方法是什么?

fil*_*nep 14 loops formal-methods invariants loop-invariant

当使用形式方面来创建一些代码时,是否有一种确定循环不变量的通用方法,或者它是否会根据问题完全不同?

Pas*_*uoq 19

已经指出一个相同的循环可以有几个不变量,并且可计算性对你不利.这并不意味着你不能尝试.

事实上,你正在寻找归纳不变量:单词不变量也可以用于在每次迭代时都为真的属性,但是对于它来说,它不足以知道它在一次迭代中保持它在下一个.如果是归纳不变量,那么我的任何后果都是不变的,但可能不是归纳不变量.

您可能试图获得一个归纳不变量来证明某些特定情况(前置条件)中的循环的某个属性(后置条件).

有两种启发式方法可以很好地工作:

  • 从你拥有的东西开始(前置条件),并削弱直到你有一个归纳不变量.为了获得如何削弱的直觉,应用一个或多个前向循环迭代,看看在你的公式中什么不再是真的.

  • 从你想要的东西开始(后置条件)并加强直到你有一个归纳不变量.为了获得如何加强的直觉,向后应用一个或多个循环迭代并查看需要添加的内容,以便可以推导出后置条件.

如果您希望计算机在练习中为您提供帮助,我可以为Frama-C的 C程序推荐Jessie演绎验证插件.还有其他一些,尤其是Java和JML注释,但我对它们不太熟悉.如果他们在纸上工作,那么尝试你想到的不变量要快得多.我应该指出,验证属性是归纳不变量也是不可判定的,但现代自动证明器在很多简单的例子中都很有用.如果您决定走这条路线,请从列表中尽可能多地获取:Alt-ergo,Simplify,Z3.

使用可选的(并且稍微难以安装)库Apron,Jessie也可以自动推断出一些简单的不变量.


aio*_*obe 7

生成循环不变量实际上是微不足道的.true例如,这是一个很好的.它满足您想要的所有三个属性:

  1. 它在循环输入之前保留
  2. 它在每次迭代后保持不变
  3. 它在循环终止后保持

但你所追求的可能是最强的循环不变量.然而,找到最强的循环不变量有时甚至是不可判定的任务.请参阅文章可计算循环不变量的不足.