评估数组表达式

时间:2012-02-09 11:12:51

标签: arrays z3

我正在使用Z3-3.2的c-api(在linux上)解决QF_AUFBV问题。

如果公式是可满足的,我想从模型中读出自由数组变量的值。

我尝试了以下代码的内容,我想知道如何做到这一点的一般想法是正确的:

void evaluate(Z3_context context, Z3_model model, Z3_ast array)
{
  Z3_ast value;
  Z3_bool success = Z3_eval(context, model, array, &value);
  if (success) {
    unsigned num_entries;
    if (Z3_is_array_value(context, model, value, &num_entries)) {
      Z3_ast indices[num_entries];
      Z3_ast values[num_entries];
      Z3_ast def;
      Z3_get_array_value(context, model, array, num_entries, indices, values, &def);

      // do something with indices, values, and def
    }
  }
}

输入Z3_ast数组肯定是一个自由数组表达式。 Z3_eval返回true,所以我们似乎已经成功计算了表达式,但是Z3_is_array_value返回false。我原本期望数组表达式上成功的Z3_eval的结果是一个数组值,那为什么不是这样呢?

顺便说一句:我们通过遍历所有model_func_decls并尝试通过比较它们的get_symbol_string来找到该数组的正确信息,从而设法获得所需的信息。所以这些信息似乎可以在Z3的某个地方找到,但这几乎不算是一个很好的解决方案。

感谢您提供任何帮助。

祝你好运,  弗洛里安

1 个答案:

答案 0 :(得分:0)

评估程序比访问数组值的API更强大。 仅当表示的数组是表单时,函数is_array_value才会成功 (商店(商店(商店(...(const v)......)..)..)) 或者是as-array [f]形式,其中f是有限一元函数。

可以使用现有API实现is_array_value和get_array_value函数 并为方便起见 (正如你所描述的那样,除了我们可以避免使用字符串比较而是使用比较 枚举排序的函数声明)。 所以听起来我们可以在你的情况下支持更多,我很好奇模型的价值 好像。您是否能够提供有关未通过的示例的其他信息? (打印出来?)

由于