我在此处和Wiki上都阅读了很多与此有关的问题,但是我无法解决这种“调用可能违反上下文的Modifys子句”的情况。你可以帮帮我吗?我试图将问题的一个实例从main方法发送到“求解器”,当我调用solve()
方法时,出现此错误,并且我不明白为什么。 https://rise4fun.com/Dafny/53q6
class Stack {
var x : array<int>;
constructor()
ensures fresh(x);
{
x := new int[10];
}
}
class Formula {
var stack : Stack;
constructor()
ensures fresh(stack);
ensures fresh(stack.x);
{
stack := new Stack();
}
}
class Solver {
var f : Formula;
constructor(f' : Formula)
{
this.f := f';
}
method solve()
modifies f.stack;
ensures old(f.stack.x) == f.stack.x;
{}
}
method Main() {
var f := new Formula();
var a := new Solver(f);
assert fresh(f);
assert fresh(f.stack);
assert fresh(f.stack.x);
assert fresh(a);
a.solve();
}
答案 0 :(得分:1)
您缺少后置条件
ensures f == f'
关于类Solver
的构造函数。
(由于构造函数是方法,因此Dafny在推理其他方法时不会“查看”其主体,因此您需要此后置条件来公开主体。)