Я пытаюсь доказать алгоритм gcd
с Дафни, и, видимо, не все так просто.Пока что у меня есть (не так много) функциональная спецификация, и Дафни удается доказать, что compute_gcd
ведет себя так же.Однако, когда я удаляю комментарии [1], [2] and [3]
Дафни не может доказать, что функциональная спецификация обладает желаемыми свойствами:
function gcd(a: int, b: int) : (result : int)
requires a > 0
requires b > 0
// [1] ensures (exists q1:int :: (q1 * result == a))
// [2] ensures (exists q2:int :: (q2 * result == b))
// [3] ensures forall d :int, q1:int, q2:int :: ((q1*d==a)&&(q2*d==b)) ==> (exists q3:int :: (0 < q3 <= result) && (q3*d == result))
{
if (a > b) then gcd(a-b,b) else
if (b > a) then gcd(a,b-a) else a
}
method compute_gcd(a: int, b: int) returns (result: int)
requires a > 0
requires b > 0
ensures result == gcd(a,b)
{
var x := a;
var y := b;
while (x != y)
decreases x+y
invariant x > 0
invariant y > 0
invariant gcd(x,y) == gcd(a,b)
{
if (x > y) { x := x - y; }
if (y > x) { y := y - x; }
}
return x;
}
Я иду в правильном направлении?любая помощь очень ценится, спасибо!