【发布时间】:2020-12-27 05:45:42
【问题描述】:
I am used to loops
while Grd
invariant Inv
{ ..}
assert Inv && !Grd;
Dafny 毫不犹豫地知道 Inv && ! Grd 是真的,但是:
Dafny 不会在 break; 命令之后检查循环不变量。因此
method tester(s:seq<int>) returns (r:int)
ensures r <= 0
{ var i:nat := |s|;
r := 0;
while (i > 0)
decreases i
invariant r == 0;
{ i := i -1;
if s[i]< 0 { r:= s[i]; break;}
}
// assert r == 0; // invariant dose not hold
}
method Main() {
var x:int := tester([1,-9,0]);
print x,"\n";
}
显然,Dafny 明白不变量不再成立。谁能告诉我 dafny 到底知道什么。
【问题讨论】: