[英]Combine boolean and integer logic in linear arithmetic using the Z3 Solver?
我想解决将线性算术中的布尔和整数逻辑与 SAT/SMT 求解器相结合的问题。 乍一看,Z3 似乎很有前途。
首先,是否有可能解决以下问题? 这个答案使它看起来有效。
int x,y,z
boolean a,b,c
( (3x + y - 2z >= 10) OR (A AND (NOT B OR C)) OR ((A == C) AND (x + y >= 5)) )
如果是这样, Z3在理论上是如何解决这类问题的,是否有相关文档? 我可以想出两种方法来解决这个问题。 一种是将布尔运算转换为线性整数表达式。 我读到的另一个解决方案是使用[Kro 08]中描述的 Nelson-Oppen 组合方法。
我在第3.2.2 章找到了相应的文档。 求解算术片段,表 1列出了特定逻辑的已实现算法。
是的,SMT 求解器非常擅长解决这类问题。 您的问题可以使用 z3 的 Python 接口来表达,如下所示:
from z3 import *
x, y, z = Ints('x y z')
A, B, C = Bools('A B C')
solve (Or(3*x + y - 2*z >= 10
, And(A, Or(Not(B), C))
, And(A == C, x + y >= 5)))
这打印:
[A = True, z = 3, y = 0, B = True, C = True, x = 5]
为您提供满足您的约束的(不一定是“the”)模型。
SMT 求解器可以处理整数、机器字(即位向量)、实数以及许多其他数据类型,并且有用于线性整数算术、布尔、未解释函数、位向量组合的有效程序好多其它的。
请参阅http://smtlib.cs.uiowa.edu以获取有关 SMT 求解的许多资源,包括对其他工作的引用。 任何给定的求解器(即 z3、yices、cvc 等)都将是各种算法、启发式和策略的集合。 很难直接比较它们,因为每个子逻辑都以自己的方式发光,但对于线性整数算术、布尔值和位向量的基本集,它们应该都表现得相当好。 看起来您已经找到了一些很好的参考资料,因此您可以根据需要进行进一步阅读; 尽管对于大多数最终用户来说,了解 SMT 求解器内部的工作原理既没有必要也没有那么重要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.