我是Dafny的初学者,我想知道为什么违反了Main方法中打印之前的断言。我试图找到应该在其中插入项目的最右边的索引,以保留顺序(在此特定情况下为4)。
https://rise4fun.com/Dafny/4lR2
public synchronized void deleteObserver(Observer o) {
obs.removeElement(o);
}
答案 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的模块化验证,不完整性和数量触发器的更多信息。