В настоящее время я пытаюсь немного понять официальную проверку с помощью KeY инструмент для Java-программ.
Вот мой код Java с ключевыми аннотациями:
public class Test {
public int[] a;
/*@ public normal_behavior
@ ensures (\forall int x; 0<=x && x<a.length; a[x]==1);
@*/
public void fillArray() {
int i = 0;
while(i < a.length) {
a[i] = 1;
i++;
}
}
}
К моему удивлению, KeY не смог доказать, что текущая программа действительна в соответствии с ее спецификацией. KeY не достигает цели 54. В окне текущей цели отображается:
self.a.<created> = TRUE,
wellFormed(heap),
self.<created> = TRUE,
Test::exactInstance(self) = TRUE,
measuredByEmpty
==>
self.a = null,
self = null,
{exc:=null || i:=0}
\<{
try {
method-frame(source=fillArray()@Test, this=self)
: {
while (i<this.a.length) {
this.a[i] = 1;
i++;
}
}
}
catch (java.lang.Throwable e) {
exc = e;
}
}\> (\forall int x; (x <= -1 | x >= self.a.length | self.a[x] = 1) & self.<inv> & exc = null)
Я действительно не понимаю: в чем основная причина невозможности доказать спецификацию?