在C ++ API中使用上下文

时间:2013-11-20 02:54:40

标签: z3

我有以下程序,它将字符串转换为布尔公式(string_to_formula),我在其中定义expr_vector b(c)。此代码有效,但我无法推断contextcontext的功能是什么?我们有什么方法可以只定义一次变量b吗?为什么我们需要将context发送给函数?这段代码可以用更简洁的方式编写吗?

int main() { try {

  context c;
  expr form(c);
  form  = string_to_formula("x1x00xx011",c);
  expr form1(c);
  form1  = string_to_formula("1100x1x0",c);

  solver s(c);
  s.add(form && form1);
  s.check();
  model m = s.get_model();
  cout << m << "\n";
} 

expr string_to_formula(string str, context& c )
{
 expr_vector b(c) ;
 for ( unsigned i = 0; i < str.length(); i++)
 { stringstream b_name;
   b_name << "b_" << i;
   b.push_back(c.bool_const(b_name.str().c_str()));
  }

 expr formula(c);
 formula = c.bool_val(true);
 for( unsigned i = 0 ; i < str.length() ; ++i )
 {  char element = str.at(i) ;
    if ( element == '1' )
       formula = formula && ( b[i] == c.bool_val(true) ) ;
    else if ( element == '0' )
        formula = formula && ( b[i] == c.bool_val(false) ) ;
    else if ( element == 'x' )
        continue;
 }
 return formula;
}

1 个答案:

答案 0 :(得分:3)

context对象与多线程程序相关。 每个执行线程可以具有其自己的上下文,并且可以在不使用任何形式的同步(例如,互斥)的情况下访问它们。 每个表达式都属于一个上下文。我们不能在两个不同的上下文中使用相同的表达式,但我们可以将它们从一个上下文复制到另一个上下文。

在Z3中,表达式最大程度地共享。例如,如果我们有(f T T)这样的表达式,其中T是一个重要的术语,那么内部Z3只有T的一个副本。为了实现此功能,我们使用哈希表。哈希表存储在context中。 如果我们在两个不同的执行线程中使用相同的context C,由于竞争条件更新C,Z3可能会崩溃。

如果您的程序只有一个执行线程,则可以通过使用全局变量来避免“移动”上下文。

上下文/经理的想法出现在许多图书馆中。例如,在CUDD(BDD库)中,它们具有DdManager。在脚本语言Lua中,他们有一个lua_State。这些都是同一想法的实例。