この例で、戻り値が 0 (配列に 8 がない場合) または 1 (配列に 8 がある場合) になることを証明しようとしています。
int fi8(int *array, int size) {
int fi8 = 0;
int i = 0;
for(i = 0; i < length; ++i)
{
if(array[i] == 8)
fi8 = 1;
}
return fi8;
}
そして、事前条件と事後条件を作成しました。
/*@ requires 0 <= size <= 100;
@ requires \valid(array+(0..size-1));
@ assigns \nothing;
@ ensures (\forall integer i; 0<= i < size && array[i] != 8) ==> (\result == 0);
@ ensures (\exists integer i; (0<= i < size && array[i] == 8)) && (\result == 1);
@*/
Frama-C は Hoare Logic に基づいているため、ループ不変条件:
/*@ loop invariant 0 <= i <= length;
@ loop invariant fi8 == 0 || fi8 == 1;
@ loop invariant (\forall integer i; 0<= i < size && array[i] != 8)
==> (fi8 == 0);
@ loop invariant (\exists integer i; (0<= i < size && array[i] == 8))
&& (fi8 == 1);
@ loop assigns i, fi8;
@*/
forall を使用しようとしていて、存在する行に何かが欠けていると確信しています。配列に値が割り当てられているかどうかを正しく確認する方法を理解するために何時間も費やしていますが、ここで立ち往生しているように感じます。私は本当にあなたの助けに感謝します:)