Я работаю над некоторой логикой Хоара, и мне интересно, правильный ли мой подход.
У меня есть следующая программа 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 | как мой инвариант, который отлично работает. Тем не менее, у меня была проблема от перехода к концу цикла до желаемого постусловия. Потому что за значение
|s = i*(i-1)/2 & i > n|
=>
| s = n * (n+1) / 2 |
чтобы удержаться, мне нужно доказать, что я есть n + 1, а не просто я больше n. Итак, я подумал о том, чтобы добавить (i <= n + 1) к инварианту, чтобы он стал: </p>
|s = i * (i-1)/2 & i <= n+1|
Тогда я могу доказать программу, поэтому я думаю, что она должна быть правильной.
Тем не менее, я считаю, что инвариант немного, менее "инвариантно" :). И не то, что я видел в курсе или в упражнениях до сих пор, поэтому мне было интересно, было ли здесь более элегантное решение?