2015-07-19 227 views
0

我有一个程序,我应该找到一个循环不变量,然后提供一个证明。循环不变Hoare逻辑

 {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<=x*y,这是后置条件简单,但我不认为它最好的一个同去。也许还有其他建议?

回答

0

这项工作?

{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是一个整数的前提条件。

+0

谢谢,但你为什么提到它两次?我的意思是肯定它应该在开始和结束时都成立。而且,我逻辑上知道如何表明它是部分正确的,但完全呢?你能提供一个提示吗? – nlimits

+0

我提到过两次,以确保循环体内的操作保持不变([...循环的不变量是每个重复之前(和之后)的属性](https://en.wikipedia)。组织/维基/ Loop_invariant))。至于总的正确性,你的总体正确性与部分正确性+循环终止相同。 – d125q