나는 Hoare 논리를 연구 중이고 접근 방법이 올바른지 궁금해하고 있습니다. Hoare Logic while while while '<='
I 다음 프로그램 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 | 내 invariant로 잘 작동합니다. 그러나, 나는 나의 원하는 사후 조건에 루프의 끝으로가는 것에 문제가 있었다. 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|
은 그 때 나는 그래서 그것을 올바른해야한다고 생각 프로그램을 증명할 수 있습니다.
그럼에도 불구하고, 나는 불변량이 조금 "불변 적으로 적다"는 것을 알게됩니다. :). 지금까지의 과정이나 연습에서 보았던 것과 흡사해서 더 우아한 해결책이 있는지 궁금합니다.
그럼에도 불구하고|s = i * (i-1)/2 & i <= n+1|
, 내가 할 불변을 찾을 :