z3是否按名称区分变量?

时间:2013-06-21 03:12:45

标签: z3

假设我们有以下代码:

context c;
solver s(c);
expr x=c.bool_const("a");
expr y=c.bool_const("a");
expr z=c.bool_const("b");
s.add(x&&!y);
std::cout<<s.check();
s.reset();
s.add(x&&!z);
std::cout<<s.check();

上述代码的执行结果是'不满意'; 结果表明z3将x和y视为相同的变量。 z3是否按名称区分变量? 如果我在不同的地方使用相同的变量,我可以编写如下代码:

context c;
solver(s);

function test1(){
   s.add(c.bool_const("a"));
}
function test2(){
   s.add(!c.bool_const("a"));
}

使用函数'test1'和'test2'操作相同的变量?

1 个答案:

答案 0 :(得分:4)

您似乎将主机语言C ++中存在的编程变量 xy逻辑变量 a混淆和Z3理由的bxy都代表逻辑变量a,并且通过向约束添加x && !y,您可以为Z3提供事实a && !a,这使您的约束不可满足。