达夫尼。另一种调用可能会违反上下文的修改子句
Dafny. Another case of call may violate context's modifies clause
我在这里和 wiki 上阅读了很多关于此的问题,但我无法解决这个 "call may violate context's modifies clause" 案例。你可以帮帮我吗?我试图从 main 方法将问题实例发送到 "solver",当我调用 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();
}
您缺少后置条件
ensures f == f'
关于 class Solver
.
的构造函数
(因为构造函数是方法,Dafny 在推理其他方法时不会 "look inside" 它们的主体,所以你需要这个后置条件来暴露主体。)
我在这里和 wiki 上阅读了很多关于此的问题,但我无法解决这个 "call may violate context's modifies clause" 案例。你可以帮帮我吗?我试图从 main 方法将问题实例发送到 "solver",当我调用 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();
}
您缺少后置条件
ensures f == f'
关于 class Solver
.
(因为构造函数是方法,Dafny 在推理其他方法时不会 "look inside" 它们的主体,所以你需要这个后置条件来暴露主体。)