【发布时间】:2021-08-22 20:32:14
【问题描述】:
示例代码似乎是人为的,因为它是我能找到的用于说明我的问题的最小代码。
datatype Twee = Node(value : int, left : Twee, right : Twee) | Empty
method containsI(t : Twee, s : int) returns (r : bool)
{
var working :Twee := t;
if (working.Node?) {
r:= (working.value == s);
assert r==true ==> (working.value == s);
while working.Node?
decreases working
invariant r==true ==> (working.value == s)
{ //assert r==true ==> (working.value == s);
r:=false;
working:= working.right;
assert r==true ==> (working.value == s);
}
}
r:=false;
assert r==true ==> (working.value == s);
}
Dafny 在不变量中抱怨 working.value。声明它只能在工作是Node 事件时应用,尽管当不变量被注释掉时,Dafny 报告没有问题。因此,Dafny 似乎知道工作是Node。
非常感谢任何对我的理解的更正。
【问题讨论】:
标签: dafny loop-invariant