我有以下程序,它将字符串转换为布尔公式(string_to_formula
),我在其中定义expr_vector b(c)
。此代码有效,但我无法推断context
。 context
的功能是什么?我们有什么方法可以只定义一次变量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;
}
答案 0 :(得分:3)
context
对象与多线程程序相关。
每个执行线程可以具有其自己的上下文,并且可以在不使用任何形式的同步(例如,互斥)的情况下访问它们。
每个表达式都属于一个上下文。我们不能在两个不同的上下文中使用相同的表达式,但我们可以将它们从一个上下文复制到另一个上下文。
在Z3中,表达式最大程度地共享。例如,如果我们有(f T T)
这样的表达式,其中T
是一个重要的术语,那么内部Z3只有T
的一个副本。为了实现此功能,我们使用哈希表。哈希表存储在context
中。
如果我们在两个不同的执行线程中使用相同的context
C
,由于竞争条件更新C
,Z3可能会崩溃。
如果您的程序只有一个执行线程,则可以通过使用全局变量来避免“移动”上下文。
上下文/经理的想法出现在许多图书馆中。例如,在CUDD(BDD库)中,它们具有DdManager
。在脚本语言Lua中,他们有一个lua_State
。这些都是同一想法的实例。