为什么Dafny声称这个简单的断言可能会被违反?
var b := new int[2];
b[0],b[1] := 1, -2;
assert exists k | 0 <= k < b.Length :: (b[k] == 1 || b[k] == -1);
答案 0 :(得分:0)
这与Dafny处理存在量词的方式有关。它(几乎)永远不会猜测&#34;适合你的价值。相反,Dafny使用句法启发式(称为&#34;触发器&#34;)来尝试来自上下文的某些值。
在您的断言中,触发器为b[k]
,这意味着Dafny将仅尝试k
的值,以便明确提及表达式b[k]
。
因此,解决断言的一种方法是通过添加断言明确提及k
的正确值
assert b[0] == 1;
甚至
assert b[0] == 1 || b[0] == -1
这与this question有些相关。
有关触发器的更多信息,请参阅this answer。