Optimization 优化Z3中的有符号位向量

Optimization 优化Z3中的有符号位向量,optimization,z3,smt,Optimization,Z3,Smt,我正在尝试优化Z3中由位向量组成的表达式(代码在例如中运行): 我得到的结果是: sat (objectives (x 4294967295) ) 这是32位的最大整数0xffffffff,其符号为-1。但是,我希望得到签名的最大值,即7。在Z3中有没有办法做到这一点(除了使用不同的约束(即b&b)多次调用Z3之外,如中所示)?有人知道有其他解算器(最好使用smtlibv2输入)可以这样做吗?SMT中的所有位向量都是无符号的,但是有一些特殊的比较运算符,如bvslt,具有符号语义。您可以添

我正在尝试优化Z3中由位向量组成的表达式(代码在例如中运行):

我得到的结果是:

sat
(objectives
  (x 4294967295)
)

这是32位的最大整数0xffffffff,其符号为-1。但是,我希望得到签名的最大值,即7。在Z3中有没有办法做到这一点(除了使用不同的约束(即b&b)多次调用Z3之外,如中所示)?有人知道有其他解算器(最好使用smtlibv2输入)可以这样做吗?

SMT中的所有位向量都是无符号的,但是有一些特殊的比较运算符,如
bvslt
,具有符号语义。您可以添加另一个约束以强制执行
x
为正:

(assert (bvslt #x00000000 x))
然后生成预期结果(7)

另一种方法是将数字上移2^n-1(或翻转第一位),然后进入目标函数:

(declare-const x (_ BitVec 32))
(assert (bvslt x #x00000008))
(maximize (bvadd x #x80000000))
(check-sat)
(get-objectives)
(get-value (x))


SMT中的所有位向量都是无符号的,但是有一些特殊的比较运算符,如
bvslt
,具有符号语义。您可以添加另一个约束以强制执行
x
为正:

(assert (bvslt #x00000000 x))
然后生成预期结果(7)

另一种方法是将数字上移2^n-1(或翻转第一位),然后进入目标函数:

(declare-const x (_ BitVec 32))
(assert (bvslt x #x00000008))
(maximize (bvadd x #x80000000))
(check-sat)
(get-objectives)
(get-value (x))


根据我的经验,最简单的方法是适当地将数字上移。也就是说,最大化(或最小化)n位有符号位向量
x
相当于对n位无符号位向量
x
+2n执行相同的操作− 1.也就是说,在调用maximize或minimize之前,将2n-1添加到您试图优化的数量,从而使原始值超出范围[−2n− 1,2n− 1) 而不是优化器将看到的[0,2n]


你可以在2017年的z3 github跟踪器中看到同样的讨论:

根据我的经验,最简单的方法是适当地将数字上移。也就是说,最大化(或最小化)n位有符号位向量
x
相当于对n位无符号位向量
x
+2n做同样的事情− 1.也就是说,在调用maximize或minimize之前,将2n-1添加到您试图优化的金额中,从而使原始值超出范围[−2n− 1,2n− 1) 而不是优化器将看到的[0,2n]


你可以在2017年的z3 github tracker中看到同样的讨论:

谢谢你的回答!我想我会的。谢谢你的回答!我想我会的。