Dafny中的琐碎断言违规

时间:2018-05-15 20:44:46

标签: dafny

为什么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);

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