2015-07-19 124 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