Вот код, который я пытаюсь доказать:
function rec_even(a: nat) : bool
requires a >= 0;
{
if a == 0 then true else
if a == 1 then false else
rec_even(a - 2)
}
method Even(key: int) returns (res: bool)
requires key >= 0;
ensures res == rec_even(key)
{
var i : int := key;
while (i > 1)
invariant 0 <= i <= key;
decreases i;
{
i:= i - 2;
}
res := i == 0;
}
Но я получаю сообщение об ошибке постусловия:
stdin.dfy (13,0): Ошибка BP5003: Постусловие может не выполняться на этом пути возврата. stdin.dfy (12,14): Связанное местоположение: это постусловие, которое может не выполняться.
Если есть способ доказать зацикленную версию четности (цикл while или рекурсивный), я был бы признателен!
РЕДАКТИРОВАТЬ: это может быть неочевидно из кода, но я ищу индуктивное доказательство n, которое dafny должно иметь возможность выяснить, по крайней мере, для случая метода.
Я видел несколько подобных доказательств того, что рекурсивная функция используется в инварианте цикла функции метода, просто не знаю, почему она не работает в этом конкретном случае.
Вы можете попробовать код на rise4fun здесь: https://rise4fun.com/Dafny/wos9