达芙妮另一种调用情况可​​能违反上下文的Modifys子句

时间:2019-06-25 08:01:46

标签: dafny

我在此处和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();
}

1 个答案:

答案 0 :(得分:1)

您缺少后置条件

ensures f == f'

关于类Solver的构造函数。

(由于构造函数是方法,因此Dafny在推理其他方法时不会“查看”其主体,因此您需要此后置条件来公开主体。)