是否有一种智能方法可以在Z3中定义有界整数?
例如,假设我要定义一个整数变量“x”,它可以取[1,4]中的值。我可以执行以下操作(我使用的是Java API)
<div>
然而,我想知道是否有更聪明的方法来做到这一点?在声明时可以自动在变量上设置上限/下限的东西。我来到了枚举,但我不确定这是否是最好的选择。
由于
答案 0 :(得分:2)
如果它们是2的幂,只需使用位向量。否则就没有简单的方法(即,你做得对)。
答案 1 :(得分:1)
不幸的是,没有一种“好”的方式来模拟这种约束。 Bitvectors走得很远,假设你对机器算术(即模块化)很好,你的范围非常合适,如前所述。以下是之前的相关讨论:Is there an UnsignedIntSort in Z3?。
为了正确支持你想要的东西,你需要谓词子类型。诸如PVS和旧版Yices(1.X系列中的预SMTLib变体)之类的定理证明支持这种类型,具有不同程度的自动化。如果您需要坚持使用现代SMT解算器,那么您不得不选择使用大量绑定约束来编写代码。当然,它可以非常快速地变得非常丑陋,因为你必须在每次操作后检查边界并定义它对上溢/下溢的意义。如果尊重边界是必要的,那么正确的定理证明者可能是更好的选择。