繁体   English   中英

使用 Z3 Solver 在线性算术中结合布尔和整数逻辑?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM