Сообщение об ошибке указывает, что Дафни не может доказать, что значение, присвоенное q
, действительно является nat
, как того требует тип q
. Это странно, потому что ваш дивиденд и делитель неотрицательны Верификатор, как правило, достаточно хорош в линейной арифметике, но ваш пример выходит за рамки линейной арифметики (поскольку делитель не является литеральной константой), и тогда верификатор более ненадежен.
Играя с этим, я предполагаю, что вычитание в знаменателе подвергается какой-то предварительной обработке, что затрудняет для верификатора применять то, что он знает о нелинейном делении. Я смог найти обходной путь, дав термину d - 1
имя, например:
method Div(n: nat, d: nat) returns (q: nat)
requires d > 1
{
var y := d - 1;
q := n / y;
}
Rustan