Z3 C+中上下文的使用+;美国石油学会
我有下面的程序,它将字符串转换成布尔公式(Z3 C+中上下文的使用+;美国石油学会,z3,Z3,我有下面的程序,它将字符串转换成布尔公式(string\u to\u formula),其中我定义了expr\u向量b(c)。这段代码是有效的,但我无法对上下文进行推理。上下文的功能是什么?有没有办法只定义一次变量b?为什么我们需要将上下文发送到函数?这段代码能以更简洁的方式编写吗 int main() { try { context c; expr form(c); form = string_to_formula("x1x00xx011",c); expr form1(c
string\u to\u formula
),其中我定义了expr\u向量b(c)
。这段代码是有效的,但我无法对上下文进行推理。上下文的功能是什么?有没有办法只定义一次变量b
?为什么我们需要将上下文
发送到函数?这段代码能以更简洁的方式编写吗
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;
}
int main(){try{
上下文c;
expr表格(c);
形式=字符串到公式(“x1x00xx011”,c);
expr form1(c);
form1=字符串到公式(“1100x1x0”,c);
s(c);
s、 添加(表格和表格1);
s、 检查();
模型m=s.get_模型();
cout上下文对象与多线程程序相关。
每个执行线程都可以有自己的上下文,并且可以在不使用任何形式的同步(例如互斥)的情况下访问它们。
每个表达式都属于一个上下文。我们不能在两个不同的上下文中使用同一个表达式,但我们可以将它们从一个上下文复制到另一个上下文
在Z3中,表达式被最大限度地共享。例如,如果我们有一个表达式,如(f T T)
,其中T
是一个大术语,那么Z3内部只有一个T
的副本。为了实现此功能,我们使用一个哈希表。哈希表存储在上下文中。
如果我们在两个不同的执行线程中使用相同的上下文
C
,那么Z3可能会由于竞争条件更新C
而崩溃
如果您的程序只有一个执行线程,则可以通过使用全局变量来避免“移动”上下文
上下文/管理器的概念存在于许多库中。例如,在(BDD库)中,它们有一个DdManager
。在脚本语言中,它们有一个lua_状态
。这些都是相同概念的实例。上下文
对象与多线程程序相关。
每个执行线程都可以有自己的上下文,并且可以在不使用任何形式的同步(例如互斥)的情况下访问它们。
每个表达式都属于一个上下文。我们不能在两个不同的上下文中使用同一个表达式,但我们可以将它们从一个上下文复制到另一个上下文
在Z3中,表达式被最大限度地共享。例如,如果我们有一个表达式,如(f T T)
,其中T
是一个大术语,那么Z3内部只有一个T
的副本。为了实现此功能,我们使用一个哈希表。哈希表存储在上下文中。
如果我们在两个不同的执行线程中使用相同的上下文
C
,那么Z3可能会由于竞争条件更新C
而崩溃
如果您的程序只有一个执行线程,则可以通过使用全局变量来避免“移动”上下文
上下文/管理器的思想存在于许多库中。例如,在(BDD库)中,它们有一个DdManager
。在脚本语言中,它们有一个lua_State
。这些都是相同想法的实例。感谢对上下文的详细描述。对于单线程程序,拥有一个全局上下文是非常有意义的。我还想知道您是否有多线程程序的示例,多个expr
变量作为参数传递给线程,多个expr
变量从线程返回。谢谢!感谢对上下文的详细描述。对于单线程程序,拥有一个全局上下文是很有意义的。我还想知道您是否有任何多线程的示例ded程序,其中多个expr
变量作为参数传递给线程,多个expr
变量从线程返回。谢谢!