Dafny では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);
}