Dafny意外断言违规

时间:2018-06-14 08:39:16

标签: dafny

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

}

1 个答案:

答案 0 :(得分:1)

如果f包含重复值,则断言不正确。例如,考虑地图

var f := map[1 := 0, 2 := 0];

满足

assert f.Values == {0};

现在通过将键1设置为值7来生成更新的地图,

var f' := f[1 := 7];

然后f'[1] == 7f'[2] == 0f'满足

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