为什么我不能从达夫尼的幽灵场中调用(非静态)引理?

时间:2018-10-22 11:04:01

标签: formal-verification dafny formal-semantics

在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的最佳选择吗?

3 个答案:

答案 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)的引理,而不会遇到从非重影方法调用重影变量的重影方法的问题。