我试图证明数组的量化断言并遇到一些问题。考虑以下小程序:
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;
}
我正在使用'Typed'内存模型:
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持有但存在不存在。只有在我之前添加断言“p [1] == 3”时才存在。缺少什么来证明这种存在性数组属性?我需要这个来表示数组条目的搜索循环的循环不变量。
谢谢,哈拉尔德
答案 0 :(得分:3)
通过不正确的简化将“要求”转换为假。它将在下一个版本中得到纠正。感谢您发现错误。
通过修复,Alt-ergo仍未证明最后一个断言,因为它无法使用其通常的启发式方法找到我的见证。当您添加断言“p [1] == 3”时,您会给出证人,这就是为什么它更容易证明。其他一些证明者(Z3,CVC4)将能够直接证明这一特定断言。请继续关注下一个版本。