z3 bitvector 操作简化答案

z3 bitvector operation simplified answer

在执行位向量操作时,是否有更简单的方法来立即获得答案,例如。 a = 100万, b = 0, 什么是a & b (answer: 0)

此方法有效但必须引入虚拟变量来存储答案:

(declare-const a (_ BitVec 64))
(declare-const b (_ BitVec 64))
(declare-const ans (_ BitVec 64))
(assert (= a (_ bv1000000 64)))
(assert (= b (_ bv0000000 64)))
(assert (= ans (bvand a b)))
(check-sat)
(get-model)

我想要这种方法,但我的代码给出了一个 demorgan 身份:

(declare-const a (_ BitVec 64))
(declare-const b (_ BitVec 64))
(simplify (bvand a b))

我没有测试,但是像 (apply (then propagate-values simplify)) 这样的东西应该可以解决问题

您可以使用该模型来评估任意表达式,例如:

(declare-const a (_ BitVec 64))
(declare-const b (_ BitVec 64))
(assert (= a (_ bv1000000 64)))
(assert (= b (_ bv0000000 64)))
(check-sat)
(eval (bvand a b))

sat
#x0000000000000000