Python Z3:Z3能告诉我算术运算是否返回具体值吗?

Python Z3:Z3能告诉我算术运算是否返回具体值吗?,python,z3,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能告诉我们结果是具体的吗?如果这是可能的,如何做到这一点 非常感谢 Z3是一个定理证明器,但我们也可以将其视为约束求解器。我们可以将诸如a==b+c之类的表达式视为约束。Z3 Python

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

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

问题是:给定一个类似上述情况的算术运算,Z3能告诉我们结果是具体的吗?如果这是可能的,如何做到这一点


非常感谢

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

它产生了解决方案:

[b = 0, a = 5, c = 5]
我们说解决方案“满足”了约束条件。 Z3还有其他几个命令和API。
有关Z3的更多信息,请参见。

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

它产生了解决方案:

[b = 0, a = 5, c = 5]
我们说解决方案“满足”了约束条件。 Z3还有其他几个命令和API。
有关Z3的更多信息,请参阅。

,尽管我发现这个问题很旧。我想发布我的解决方案,看看z3中是否有具体的值

以下方法通过测试位向量始终等于或不等于具体值(零)来测试位向量是否具有具体值。在调用
is\u true
is\u false
之前,Simplify是“必需的”

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();

}

尽管我觉得这个问题很老。我想发布我的解决方案,看看z3中是否有具体的值

以下方法通过测试位向量始终等于或不等于具体值(零)来测试位向量是否具有具体值。在调用
is\u true
is\u false
之前,Simplify是“必需的”

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();

}

利奥,谢谢。实际上我想验证的是c是否总是具有相同的具体值5。我提出了一个简单的解决方案:找到一个c的模型,然后向解算器添加另一个约束(例如c!=5),以查看是否存在任何冲突。如果有,那么c总是有常量值5。是的,这就是方法。这就引出了另一个问题:我们如何使用Z3自动生成“相反”约束?例如,“c==5”的对立面是“c!=5”,或者“a>b”的对立面是“a”,我们可以使用
Not(c)
来创建一个Z3表达式,该表达式相当于
c
的对立面。例如:
Not(c==5)
Not(a>b)
.Leo,谢谢。实际上我想验证的是c是否总是具有相同的具体值5。我想出了一个简单的解决方案:找到c的模型,然后向解算器添加另一个约束(例如c!=5)查看是否存在冲突。如果存在冲突,则c始终具有常量值5。是的,这是执行此操作的方法。这就引出了另一个问题:我们如何使用Z3自动生成“反向”约束?对于ex,“c==5”的反向是“c!”5“,或“a>b”的对立面是“a我们可以使用
Not(c)
来创建Z3表达式,该表达式相当于
c
的对立面”。示例:
非(c==5)
非(a>b)