【问题标题】:Loop invariant Hoare Logic循环不变霍尔逻辑
【发布时间】:2015-10-08 19:29:34
【问题描述】:

我有一个程序,我应该在其中找到一个循环不变量,然后提供一个证明。

      {x>=0 && y>=0} // precondition
res:=0;
i:=0;
while (i<y) do
res:=res+x;
i:=i+1;
od
      {res:=x*y} //postcondition

对我来说唯一的逻辑循环不变量是res&lt;=x*y,这从后置条件很简单,但我认为它不是最好的。也许还有其他建议?

【问题讨论】:

    标签: proof-of-correctness hoare-logic


    【解决方案1】:

    这行得通吗?

    {x>=0 && y>=0} // precondition
    res:=0;
    i:=0;
    while (i<y) do
        {res=x*i} // invariant
        res:=res+x;
        i:=i+1;
        {res=x*i} // invariant
    end
    {res=x*y} //postcondition
    

    通过这些条件,您应该能够证明程序部分正确(即,如果循环终止,则答案是正确的)和程序终止。虽然我想你也需要 y 是整数的前提条件。

    【讨论】:

    • 谢谢,但为什么你提到了两次?我的意思是它肯定在开始和结束时都应该成立。而且,从逻辑上讲,我知道如何证明它是部分正确的,但完全正确呢?你能给个提示吗?
    • 我两次提到它是为了确保循环体内的操作保持不变(... an invariant of a loop is a property that holds before (and after) each repetition)。至于完全正确性,您认为完全正确性与部分正确性 + 循环终止相同。
    猜你喜欢
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多