【发布时间】:2020-01-31 06:52:58
【问题描述】:
我正在检查某个键是否在数组中只出现一次(其中 b 是返回值),但是以下不变量表示它不是由循环维护的:
invariant b <==> exists j | 0 <= j < i :: a[j] == key && forall k | 0 <= k < i && j != k :: a[k] != key
循环继续如下
var i := 0;
b := false;
var keyCount := 0;
while i < a.Length
invariant 0 <= i <= a.Length
invariant b <==> exists j | 0 <= j < i :: a[j] == key && forall k | 0 <= k < i && j != k :: a[k] != key
{
if (a[i] == key)
{ keyCount := keyCount + 1; }
if (keyCount == 1)
{ b := true; }
else
{ b := false; }
i := i + 1;
}
逻辑对我来说似乎是正确的 - 有什么我遗漏的吗?
【问题讨论】:
标签: dafny