假设我们有以下代码:
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'操作相同的变量?
答案 0 :(得分:4)
您似乎将主机语言C ++中存在的编程变量 x
和y
与逻辑变量 a
混淆和Z3理由的b
。 x
和y
都代表逻辑变量a
,并且通过向约束添加x && !y
,您可以为Z3提供事实a && !a
,这使您的约束不可满足。