이 Q3
메서드는 res | n0 |에 m0을 추가하여 n0 * m0을 통근합니다. 타임스. n0이 음수이면 n0 * m0 = -n0 * -m0으로 n0와 m0을 모두 반전시킵니다.Dafny에서 두 정수를 불변량으로 곱하는 간단한 방법
문제는 불변량이 부울 유형 일 필요가 있기 때문에 내 불변성이 어떻게 보이는지 정확히 알지 못한다는 것입니다. 아무도 불변 부울 조건이 어떻게 생겼는지 말해 줄 수 있습니까? 내가 Abs((n0)-n)*m == res
에 대해 생각했지만 그게 작동하지 않습니다.
method Q3(n0 : int, m0 : int) returns (res : int)
ensures n0*m0 == res
{
var n, m : int;
res := 0;
if (n0 >= 0)
{n,m := n0, m0;}
else
{n,m := -n0, -m0;}
while (0 < n)
invariant Abs((n0)-n)*m
{
res := res + m;
n := n - 1;
}
}
function Abs(x: int): int
{
if x < 0 then -x else x
}