Class Dafny-从Main调用类方法后的断言冲突

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

我正在为一个类编写一些简单的代码,该类将棒球跑步初始化为0。它的唯一方法应该以运行次数作为参数,并根据输入是否大于类变量和int以及两次运行中的较高值返回bool,如下所示:

    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))。