配列の定量化されたアサーションを証明しようとしていますが、いくつかの問題が発生しました。次の小さなプログラムを検討してください。
int a[4] = {1,2,3,4};
/*@ requires p == a;
assigns \nothing;
*/
void test(int *p)
{
p++;
//@ assert \forall int i; 0 <= i < 3 ==> p[i] < 10;
//@ assert \exists int i; p[i] == 3;
}
「型付き」メモリモデルを使用しています:
frama-c-gui -wp -wp-qed -wp-byreference -wp-model 'Typed' -main test Test.c
何らかの理由で「要求」が成り立たないため、1==2 であってもすべての主張を証明できます。これを克服するために、関数本体でグローバル変数を直接割り当てます。
int a[4] = {1,2,3,4};
/*@ assigns \nothing;
*/
void test(int *p)
{
p = a;
p++;
//@ assert \forall int i; 0 <= i < 3 ==> p[i] < 10;
//@ assert \exists int i; p[i] == 3;
}
ここで forall は成立しますが、exists は成立しません。存在は、アサーション「p[1] == 3」をその前に追加した場合にのみ保持されます。そのような存在する配列プロパティを証明するには何が欠けていますか? これは、配列エントリに対する検索ループのループ不変条件を表現するために必要です。
ありがとう、ハラルド