为什么Dafny无法证明这一点?
method Main() {
assert forall f:map<string,int>, x:string, v:int :: x in f.Keys ==> f.Values-
{f[x]} + {v} == (f[x:=v]).Values;
}
答案 0 :(得分:1)
如果f
包含重复值,则断言不正确。例如,考虑地图
var f := map[1 := 0, 2 := 0];
满足
assert f.Values == {0};
现在通过将键1设置为值7来生成更新的地图,
var f' := f[1 := 7];
然后f'[1] == 7
和f'[2] == 0
,f'
满足
assert f'.Values == {0, 7};
但你的断言意味着f'.Values == {0}
,这是错误的。
对于你在评论中提到的第二个问题,断言是正确的,但是由于触发问题,Dafny无法证明这一点。您可以说服Dafny通过说
来证明这一点var f' := f[x:=v]; // give updated map a name for convenience
assert f'[x] in f'.Values; // triggers axiom about .Values
assert v in f'.Values; // now this verifies
有关触发器的详细信息,请参阅FAQ。您可能还有兴趣阅读.Values
基本操作的axiomatic definition。