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
变量从线程返回。谢谢!