我正在研究一些Hoare邏輯,我想知道我的方法是否正確。Hoare邏輯,while循環與'<='
我有以下程序P:
s = 0
i = 1
while (i <= n) {
s = s + i
i = i + 1
}
應該滿足霍爾三重{N> = 0} p {S = N *(N + 1)/ 2}(因此它只是需要的和)。現在,最初我有| s = i *(i-1)/ 2 |作爲我的不變,這工作正常。但是,我的循環結束時出現了一個問題,達不到我想要的後置條件。因爲對於impliciation
|s = i*(i-1)/2 & i > n|
=>
| s = n * (n+1)/2 |
持有,我需要證明我是N + 1,而不是任何我超過n大。因此,我認爲是一個(我< = N + 1)添加到不變,使之成爲:
|s = i * (i-1)/2 & i <= n+1|
然後,我可以證明的程序,所以我覺得應該是正確的。
儘管如此,我發現不變量是一點點,「不變」:)。而且不像我在課程或練習中見過的任何內容,所以我想知道這裏是否有更優雅的解決方案?