达夫尼。另一种调用可能会违反上下文的修改子句

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" 它们的主体,所以你需要这个后置条件来暴露主体。)