我有以下 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
存在。
问题是,在前置条件“需要”中我还不知道它会返回什么,而在后置条件中“确保”我不再有原始地图。人们对此怎么办?