Class Dafny-从Main调用类方法后的断言冲突
我正在为一个类编写一些简单的代码,该类将棒球跑步初始化为0。它的唯一方法应该以运行次数作为参数,并根据输入是否大于类变量和int以及两次运行中的较高值返回bool,如下所示:Class Dafny-从Main调用类方法后的断言冲突,class,assert,dafny,post-conditions,Class,Assert,Dafny,Post Conditions,我正在为一个类编写一些简单的代码,该类将棒球跑步初始化为0。它的唯一方法应该以运行次数作为参数,并根据输入是否大于类变量和int以及两次运行中的较高值返回bool,如下所示: class Baseball_Runs { var runs : int; constructor() ensures runs == 0; { runs := 0; } method m
class Baseball_Runs
{
var runs : int;
constructor()
ensures runs == 0;
{
runs := 0;
}
method moreRuns (val: int) returns (hasChanged: bool, newRuns: int)
requires val >= 0;
ensures (val > runs) ==> (hasChanged && newRuns == runs);
ensures (!hasChanged && newRuns == val) ==> (val <= runs);
// ensures if (val > runs) then (hasChanged && newRuns == val) else (!hasChanged && newRuns == runs);
modifies this;
{
if (val > runs)
{
hasChanged := true;
runs := val;
newRuns := val;
} else {
hasChanged := false;
newRuns := runs;
}
}
}
method Main()
{
var r := new Baseball_Runs();
var new_run: int := 0;
var hasChanged: bool := false;
var score: int;
score := 2;
hasChanged, new_run := r.moreRuns(score);
assert (hasChanged && new_run == 2); // I get an assertion error here
}
职业棒球赛
{
变量:int;
构造函数()
确保运行==0;
{
运行次数:=0;
}
方法morerRuns(val:int)返回(hasChanged:bool,newRuns:int)
要求val>=0;
确保(val>runs)=>(hasChanged&&newRuns==runs);
确保(!hasChanged&&newRuns==val)=>(val-runs)然后(hasChanged&&newRuns==val)其他(!hasChanged&&newRuns==runs);
修改这个;
{
如果(val>运行)
{
hasChanged:=真;
运行次数:=val;
newRuns:=val;
}否则{
hasChanged:=假;
新运行次数:=运行次数;
}
}
}
方法Main()
{
var r:=新的棒球跑步();
var new_run:int:=0;
变量已更改:bool:=false;
var评分:int;
得分:=2分;
已更改,新运行:=r.moreRuns(分数);
assert(hasChanged&&new_run==2);//我在这里得到一个断言错误
}
我注释掉了第3个确保块,因为这是我第一次尝试post条件,但它返回了一个错误,因为post条件(else块)不成立,所以我使用了前2个确保块(不确定它是否正确,但整个类验证没有错误)
无论如何,我遇到的问题来自于我从main调用morerRuns()时。我对返回的bool和int的断言似乎不成立。有人知道我哪里出错了吗?是我的post条件,还是我在调用moreRuns()之前忘记添加一些断言,还是我没有考虑val==runs的选项
任何提示都将不胜感激 在post条件下,您需要小心比较的是
的哪个值。在修改运行时
要与旧的(运行)
进行比较
以下版本的moreRuns
有效:
method moreRuns (val: int) returns (hasChanged: bool, newRuns: int)
modifies this
requires val >= 0
ensures
if val > old(runs)
then newRuns == val && hasChanged
else newRuns == old(runs) && !hasChanged
{
if (val > runs) {
hasChanged := true;
runs := val;
newRuns := val;
} else {
hasChanged := false;
newRuns := runs;
}
}
您不需要用分号结束修改
/要求
/确保
子句。谢谢,您知道为什么在我第二次调用moreRuns()时,断言不成立吗?不管怎样,我必须分别“确保”所需的post条件语句(score==val)和(score==old(score))。