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

Loops 确定循环不变量的最佳方法是什么?,loops,invariants,formal-methods,loop-invariant,Loops,Invariants,Formal Methods,Loop Invariant,当使用形式方面来创建一些代码时,是否有一种确定循环不变量的通用方法,或者根据问题的不同,它是否会完全不同?我认为这不容易实现自动化。从维基: 由于循环与递归程序的基本相似性,用不变量证明循环的部分正确性与用归纳法证明递归程序的正确性非常相似。事实上,循环不变量通常是递归程序的归纳性质,它等价于给定的循环 生成循环不变量实际上很简单true就是一个很好的例子。它满足您想要的所有三个属性: 它在循环进入之前保持不变 它在每次迭代后保持不变 它在循环终止后保持不变 但你所追求的可能是最强的循环不变量。

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

我认为这不容易实现自动化。从维基:

由于循环与递归程序的基本相似性,用不变量证明循环的部分正确性与用归纳法证明递归程序的正确性非常相似。事实上,循环不变量通常是递归程序的归纳性质,它等价于给定的循环


生成循环不变量实际上很简单<例如,code>true就是一个很好的例子。它满足您想要的所有三个属性:

  • 它在循环进入之前保持不变
  • 它在每次迭代后保持不变
  • 它在循环终止后保持不变

  • 但你所追求的可能是最强的循环不变量。然而,找到最强的循环不变量有时甚至是一项无法确定的任务。参见文章“可计算循环不变量的不足”。

    已经指出,同一个循环可以有多个不变量,可计算性对您不利。这并不意味着你不能尝试

    事实上,您正在寻找一个归纳不变量:不变量一词也可以用于在每次迭代时为真的属性,但对于该属性,仅仅知道它在一次迭代中保持不变而推断它在下一次迭代中保持不变是不够的。如果I是归纳不变量,则I的任何结果都是不变量,但可能不是归纳不变量

    您可能正试图获得一个归纳不变量,以证明在某些定义的情况下(前提条件)循环的某个属性(后条件)

    有两种启发式方法非常有效:

    • 从你拥有的(先决条件)开始,然后减弱,直到你拥有一个归纳不变量。为了获得如何削弱的直觉,应用一个或多个前向循环迭代,看看你的公式中什么不再正确

    • 从你想要的开始(后条件)并加强,直到你有一个归纳不变量。要获得如何增强的直觉,请向后应用一个或多个循环迭代,并查看需要添加的内容,以便推断post条件

    如果您希望计算机在实践中帮助您,我可以推荐用于C程序的演绎验证插件。还有其他注释,特别是Java和JML注释,但我对它们不太熟悉。试一试你所想到的不变量,要比在纸上找到它们快得多。我应该指出,验证一个属性是归纳不变量也是不可判定的,但是现代的自动证明器在许多简单的例子中做得很好。如果你决定走这条路,从列表中尽可能多地选择:Alt ergo,Simplify,Z3


    Jessie还可以使用可选的(安装起来有点困难的)库挡板。

    有许多用于查找循环不变量的启发式方法。关于这一点的一本好书是Ed Cohen的《90年代的编程》。这是关于如何通过手动操作后条件来找到一个好的不变量。例如:用变量替换常量,强化不变量,

    我在博客中写过关于编写循环不变量的内容,请参阅。证明循环正确性所需的不变量通常包括两部分:

  • 循环终止时预期状态的泛化
  • 确保循环体格式良好所需的额外位(例如边界中的数组索引)

  • (2) 这是直截了当的。要派生(1),请从表示终止后所需状态的谓词开始。它很可能在某些数据范围内包含“forall”或“exists”。现在更改“forall”或“exists”的边界,以便(a)它们依赖于循环修改的变量(例如循环计数器),以及(b)在首次输入循环时,不变量非常真实(通常通过将“forall”或“exists”的范围设为空)。

    谢谢,但我不想自动化它,它只是用于纸笔练习,我需要找到循环不变量。我想这需要练习,“真的”很弱。我想你的意思是“你在追求最强的循环不变量”。你的回答提出了一个很好的观点,但我想说的是,人们通常需要“任何足够强的归纳不变量来证明自己心中的属性”。最强的循环不变量可能不存在(如果有无限多个变量,将新的x加上“和x'=x”可以建立一个更强的不变量),并且可能很难处理。关于“最弱的”,你当然是对的。我搞混了!(我认为它是“真的很弱,因为它并不意味着什么”)。答案已更新。不过,我觉得你的第二点有点做作。你是说它不存在是因为它需要无限的空间才能写下来吗?好吧,在大多数逻辑中,公式是符号的有限集合,我想如果你允许无限集合,甚至把自己限制在可以有限描述的规则集合中,一些元定理就不成立了。所以你必须小心。撇开这个吹毛求疵不谈(例如,在ACSL中,你可以在有限子句中陈述无限变量的不变性),我的观点是,最强的不变性可能比必要的复杂得多。这是一个很好的观点。最强的循环不变量有时不止一个。同意。从技术上讲,OP和我的答案都没有提到公式。是你提到了这种说法也许一个改进是将其称为“足以证明正确性的感应回路不变量”(wrt所需的前置和后置条件)。完美的答案+1:)不过,你有没有见过简化解决义务