在Z3中创建可变宽度的遮罩约束

时间:2019-06-24 11:00:07

标签: z3 smt

我想在位向量(X)上创建一个约束,该约束将另一个位向量屏蔽为其n最低有效位。我希望这样做尽可能高效。到目前为止,我尝试将第二个位向量表示为:1<<n - 1,其中n是另一个位向量。这给了我两个问题:

  • 首先,它大大降低了求解器的速度
  • 第二,可能与第一有关,我无法将n的宽度设置为小于X的宽度。如果我这样做,它将失败,并在n上出现类型错误。

有什么想法可以更有效地解决这一问题,或者解决宽度问题?

1 个答案:

答案 0 :(得分:1)

不清楚您要做什么,发布实际代码总是更有帮助。但是,根据您的描述,您可以简单地先左移然后再右移。这将从底部推0,然后将其放下;确保位向量剩余的n位最少。您移位的数量应等于bitsize - n,其中bitsize是位向量的长度,而n是您要保留多少个最低有效位。假设您正在处理64位向量,则它看起来像:

(declare-const n (_ BitVec 64))
(declare-const x (_ BitVec 64))
(define-fun amnt () (_ BitVec 64) (bvsub #x0000000000000040 n))
(define-fun maskedX () (_ BitVec 64) (bvlshr (bvshl x amnt) amnt))

(常数#x0000000000000040是您如何在SMT-lib中将64作为64位位向量常数编写的。)请注意,这隐式假定n最多为64:如果那不是真的,那么减法将回绕,您将获得不同的约束。我假设您的系统中已经有一个约束,说n最多是您要处理的位向量大小。

关于效率:确实没有明显的方法来使像这样的位向量约束快速或缓慢:它实际上取决于周围的其他约束。因此,不可能不知道这是否是实现您想要的最佳方法而又不了解您的问题的其他任何方法。当存在符号值时,考虑SMTLib中的“速度”通常是无济于事的,有太多因素影响求解器的效率。

关于类型:SMTLib基于非常简单的一阶类型系统。所以,是的:几乎所有位向量操作都必须具有与参数完全相同的大小。这是设计使然:可变长度位向量在逻辑上根本不可用,因为它会使公式变得无用,因为公式的可满足性取决于实例化它们的实际位大小。

如果这没有帮助,建议您发布一个实际的代码片段,其中包含您要执行的操作和遇到的问题。示例越具体,效果越好。