声明涉及序列的方法的返回值

时间:2019-05-23 18:08:17

标签: seq formal-verification dafny

我是Dafny的初学者,我想知道为什么违反了Main方法中打印之前的断言。我试图找到应该在其中插入项目的最右边的索引,以保留顺序(在此特定情况下为4)。

https://rise4fun.com/Dafny/4lR2

public synchronized void deleteObserver(Observer o) {
        obs.removeElement(o);
    }

1 个答案:

答案 0 :(得分:3)

这确实令人困惑!这里发生了一些事情。

首先,请记住,Dafny仅使用其他方法的规范分别说明每种方法的原因。因此,在Main中,Dafny对BinarySearchInsertionHint唯一了解的就是它的后置条件。现在事实证明,hint == 4实际上是确实遵循后置条件,但是要说服Dafny做到这一点并不容易。

这使我们进入到第二件事,这是量词触发器。 BinarySearchInsertionHint的后置条件使用通用量词(forall),达夫尼(Dafny)提出使用句法启发式进行实例化的原因。此示例中的两个量词均在a[i]上触发,这意味着它们将不会在值v中使用,除非 a[v]在以下情况下验证者。

您可以通过提及a[3]a[4]来获得断言,这足以使Dafny从后置条件中得知hint必须为4。像这样:

method Main() {
    var a := [0, 1, 1, 1, 2];
    var hint := BinarySearchInsertionHint(a, 1);
    assert a[3] == 1;  // these assertions just "mention" a[3] and a[4]
    assert a[4] == 2;
    assert hint == 4;  // assertion now passes
    print hint;
}

您可以在Dafny FAQ中阅读有关Dafny的模块化验证,不完整性和数量触发器的更多信息。