2

我試圖找到一個循環不變,這樣我們可以證明這個節目部分糾正:循環不變的證明部分正確性

{ n >= 1 } pre-condition 
i = 1; 
z = 1; 
while (i != n) { 
    i = i + 1; 
    z = z + i*i; 
} 
{ z = n*(n+1)*(2*n + 1)/6 } post-condition 

我很堅持。一些到目前爲止,我已經試過不變的是:

z <= n*(n+1)*(2*n + 1)/6^i <= n 

z = i*(i+1)*(2*i + 1)/6^i <= n 

我真的很感激一些建議。

+0

難道是你的後期條件有一個錯字嗎? '... = 6'似乎很奇怪(因爲它說「z」總是等於固定數字「6」)。 – chris

+0

順便說一句:你的文章中的符號'^'是否代表「冪」(就像它在我的答案中一樣),還是你嘗試近似邏輯「和」的符號(我寧願寫成&&或'/\')。我只是問,因爲「z = ... && i <= n」比其他解釋更有意義。 – chris

回答

0

要找到一個適當的不變量,你必須有一個直覺,調查功能實際上做了什麼。在您的示例中,值i^2被連續添加到累加器z。因此,函數計算(只是要通過手,然後推廣的while循環的前幾個迭代):

1^2 + 2^2 + 3^2 + 4^2 + 5^2 + ... + n^2 

或書面略偏正式

SUM_{i=1}^{n} i^2 

即所有的總和i的正方形範圍從1n

初看起來,這可能看起來不像你的後置條件。但是,它可以通過感應被顯示在n,上述總和等於

(n*(n+1)*(2*n + 1))/6 

我的猜測是預期的後置條件。既然我們現在知道後置條件等於這個總和,那麼應該很容易從總和中讀出不變量。