我一直在建模任务中使用抽象引理和函数(没有主体)。在这个例子中,
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);
}
在 main 中调用 py 可确保后置条件为真,而不管 py 是如何实现的。我有两个问题:
在 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
虽然我认为这可能是 Dafny 应该抛出一个错误。
我应该说
lemma {:axiom} py(...)
吗?我没有观察到包括{:axiom}
or的区别{:imported}
。