Z3 C-API获取没有约束的const的值

时间:2014-06-27 17:17:16

标签: c z3

我正在使用Z3的C API进行项目,并且我尝试使用枚举排序来将常量限制为一组有限值。

现在的问题是,只要没有为它定义约束,我就不会得到这个常量的值。但是,此时我已经需要返回一个值,并且我想知道如何实现这一点。

  • 是否存在可以强制将值分配给常量的约束?
  • 使用在线评估器,我可以通过执行以下操作强制Z3返回一个值:

    (echo "starting Z3...")
    (declare-datatypes () ((S A B C)))
    (declare-const a S)
    (check-sat)
    (get-value (a))
    

但是我似乎无法使用C-API。我已经尝试了以下内容:

  • 将创建const的ast放入求解器中并获取模型。这给了我一个非法的参数错误。
  • 尝试从求解器中获取模型而不设置任何断言会给我一个无效的使用错误

还有什么想法吗?我想我只是错过了什么。

1 个答案:

答案 0 :(得分:1)

以下代码段适用于我:

using namespace z3;
void main() {
  context ctx;
  func_decl_vector cs(ctx);
  func_decl_vector ts(ctx);
  char const* abc[3] = {"A","B","C"};
  sort s = ctx.enumeration_sort("S", 3, abc, cs, ts);
  expr a = ctx.constant("a", s);
  solver so(ctx);
  so.check();
  expr b = so.get_model().eval(a, true);
  std::cout << b << "\n";
}

请注意,我传入了值&#34; true&#34;进入eval的第二个参数。 这使评估人员能够完成&#34;即使没有价值,模型也是如此 为&#39; a&#39;创建在检查可满足性时(没有任何断言的求解器状态)。 模型完成默认为&#34; false&#34;。