我正在使用z3 C ++ API。如果我创建这个简单的虚假表达式:
z3::expr x = C->int_const("x");
z3::expr p = z3::forall(x, x==0);
并尝试解决,我得到一个未知的结果。我不是策略和战术的专家,但我确信如果我使用正确的策略,z3可以解决这个问题。
我也试过
z3::expr p = !z3::forall(x, x==0);
当然,还有同样的知名度。
答案 0 :(得分:0)
我不熟悉z3,但从一般的C ++角度来看,不会x==0
先评估,即不会使您的调用等同于implies(x, 1)
?从快速搜索看,您可能必须将语句的每个部分构造为z3对象,例如:
Z3_ast consequent = Z3_mk_eq(ctx, x, 0);
Z3_ast theorem = Z3_mk_implies(ctx, x, consequent);
但上述情况也不正确。我相信参数x
和0
本身必须是Z3_ast
的实例,它们封装了您的意思(与其插值或引用相对)。