Z3:Z3可以告诉我算术运算是否返回具体值?

时间:2013-04-14 14:38:14

标签: python z3

我有一个简单的代码如下:

a, b, c = BitVecs('a b c', 32)
a == b + c
c == b + 5

我们可以很容易地看到(c - b)返回一个具体的值(数字5),但是(a - b)返回一些抽象的东西(因为a - b == c,它具有未知值)。

问题是:给定一个类似于上述情况的算术运算,Z3能否告诉我们结果是否具体?如果可以的话,怎么做?

非常感谢。

2 个答案:

答案 0 :(得分:1)

Z3是一个定理证明器,但我们也可以将其视为约束求解器。我们可以将a == b + c等表达式视为约束。 Z3 Python接口有一个名为solve的命令。它试图解决一组约束。它,它试图找到一个将使所有约束成立的“赋值”。例如,如果我们执行以下命令(也可用here)。

a, b, c = BitVecs('a b c', 32)
solve(a == b + c, c == b + 5)

它产生了解决方案:

[b = 0, a = 5, c = 5]

我们说解决方案“满足”约束。 Z3还有其他几个命令和API。 有关Z3的更多信息,请参阅online tutorial

答案 1 :(得分:0)

即使我发现这个问题很旧。我想发布我的解决方案,以了解z3中是否有具体的价值。

以下方法通过测试位向量是否始终具有具体值(始终等于或不等于具体值)来测试其是否具有具体值。在调用is_trueis_false之前,“简化”是必需的。

bool is_concrete_byte(z3::expr byte) {

    z3::expr zero = context.bv_const(0, 8);

    return (zero == byte).simplify().is_true() ||
            (zero == byte).simplify().is_false();

}