Для завершения вашего примера вам нужны более сильные инварианты цикла.Но вам вообще не нужен цикл, так как нет никакой причины делить только на 2.
Здесь мы делаем это с byte
как тип подмножества:
type byte = x | 0 <= x < 256
method convertBin(i: int) returns (b1: byte, b0: byte)
requires 0 <= i < 0x1_0000
ensures i == 256 * b1 + b0
{
b1, b0 := i / 256, i % 256;
}
И вотта же программа, но с byte
, являющимся newtype
:
newtype byte = x | 0 <= x < 256
method convertBin(i: int) returns (b1: byte, b0: byte)
requires 0 <= i < 0x1_0000
ensures i == 256 * b1 as int + b0 as int
{
b1, b0 := (i / 256) as byte, (i % 256) as byte;
}
Rustan