存在量化断言失败

时间:2012-12-23 13:47:51

标签: frama-c

我试图证明数组的量化断言并遇到一些问题。考虑以下小程序:

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”时才存在。缺少什么来证明这种存在性数组属性?我需要这个来表示数组条目的搜索循环的循环不变量。

谢谢,哈拉尔德

1 个答案:

答案 0 :(得分:3)

通过不正确的简化将“要求”转换为假。它将在下一个版本中得到纠正。感谢您发现错误。

通过修复,Alt-ergo仍未证明最后一个断言,因为它无法使用其通常的启发式方法找到我的见证。当您添加断言“p [1] == 3”时,您会给出证人,这就是为什么它更容易证明。其他一些证明者(Z3,CVC4)将能够直接证明这一特定断言。请继续关注下一个版本。