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)
。