Это можно сделать в три строки:
lemma NatDivision(a: nat, b: nat)
requires b != 0
ensures a / b == (a as real / b as real).Floor
{
// A basic fact about the natural division and modulo operations:
assert a == (a / b) * b + (a % b);
// Cast some values to `real`, because this is a programming language.
// (In math, 7 and 7.0 are the same object and this wouldn't be needed...)
assert a as real == (a / b) as real * b as real + (a % b) as real;
// Divide through by b.
assert a as real / b as real == (a / b) as real + (a % b) as real / b as real;
// Aha! That reveals that the real quotient `a as real / b as real` is equal
// to the natural quotient `a / b` (a natural number) plus a fraction.
// This looks enough like `Floor` that Dafny can take it from here.
}
Я до сих пор не нашел аксиомы для деления.
Как я нашел это доказательство: СначалаЯ предположил, что Дафни не определяет естественное или реальное деление в терминах другого.Так как же они определены?Я записал свои лучшие догадки:
// natural division
a / b == the unique number q | a == q * b + r, 0 <= r < b.
// real division
a / b == the unique number q | q * b == a
Оттуда было просто опробовать все возможные тупики, которые можно извлечь из этих двух фактов, прежде чем наткнуться на трюк выше.
У меня была догадка, что доказательство будет зависеть от того, что в каждом определении не подходит для другого.Конечно же, первое определение стало первым утверждением доказательства, а оставшийся термин был важен.Второе определение не используется напрямую, но если вы посмотрите внимательно, вы увидите место, где мы предполагаем, что реальное умножение * b as real
отменяет реальное деление / b as real
.