Я использовал абстрактные леммы и функции (без тел) в задаче моделирования. В этом примере
lemma py(c : int) returns (a: int, b :int)
ensures a*a + b*b == c*c
lemma main(c : int) returns (a: int, b :int)
ensures a*a + b*b == c*c
{
a, b := py(c);
}
вызов py в main гарантирует, что пост-условие истинно независимо от того, как реализован py. У меня есть 2 вопроса:
Безопасно ли использовать абстрактные леммы/функции в Dafny? Следующая модификация приведенного выше кода проверена Dafny:
lemma py(c : int) returns (a: int, b :int) ensures a*a + b*b == c*c ensures a*a + b*b != c*c
в то время как я думаю, что, возможно, Дафни должен был выдать ошибку.
Должен ли я сказать
lemma {:axiom} py(...)
? Я не заметил разницы при включении{:axiom}
или{:imported}
.