在Dafny上,lemma
被实现为ghost method
,因此,它仅对规范有用。
但是,您不能像这样:从ghost field
调用引理:
class A {
var i: int;
lemma sum_is_commutative(i: int, j: int)
ensures i + j == j + i
{}
}
class B {
ghost var a: A;
lemma a_sum_is_commutative(i: int, j: int)
ensures i + j == j + i
{ a.sum_is_commutative(i, j); }
method test() {
// a.sum_is_commutative(3, 2); // <- Cannot use directly this
a_sum_is_commutative(3, 2);
}
}
此行为的依据是什么?如何解决?只是在内部类中重复引理并利用(通常是调用)另一类的lemma
的最佳选择吗?
答案 0 :(得分:2)
感谢您发现并报告此问题。这是一个错误。我只是为此修复了一个问题。
Rustan
答案 1 :(得分:0)
我对Dafny不熟悉,但是我认为您还需要将test
方法声明为ghost,以便能够在其中使用ghost参数。
通常在程序验证框架中,ghost
意味着定义将在运行时删除,此处仅用于证明目的。因此,您的test
方法不应包含其定义将被删除的代码,或应将其标记为可擦除(ghost
)。
答案 2 :(得分:0)
我无法评论这种行为的理由(如果有学术上的答案,而不仅仅是错误或缺乏实施,我将更新所选答案)。
要变通解决此问题,定义在语义上是相同的
class A {
lemma sum_commutative(i: int, j: int) {}
}
类似
class A {
static lemma sum_commutative(a: A, i: int, j: int) {}
}
因此,即使您需要访问this
实例,也可以将其作为参数传递,而不是隐式依赖它。
然后,您可以从任何其他类调用A.sum_commutative(a, i, j)
的引理,而不会遇到从非重影方法调用重影变量的重影方法的问题。