Что означает "присваиваемый a, a[*];" имею в виду?
Я недавно прочитал следующий код JML в старом экзамене:
Class L {
/*@non_null*/ int[] a;
/*@ public normal_behaviour
@ requires !(\exists int i; 0 <= i && i < a.length; a[i] == d);
@ ensures a.length == \old(a.length) + 1;
@ ensures a[\old(a.length)] == d;
@ ensures (\forall int i; 0 <= i && i < \old(a.length);
a[i] == \old(a[i]));
@ assignable a, a[*];
@*/
public void st(int d) {
...
}
}
Я не понимаю
assignable a, a[*];
часть. Что значит a[*]
имею в виду? Что было бы иначе, если бы был только
assignable a;
?
(Ссылка на ссылку будет здорово.)
1 ответ
Назначаемое предложение в JML
позволяет только методу изменять местоположение loc, если:
- loc is mentioned in the method’s assignable clause;
- loc is not allocated when the method starts execution; or
- loc is local to the method (i.e., a local variable or a formal parameter)
Использование a[*]
это сокращение для [0 ... a.length-1];
¹