要求在 a 中断言 a[0]

Requiring to assert a[0] in a

我目前正在学习 dafny 和 运行 一个非常奇怪的断言要求:

method M (a : seq<int>, acc : seq<int>) 
  requires |a| > 0
  requires forall va, vacc :: va in a && vacc in acc ==> vacc <= va
{
  assert forall vacc :: vacc in acc ==> vacc <= a[0];
}

上面的代码在断言上失败了,但是如果我添加 assert a[0] in a 它验证了?

为什么会这样,肯定在所有情况下 |a| > 0 a[0] in a 成立,因为 seq 是不可变的?

(如果有任何风格指南建议,我们将不胜感激 :))

这与“触发器”有关。

简短的回答是,除非您手动“提及”a[0],否则 Dafny 将无法利用量化的 requires 子句。 你如何提到a[0]并不重要,重要的是你提到它。这就是为什么您的琐碎断言即使在逻辑上似乎没有添加任何内容也能起作用的原因:这只是因为它提到 a[0].

有关详细信息,请参阅:

  • FAQ qustion
  • “什么是触发器?”
  • this answer 关于“找不到触发条件”