私はいくつかのホーア論理に取り組んでいますが、私のアプローチが正しいかどうか疑問に思っています。
私は次のプログラムPを持っています:
s = 0
i = 1
while (i <= n) {
s = s + i
i = i + 1
}
これは、hoare triple {n> = 0} P {s = n *(n + 1)/ 2}を満たす必要があります(したがって、合計が必要です)。さて、最初は| s = i *(i-1)/2|でした 私の不変条件として、これはうまく機能します。しかし、ループの最後から希望の事後条件に至るまで、問題が発生しました。含意のために
|s = i*(i-1)/2 & i > n|
=>
| s = n * (n+1) / 2 |
保持するには、iがn + 1であり、nより大きいiだけではないことを証明する必要があります。だから私が考えたのは、不変量に(i <= n + 1)を追加して、次のようにすることです。
|s = i * (i-1)/2 & i <= n+1|
そうすれば、プログラムを証明できるので、正しいはずだと思います。
それにもかかわらず、私は不変条件が少し、「不変条件」ではないことを発見しました:)。そして、これまでのコースや演習で見たものとは違うので、ここにもっとエレガントな解決策があるのだろうかと思いました。