Hoare Logic Loop Invariant

时间:2011-01-24 15:23:00

标签: language-agnostic logic verification invariants loop-invariant

我在看Hoare Logic,我在理解寻找循环不变量的方法时遇到了问题。

有人可以解释用于计算循环不变量的方法吗?

循环不变量应该包含什么才能成为“有用的”?

我只是处理简单的例子,找到不变量,并在例子中证明部分和完全的纠正:

{ i ≥ 0 } while i > 0 do i := i−1 { i = 0 }

3 个答案:

答案 0 :(得分:4)

如果我们谈论Hoare的逻辑来证明(部分)程序的正确性,那么你使用前置条件和后置条件,分解程序并使用Hoare逻辑推理系统的规则来创建和证明归纳公式。

在您的示例中,您希望使用规则

分解程序
{p} while b do S {p^not(b)} <=> {p^b} S {p}

在你的情况下

  • p:i≥0
  • b:i&gt; 0
  • S:i:= i-1。

因此,在下一步中我们推断{i ≥ 0 ^ i > 0} i := i−1 {i ≥ 0}。这可以进一步推断并且很容易证明。 我希望这会有所帮助。

答案 1 :(得分:3)

我不确定这是否会回答你的问题,但以防万一:

  • 非循环的“循环不变”是在循环迭代之前和之后保持为真的事实陈述。它本质上定义了程序相对于该循环的一致性约束。
  • 我不太了解Hoare Logic如何准确地告诉你如何“计算”循环不变量,但我怀疑这样的事情将取决于被分析的代码的语言而不是正式的证明语言本身。您是否拥有正在使用的正式算法描述?我或许可以进一步了解更多背景。
  • 有用的循环不变量将描述有关应用程序状态的特定内容。例如,如果您正在编写插入排序,主元素运动循环的有用循环不变量将基本上声明(子)列表在执行循环之前和之后包含相同的对象集合,并且可能是先前的元素按排序顺序保持排序顺序。

答案 2 :(得分:2)

有用(为你的推理)是不变量的要点。所以,看看你想要证明的后置条件,并尝试组成一个不变的,它将帮助你逐步到达后置条件,并且可以从循环代码中得出。