我正在研究一些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|
然后,我可以证明的程序,所以我觉得应该是正确的。
尽管如此,我发现不变量是一点点,“不变”:)。而且不像我在课程或练习中见过的任何内容,所以我想知道这里是否有更优雅的解决方案?