为什么在Dafny函数中使用new会出错?

时间:2016-04-14 07:26:50

标签: dafny

我想知道为什么我收到以下程序的错误:

class KV 
{
  var key : int;
  var value : int;
  constructor (k: int, v: int) modifies this
  {
    this.key := k;
    this.value := v;
  }
}

function foo () : KV
{
   new KV(0,0)
}

当我跑步时,我得到了invalid UnaryExpression

1 个答案:

答案 0 :(得分:2)

在达菲尼function中是纯洁的。它们可以依赖于堆,通过给出reads子句。但它们不能有副作用 - 它们无法修改堆。由于函数foo具有零参数且没有reads子句,因此每次调用它时都必须返回相同的值。内存分配运算符new每次调用时都会给出不同的值,因此不能在函数中使用。

默认情况下,注意Dafny函数为ghost也很重要。它们在运行时不可执行。而是在编译的验证阶段使用它们。如果您想要非重影功能,则必须写function method而不是function

您可以在new内使用method。方法是必要的程序,不需要纯粹。

class KV 
{
  var key : int;
  var value : int;
  constructor (k: int, v: int) modifies this
  {
    this.key := k;
    this.value := v;
  }
}

method foo () returns (kv:KV)
{
   kv := new KV(0,0);
}