私は次のzaMapを持っています(ここで完全なコードを参照してください: http://rise4fun.com/Dafny/LCaM ):
class zaMap {
var busybits :array<bool>;
var keys : array<int>;
var values : array<int>;
predicate wellformed ()
reads busybits, keys, values, this
{
busybits != null && keys != null && values != null &&
keys != values &&
busybits.Length == keys.Length &&
keys.Length == values.Length
}
// ... more predicates and methods follow
method put(k : int, v : int) returns (success : bool)
requires wellformed()
modifies busybits, keys, values
ensures !success ==> full()
ensures success ==> mapsto(k, v)
{
var i := findEmpty();
if (i < 0)
{
success := false;
return;
}
assert !busybits[i];
busybits[i] := true;
keys[i] := k;
values[i] := v;
success := true;
}
//...
put
ここで、メソッドにさらに仕様を追加したいと思います。たとえばensure
、戻り値が の場合、関数呼び出しの前にsuccess == true
マップがあったこと、または同等にマップが でない場合、そこに保証されることを望みます。!full()
full()
put
問題は、前提条件「必須」では何が返されるかまだわからず、事後条件「保証」では元のマップがもうないことです。人々はそれについて何をしますか?